diff --git a/llmcore.py b/llmcore.py index 7f64f82..3da766c 100644 --- a/llmcore.py +++ b/llmcore.py @@ -386,7 +386,7 @@ def _to_responses_input(messages): elif ptype == "image_url": url = (part.get("image_url") or {}).get("url", "") if url and role != "assistant": parts.append({"type": "input_image", "image_url": url}) - if len(parts) == 0: parts = [{"type": text_type, "text": str(content)}] + if len(parts) == 0: parts = [{"type": text_type, "text": str(content) or '[empty]'}] result.append({"role": role, "content": parts}) for tc in (msg.get("tool_calls") or []): f = tc.get("function", {}) @@ -404,7 +404,7 @@ def _msgs_claude2oai(messages): text_parts, tool_calls = [], [] for b in blocks: if not isinstance(b, dict): continue - if b.get("type") == "text": text_parts.append({"type": "text", "text": b.get("text", "")}) + if b.get("type") == "text" and b.get("text"): text_parts.append({"type": "text", "text": b.get("text", "")}) elif b.get("type") == "tool_use": tool_calls.append({ "id": b.get("id", ""), "type": "function", @@ -432,7 +432,7 @@ def _msgs_claude2oai(messages): if src.get("type") == "base64" and src.get("data"): text_parts.append({"type": "image_url", "image_url": {"url": f"data:{src.get('media_type', 'image/png')};base64,{src.get('data', '')}"}}) elif b.get("type") == "image_url": text_parts.append(b) - elif b.get("type") == "text": text_parts.append({"type": "text", "text": b.get("text", "")}) + elif b.get("type") == "text" and b.get("text"): text_parts.append({"type": "text", "text": b.get("text", "")}) if text_parts: result.append({"role": "user", "content": text_parts}) else: result.append(msg) return result @@ -895,6 +895,7 @@ THINKING_PROMPT_ZH = """ 每次回复请先在回复文字中包含: 1. 在 标签中先分析现状和策略 2. 在 中输出极简单行(<30字)物理快照:上次结果新信息+本次意图。此内容进入长期工作记忆。 +再进行回答。 \n**除了最后回答,必须进行工具调用!** """.strip() THINKING_PROMPT_EN = """ @@ -902,6 +903,7 @@ THINKING_PROMPT_EN = """ The reply body should first include: 1. Analyze the current situation and strategy inside 2. Output a minimal one-line (<30 words) physical snapshot in : new info from last result + current intent. This goes into long-term working memory. +Then reply. \n**Tool calls are required for every turn except the final answer!** """.strip()