"""本机 Qwen3.8-27B(vLLM,OpenAI 兼容)。 实测数据(P0-本地LLM验证报告.md): 关思考 首 token 367ms / 完成 10 tokens 开思考 首 token 1390ms / 完成 187 tokens,且**回答被 max_tokens 截断** (实测 200 预算下只吐出"我不"两个字) 开思考不只是慢——思考 token 会占用 max_tokens 预算。 语音场景 max_tokens 本来就要设小,所以这不是"慢一点"的取舍,是"说不出话"。 默认关闭。 约束:只接受一条 system 消息,多条返回 400。已在基类归一化。 视觉:本实例不支持("At most 0 image(s) may be provided"), 模型目录里没有视觉塔。视觉要走 llama.cpp + mmproj 那条线。 """ from __future__ import annotations from typing import Sequence from .base import LLMProvider class LocalVLLMProvider(LLMProvider): supports_vision = False def _build_body(self, messages: list[dict], *, tools: Sequence[dict] | None, max_tokens: int) -> dict: body: dict = { "model": self.cfg.model, "messages": messages, "stream": True, "max_tokens": max_tokens, "stream_options": {"include_usage": True}, } # 关闭思考。这是本机部署实测唯一有效的方式 # (服务器上的 ctx_test.sh 也用同一写法)。 # 注意:即使关掉,响应里仍可能出现空的 reasoning 字段,属正常。 body["chat_template_kwargs"] = {"enable_thinking": self.cfg.thinking} if tools: body["tools"] = list(tools) body["tool_choice"] = "auto" return body __all__ = ["LocalVLLMProvider"]