diff --git a/ga.py b/ga.py index dd520c5..c2d2dbe 100644 --- a/ga.py +++ b/ga.py @@ -429,7 +429,7 @@ class GenericAgentHandler(BaseHandler): yield f"[Info] Updated key_info and related_sop.\n" next_prompt = self._get_anchor_prompt(skip=args.get('_index', 0) > 0) #next_prompt += '\n[SYSTEM TIPS] 此函数一般在任务开始或中间时调用,如果任务已成功完成应该是start_long_term_update用于结算长期记忆。\n' - return StepOutcome({"status": "success"}, next_prompt=next_prompt) + return StepOutcome({"result": "working key_info updated"}, next_prompt=next_prompt) def do_no_tool(self, args, response): '''这是一个特殊工具,由引擎自主调用,不要包含在TOOLS_SCHEMA里。 diff --git a/llmcore.py b/llmcore.py index 9549afa..a7bcdde 100644 --- a/llmcore.py +++ b/llmcore.py @@ -348,6 +348,9 @@ def _to_responses_input(messages): result = [] for msg in messages: role = str(msg.get("role", "user")).lower() + if role == "tool": + result.append({"type": "function_call_output", "call_id": msg.get("tool_call_id", ""), "output": msg.get("content", "")}) + continue if role not in ["user", "assistant", "system", "developer"]: role = "user" if role == "system": role = "developer" # Responses API uses 'developer' instead of 'system' content = msg.get("content", "") @@ -367,6 +370,9 @@ def _to_responses_input(messages): if url and role != "assistant": parts.append({"type": "input_image", "image_url": url}) if len(parts) == 0: parts = [{"type": text_type, "text": str(content)}] result.append({"role": role, "content": parts}) + for tc in (msg.get("tool_calls") or []): + f = tc.get("function", {}) + result.append({"type": "function_call", "call_id": tc.get("id", ""), "name": f.get("name", ""), "arguments": f.get("arguments", "")}) return result @@ -469,7 +475,7 @@ class ClaudeSession(BaseSession): if self.system: payload["system"] = [{"type": "text", "text": self.system, "cache_control": {"type": "persistent"}}] try: with requests.post(auto_make_url(self.api_base, "messages"), headers=headers, json=payload, stream=True, timeout=(self.connect_timeout, self.read_timeout)) as r: - if r.status_code != 200: raise Exception(f"HTTP {r.status_code} {r.text[:500]}") + if r.status_code != 200: raise Exception(f"HTTP {r.status_code} {r.content.decode('utf-8', errors='replace')[:500]}") return (yield from _parse_claude_sse(r.iter_lines())) or [] except Exception as e: yield (err := f"Error: {e}") @@ -519,7 +525,7 @@ class NativeClaudeSession(BaseSession): messages[-1]["content"][-1] = dict(messages[-1]["content"][-1], cache_control={"type": "ephemeral"}) try: resp = requests.post(auto_make_url(self.api_base, "messages"), headers=headers, json=payload, stream=True, timeout=(self.connect_timeout, self.read_timeout)) - if resp.status_code != 200: raise Exception(f"HTTP {resp.status_code} {resp.text[:500]}") + if resp.status_code != 200: raise Exception(f"HTTP {resp.status_code} {resp.content.decode('utf-8', errors='replace')[:500]}") return (yield from _parse_claude_sse(resp.iter_lines())) or [] except Exception as e: yield (err := f"Error: {e}")