Skip to content

Commit f523246

Browse files
authored
Merge pull request #8 from BukeLy/fix/use-result-message-for-response
fix: 使用 ResultMessage.result 获取最终响应
2 parents 15c00db + 60d074f commit f523246

4 files changed

Lines changed: 51 additions & 22 deletions

File tree

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,3 @@ agent-sdk-server/claude-settings.json
1717

1818
# Sensitive configuration files
1919
samconfig.toml
20-
samconfig*.toml

agent-sdk-client/handler.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,6 @@ async def process_webhook(body: dict) -> None:
3939
if not message or not message.text:
4040
return
4141

42-
if message.text.startswith('/'):
43-
await bot.send_message(
44-
chat_id=message.chat_id,
45-
text="Commands not supported yet. Just send me a message!",
46-
message_thread_id=message.message_thread_id,
47-
)
48-
return
49-
5042
await bot.send_chat_action(
5143
chat_id=message.chat_id,
5244
action=ChatAction.TYPING,

agent-sdk-server/agent_session.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
query,
1313
ClaudeAgentOptions,
1414
AgentDefinition,
15-
AssistantMessage,
1615
ResultMessage,
17-
TextBlock,
1816
)
1917

2018
# Config source (in Docker image) and destination (Lambda writable)
@@ -178,8 +176,8 @@ async def process_message(
178176
agents=agents if agents else None,
179177
)
180178

181-
response_texts: list[str] = []
182179
result_session_id = session_id or ''
180+
result_text = ''
183181
cost_usd = 0.0
184182
num_turns = 0
185183
is_error = False
@@ -190,19 +188,14 @@ async def process_message(
190188
os.environ['AWS_PROFILE'] = 'bedrock'
191189

192190
async for message in query(prompt=user_message, options=options):
193-
# Handle AssistantMessage - extract text from content blocks
194-
if isinstance(message, AssistantMessage):
195-
for block in message.content:
196-
if isinstance(block, TextBlock):
197-
response_texts.append(block.text)
198-
199-
# Handle ResultMessage - extract session_id and metadata
200-
elif isinstance(message, ResultMessage):
191+
# Handle ResultMessage - contains final response and metadata
192+
if isinstance(message, ResultMessage):
201193
result_session_id = message.session_id
194+
result_text = message.result or ''
202195
cost_usd = message.total_cost_usd or 0.0
203196
num_turns = message.num_turns
204197
is_error = message.is_error
205-
if is_error and message.result:
198+
if is_error:
206199
error_message = message.result
207200

208201
except Exception as e:
@@ -214,7 +207,7 @@ async def process_message(
214207
del os.environ['AWS_PROFILE']
215208

216209
return {
217-
'response': '\n'.join(response_texts) if response_texts else '',
210+
'response': result_text,
218211
'session_id': result_session_id,
219212
'cost_usd': cost_usd,
220213
'num_turns': num_turns,

tests/test_sdk_response.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""测试 Claude Agent SDK 返回的消息结构."""
2+
import asyncio
3+
import os
4+
5+
from claude_agent_sdk import (
6+
query,
7+
ClaudeAgentOptions,
8+
AssistantMessage,
9+
ResultMessage,
10+
TextBlock,
11+
)
12+
13+
14+
async def test_sdk_response():
15+
"""测试 SDK 返回内容."""
16+
options = ClaudeAgentOptions(
17+
cwd='/tmp',
18+
model='haiku',
19+
permission_mode='bypassPermissions',
20+
max_turns=5,
21+
)
22+
23+
print("=" * 60)
24+
print("测试 SDK 返回的消息结构")
25+
print("=" * 60)
26+
27+
async for message in query(prompt="说 Hello World", options=options):
28+
print(f"\n--- Message Type: {type(message).__name__} ---")
29+
30+
if isinstance(message, AssistantMessage):
31+
print(f" model: {message.model}")
32+
print(f" content blocks: {len(message.content)}")
33+
for i, block in enumerate(message.content):
34+
print(f" [{i}] {type(block).__name__}: {repr(block)[:200]}")
35+
36+
elif isinstance(message, ResultMessage):
37+
print(f" session_id: {message.session_id}")
38+
print(f" is_error: {message.is_error}")
39+
print(f" result: {message.result}")
40+
print(f" num_turns: {message.num_turns}")
41+
print(f" total_cost_usd: {message.total_cost_usd}")
42+
43+
44+
if __name__ == '__main__':
45+
asyncio.run(test_sdk_response())

0 commit comments

Comments
 (0)