描述
发生了什么:
当 .env 里配置 LANGCHAIN_PROVIDER=deepseek + LANGCHAIN_MODEL_NAME=deepseek-v4-flash 时,agent 的 llm.invoke() / llm.stream() 调用会卡 20 分钟以上(实测 llm.invoke("hi") 需要 1217.6 秒),而同一个 DeepSeek 端点的 HTTPS 直连只要 ~2 秒。Web UI 一直停在"智能体工作中…",而且前端 90 秒 SSE 超时被绕过——因为后台 30 秒一次的心跳会刷新 lastEventRef,导致 UI 永远不会自动恢复。
我期望:
agent 应该在几秒内响应(简单对话 2-3 秒,跟直连延迟一致),流式 text_delta 及时推过来,用户能看到进度。
复现步骤
- 配置
agent/.env:
LANGCHAIN_PROVIDER=deepseek
LANGCHAIN_MODEL_NAME=deepseek-v4-flash
DEEPSEEK_API_KEY=sk-...
DEEPSEEK_BASE_URL=https://api.deepseek.com
- 启动 API server:
vibe-trading serve --port 8899
- 打开 Web UI,新建会话
- 发任意消息(如"你好")
- 观察到状态卡在"智能体工作中…"超过 20 分钟
- 后端日志最终显示:
invoke() done in 1217.6s,content: 'Hi'(截短的回答姗姗来迟)
同样的 payload 用 curl 直连,2 秒就回,所以问题不在 DeepSeek 本身。
错误日志
# 直连 API —— 快
$ time curl -s -X POST https://api.deepseek.com/chat/completions \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":50}'
# 2.0s —— content: ""(被 max_tokens 截断,但响应立刻返回)
# LangChain ChatOpenAI —— 慢
>>> from src.providers.llm import build_llm
>>> from src.providers.chat import ChatLLM
>>> llm = ChatLLM() # build_llm() 把 deepseek 路由到 ChatOpenAIWithReasoning
>>> llm._llm.invoke("hi")
... 1217.6 秒后 ...
AIMessage(content='Hi', ...)
# LangChain ChatDeepSeek —— 快(提议的修法)
>>> from langchain_deepseek import ChatDeepSeek
>>> llm = ChatDeepSeek(model="deepseek-v4-flash", temperature=0)
>>> for c in llm.stream("hi"): ... # 2.5s,124 chunks
接口
LLM Provider
deepseek(模型:deepseek-v4-flash)
版本
0.1.7(来自 Dockerfile)
环境
Windows 11 / Python 3.13.2 / langchain-openai>=1.0,<2 / langchain-core 1.4.6
根因
langchain_openai.ChatOpenAI 在它自己的 docstring 里明确写着(见 langchain_openai/chat_models/base.py):
"ChatOpenAI 仅面向官方 OpenAI API 规范。第三方 provider 新增的非标准响应字段(如 reasoning_content、reasoning_details)不会被提取或保留。如果把 base_url 指向 OpenRouter、vLLM 或 DeepSeek 这类 provider,请改用对应 provider 专属的 LangChain 包(如 ChatDeepSeek、ChatOpenRouter)。"
项目里 build_llm()(在 agent/src/providers/llm.py)已经用一个自定义的 ChatOpenAIWithReasoning 包装类来手动保留 reasoning_content,但底层的 ChatOpenAI invoke/stream 路径对 DeepSeek v4 推理模型仍然有严重的兼容性问题——即使是最简单的 prompt 也会卡数十分钟。
提议的修法
在 build_llm() 的 deepseek provider 分支改用官方 langchain-deepseek 包:
if provider == "deepseek":
from langchain_deepseek import ChatDeepSeek
return ChatDeepSeek(
model=name,
temperature=temperature,
timeout=int(os.getenv("TIMEOUT_SECONDS", "120")),
max_retries=int(os.getenv("MAX_RETRIES", "2")),
)
本地验证:ChatDeepSeek + deepseek-v4-flash 流式返回 2.5 秒(124 chunks),reasoning_content 暴露在 chunk.additional_kwargs 里。下游 ChatLLM.stream_chat() 和 _parse_response() 不需要任何改动。原有的 ChatOpenAIWithReasoning 包装类可以保留给其他走 OpenAI 协议的 provider(gemini、openrouter 等)用。
在 agent/requirements.txt 加上:
langchain-deepseek>=1.0.0,<2
描述
发生了什么:
当
.env里配置LANGCHAIN_PROVIDER=deepseek+LANGCHAIN_MODEL_NAME=deepseek-v4-flash时,agent 的llm.invoke()/llm.stream()调用会卡 20 分钟以上(实测llm.invoke("hi")需要 1217.6 秒),而同一个 DeepSeek 端点的 HTTPS 直连只要 ~2 秒。Web UI 一直停在"智能体工作中…",而且前端 90 秒 SSE 超时被绕过——因为后台 30 秒一次的心跳会刷新lastEventRef,导致 UI 永远不会自动恢复。我期望:
agent 应该在几秒内响应(简单对话 2-3 秒,跟直连延迟一致),流式 text_delta 及时推过来,用户能看到进度。
复现步骤
agent/.env:vibe-trading serve --port 8899invoke() done in 1217.6s,content: 'Hi'(截短的回答姗姗来迟)同样的 payload 用
curl直连,2 秒就回,所以问题不在 DeepSeek 本身。错误日志
接口
LLM Provider
deepseek(模型:
deepseek-v4-flash)版本
0.1.7(来自
Dockerfile)环境
Windows 11 / Python 3.13.2 /
langchain-openai>=1.0,<2/langchain-core1.4.6根因
langchain_openai.ChatOpenAI在它自己的 docstring 里明确写着(见langchain_openai/chat_models/base.py):项目里
build_llm()(在agent/src/providers/llm.py)已经用一个自定义的ChatOpenAIWithReasoning包装类来手动保留reasoning_content,但底层的ChatOpenAIinvoke/stream 路径对 DeepSeek v4 推理模型仍然有严重的兼容性问题——即使是最简单的 prompt 也会卡数十分钟。提议的修法
在
build_llm()的deepseekprovider 分支改用官方langchain-deepseek包:本地验证:
ChatDeepSeek+deepseek-v4-flash流式返回 2.5 秒(124 chunks),reasoning_content暴露在chunk.additional_kwargs里。下游ChatLLM.stream_chat()和_parse_response()不需要任何改动。原有的ChatOpenAIWithReasoning包装类可以保留给其他走 OpenAI 协议的 provider(gemini、openrouter 等)用。在
agent/requirements.txt加上: