feat(inference): LLM 客户端全异步化(T8 架构审查整改)
- Issue9: client.py 由同步 httpx.Client 全异步化 - LLMClient Protocol / HttpLLMClient.chat → async;httpx.AsyncClient + asyncio.sleep 退避 - __enter__/__exit__ → __aenter__/__aexit__(async with 生命周期闭环) - engine.py chat/chat_structured/_call 全部 async + await - FakeLLMClient.chat → async;测试用 anyio pytest 插件转换(engine 32 + client 10 用例) - 同步 inference-engine spec 与 milestone3 review 的 httpx 描述 - 全量 182 passed / 100.00%(987 stmts/252 br)
This commit is contained in:
@@ -21,7 +21,7 @@
|
||||
|
||||
## 3. 关键设计决策
|
||||
|
||||
1. **httpx 选型**:`httpx.Client(timeout=..., transport=...)` 支持 transport 注入(MockTransport 离线测试);5xx/网络错误指数退避重试(1s/3s/7s),超时→LLMTimeoutError,4xx 不重试→LLMNetworkError,2xx 结构损坏→LLMResponseError,3xx 不误判成功。
|
||||
1. **httpx 选型**:`httpx.AsyncClient(timeout=..., transport=...)` 支持 transport 注入(MockTransport 离线测试);5xx/网络错误指数退避重试(1s/3s/7s),超时→LLMTimeoutError,4xx 不重试→LLMNetworkError,2xx 结构损坏→LLMResponseError,3xx 不误判成功。(T8 整改后为异步 AsyncClient + asyncio.sleep 退避 + async with 生命周期)
|
||||
2. **结构化重试语义**:`chat_structured` 对 JSON 解析失败带错误信息重试(retry_count+1),重试成功仍为 `status="ok"`(fallback 语义保留给模型降级);最终失败返回 `parse_error` + raw_text,不抛异常(spec §3.4 验收 3)。
|
||||
3. **异常折叠边界**:`chat` 失败降级备用模型(status=fallback),双模型全败 status=failed;仅折叠 LLMError,非 LLM 异常照常冒出。
|
||||
4. **显式延后(非目标)**:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
- `implementation-plan.md` 阶段 1.6 要求「LLM Client 抽象化」;`agent-runtime-design.md` §2 将该抽象扩展为完整的推理引擎(统一 LLM 调用入口、降级、重试、Token 管理、Prompt 版本化)
|
||||
- 当前仓库**尚无任何 LLM 客户端实现**,4 个 Agent(Parser / Impact / Writer / QA)均等待推理引擎基盘
|
||||
- 技术选型已定:原生 HTTP(不使用 SDK 封装);HTTP 客户端选择 **httpx**(pyproject 新增依赖),同步 `Client` 与异步 `AsyncClient` 双支持,配合编排层 asyncio 任务池
|
||||
- 技术选型已定:原生 HTTP(不使用 SDK 封装);HTTP 客户端选择 **httpx**(pyproject 新增依赖),采用**异步 `AsyncClient`**(T8 架构审查整改:由同步 Client 全异步化,适配编排层 asyncio 任务池,退避用 asyncio.sleep,async with 生命周期闭环)
|
||||
|
||||
## 2. 目标
|
||||
|
||||
|
||||
Reference in New Issue
Block a user