# 专题八 · 修改后:插入到 openai 插件 models/llm/chat.py # 位置:from __future__ import annotations 之后、原有 import 之后、generate_chat 之前。 # 应用:python scripts_cursor/专题八_03_应用chat_helpers补丁_修改后.py def _text_content(m: "PromptMessage") -> str: """把 System / Developer 消息的内容取成字符串。""" content = getattr(m, "content", "") or "" if isinstance(content, str): return content if isinstance(content, (list, tuple)): return "".join( getattr(part, "data", "") or "" for part in content if getattr(part, "type", "") == "text" ) return str(content) def _ensure_system_first(messages: "list[PromptMessage]") -> "list[PromptMessage]": """收集所有 system / developer 消息,去空后用 \\n\\n 合并成单条 system 置顶。 Qwen3 的 chat template 只接受一条 system 消息且必须在最前; Dify(尤其 Agent 应用)会把多条 system / developer 提示堆在前面, 导致 vLLM 报 400 'System message must be at the beginning.'。 """ system_parts: list[str] = [] rest: list[PromptMessage] = [] for m in messages: if isinstance(m, (SystemPromptMessage, DeveloperPromptMessage)): text = _text_content(m) if text.strip(): system_parts.append(text) else: rest.append(m) if system_parts: rest.insert(0, SystemPromptMessage(content="\n\n".join(system_parts))) return rest # generate_chat 内调用处(修改后)完整一行: # messages = cast(Any, [message(item) for item in _ensure_system_first(prompt_messages)])