fix(ai): PR #193 新增 AI 调用放开 max_tokens 限制

合并 #193 引入的 3 处显式 max_tokens(信号生成 2000/策略代码 3000×2)
重新踩中 0ee3aa8 修过的问题: 推理模型思考 token 计入 max_tokens 预算,
显式限制挤占正文导致 JSON/代码截断。统一改为 None(请求不传该参数,
输出上限交给服务端默认)。四个分析器本就是 None, 标题生成 max_tokens=8
为刻意保留的小任务限制, 均不动。
This commit is contained in:
shy3130
2026-08-24 14:21:55 +08:00
parent 6c7c7088a9
commit 46635074e8
3 changed files with 10 additions and 6 deletions
+3 -2
View File
@@ -145,8 +145,9 @@ async def ai_generate_signal(req: AIGenerateRequest):
messages = custom_signals_ai.build_messages(description)
try:
# max_tokens 给足 8 个条件的 JSON 余量 (1000 会被复杂描述截断, 导致返回非法 JSON)
text = await generate_ai_text(messages, temperature=0.2, max_tokens=2000)
# max_tokens=None 不传上限: 推理模型思考 token 计入预算, 显式限制
# 会挤占正文导致 JSON 截断/0 字 (与四个分析器同因, 见 0ee3aa8)
text = await generate_ai_text(messages, temperature=0.2, max_tokens=None)
except RuntimeError as e:
raise HTTPException(status_code=400, detail=str(e)) from e
except Exception as e:
+4 -2
View File
@@ -169,7 +169,8 @@ class AIStrategyGenerator:
{"role": "user", "content": user_prompt},
],
temperature=0.3,
max_tokens=3000,
# None = 不传上限: 策略代码较长, 推理模型思考 token 计入预算会截断代码
max_tokens=None,
):
yield chunk
@@ -313,7 +314,8 @@ META = {{...}}{entrypoint_requirement}。只输出完整 Python 代码。
{"role": "user", "content": user_prompt},
],
temperature=0.3,
max_tokens=3000,
# None = 不传上限: 策略代码较长, 推理模型思考 token 计入预算会截断代码
max_tokens=None,
)
return self._extract_code_block(content)
+3 -2
View File
@@ -196,8 +196,9 @@ async def test_ai_generate_endpoint_success(monkeypatch):
result = await ai_generate_signal(AIGenerateRequest(description="回踩MA20且放量"))
assert result["name"] == "回踩MA20放量"
assert len(result["conditions"]) == 2
# 复杂描述 (多条件) 需要足够 token, 避免 JSON 被截断
assert captured["max_tokens"] >= 2000
# 复杂描述 (多条件) 不设输出上限: 推理模型思考 token 计入 max_tokens 预算,
# 显式限制会挤占正文导致 JSON 截断 (对齐分析器的放开策略)
assert captured["max_tokens"] is None
@pytest.mark.asyncio