From ed00d11af8a13ce45b1c90effe805d5ea86af430 Mon Sep 17 00:00:00 2001 From: BukeLy Date: Sun, 4 Jan 2026 19:22:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8=20ResultMessage.r?= =?UTF-8?q?esult=20=E8=8E=B7=E5=8F=96=E6=9C=80=E7=BB=88=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 改用 ResultMessage.result 替代手动收集 AssistantMessage 的 TextBlock - 符合 SDK 设计意图,ResultMessage.result 包含完整聚合响应 - 移除不再需要的 AssistantMessage 和 TextBlock 导入 - 添加 SDK 响应结构测试用于验证消息类型 --- agent-sdk-server/agent_session.py | 19 +++++-------- tests/test_sdk_response.py | 45 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 tests/test_sdk_response.py diff --git a/agent-sdk-server/agent_session.py b/agent-sdk-server/agent_session.py index 4931446..d53bc89 100644 --- a/agent-sdk-server/agent_session.py +++ b/agent-sdk-server/agent_session.py @@ -12,9 +12,7 @@ query, ClaudeAgentOptions, AgentDefinition, - AssistantMessage, ResultMessage, - TextBlock, ) # Config source (in Docker image) and destination (Lambda writable) @@ -178,8 +176,8 @@ async def process_message( agents=agents if agents else None, ) - response_texts: list[str] = [] result_session_id = session_id or '' + result_text = '' cost_usd = 0.0 num_turns = 0 is_error = False @@ -190,19 +188,14 @@ async def process_message( os.environ['AWS_PROFILE'] = 'bedrock' async for message in query(prompt=user_message, options=options): - # Handle AssistantMessage - extract text from content blocks - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - response_texts.append(block.text) - - # Handle ResultMessage - extract session_id and metadata - elif isinstance(message, ResultMessage): + # Handle ResultMessage - contains final response and metadata + if isinstance(message, ResultMessage): result_session_id = message.session_id + result_text = message.result or '' cost_usd = message.total_cost_usd or 0.0 num_turns = message.num_turns is_error = message.is_error - if is_error and message.result: + if is_error: error_message = message.result except Exception as e: @@ -214,7 +207,7 @@ async def process_message( del os.environ['AWS_PROFILE'] return { - 'response': '\n'.join(response_texts) if response_texts else '', + 'response': result_text, 'session_id': result_session_id, 'cost_usd': cost_usd, 'num_turns': num_turns, diff --git a/tests/test_sdk_response.py b/tests/test_sdk_response.py new file mode 100644 index 0000000..99e8eed --- /dev/null +++ b/tests/test_sdk_response.py @@ -0,0 +1,45 @@ +"""测试 Claude Agent SDK 返回的消息结构.""" +import asyncio +import os + +from claude_agent_sdk import ( + query, + ClaudeAgentOptions, + AssistantMessage, + ResultMessage, + TextBlock, +) + + +async def test_sdk_response(): + """测试 SDK 返回内容.""" + options = ClaudeAgentOptions( + cwd='/tmp', + model='haiku', + permission_mode='bypassPermissions', + max_turns=5, + ) + + print("=" * 60) + print("测试 SDK 返回的消息结构") + print("=" * 60) + + async for message in query(prompt="说 Hello World", options=options): + print(f"\n--- Message Type: {type(message).__name__} ---") + + if isinstance(message, AssistantMessage): + print(f" model: {message.model}") + print(f" content blocks: {len(message.content)}") + for i, block in enumerate(message.content): + print(f" [{i}] {type(block).__name__}: {repr(block)[:200]}") + + elif isinstance(message, ResultMessage): + print(f" session_id: {message.session_id}") + print(f" is_error: {message.is_error}") + print(f" result: {message.result}") + print(f" num_turns: {message.num_turns}") + print(f" total_cost_usd: {message.total_cost_usd}") + + +if __name__ == '__main__': + asyncio.run(test_sdk_response()) From 60d074f31d516c3b7e71b78a53e0da64f80605cd Mon Sep 17 00:00:00 2001 From: BukeLy Date: Sun, 4 Jan 2026 19:33:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E9=80=BB=E8=BE=91=EF=BC=8C=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=B6=88=E6=81=AF=E4=BC=A0=E7=BB=99=20Agent?= =?UTF-8?q?=20=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handler.py: 删除 `/` 开头命令拦截,支持 Agent Skill 调用 - .gitignore: 移除通配符规则,保留 samconfig.toml.example --- .gitignore | 1 - agent-sdk-client/handler.py | 8 -------- 2 files changed, 9 deletions(-) diff --git a/.gitignore b/.gitignore index 1524a98..6e2188e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,3 @@ agent-sdk-server/claude-settings.json # Sensitive configuration files samconfig.toml -samconfig*.toml diff --git a/agent-sdk-client/handler.py b/agent-sdk-client/handler.py index 0d17fe0..435a6f5 100644 --- a/agent-sdk-client/handler.py +++ b/agent-sdk-client/handler.py @@ -39,14 +39,6 @@ async def process_webhook(body: dict) -> None: if not message or not message.text: return - if message.text.startswith('/'): - await bot.send_message( - chat_id=message.chat_id, - text="Commands not supported yet. Just send me a message!", - message_thread_id=message.message_thread_id, - ) - return - await bot.send_chat_action( chat_id=message.chat_id, action=ChatAction.TYPING,