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, 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())