Skip to content

[Bug] 使用 DeepSeek v4 推理模型时,agent 长时间卡死(20+ 分钟才返回) #208

Description

@XYWOX

描述

发生了什么:
.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 及时推过来,用户能看到进度。

复现步骤

  1. 配置 agent/.env
    LANGCHAIN_PROVIDER=deepseek
    LANGCHAIN_MODEL_NAME=deepseek-v4-flash
    DEEPSEEK_API_KEY=sk-...
    DEEPSEEK_BASE_URL=https://api.deepseek.com
  2. 启动 API server:vibe-trading serve --port 8899
  3. 打开 Web UI,新建会话
  4. 发任意消息(如"你好")
  5. 观察到状态卡在"智能体工作中…"超过 20 分钟
  6. 后端日志最终显示:invoke() done in 1217.6scontent: '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

接口

  • Web UI (vibe-trading serve)

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_contentreasoning_details不会被提取或保留。如果把 base_url 指向 OpenRouter、vLLM 或 DeepSeek 这类 provider,请改用对应 provider 专属的 LangChain 包(如 ChatDeepSeekChatOpenRouter)。"

项目里 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions