模拟 API 客户端 —— 按剧本回复。 场景:用户问 "当前目录有什么文件?" AI 第一次回复:要用 bash 工具执行 ls AI 第二次回复:根据工具结果总结
| 391 | # ====================================================================== |
| 392 | |
| 393 | class DemoApiClient: |
| 394 | """ |
| 395 | 模拟 API 客户端 —— 按剧本回复。 |
| 396 | |
| 397 | 场景:用户问 "当前目录有什么文件?" |
| 398 | AI 第一次回复:要用 bash 工具执行 ls |
| 399 | AI 第二次回复:根据工具结果总结 |
| 400 | """ |
| 401 | def __init__(self): |
| 402 | self.call_count = 0 |
| 403 | |
| 404 | def stream(self, request: ApiRequest) -> list[AssistantEvent]: |
| 405 | self.call_count += 1 |
| 406 | |
| 407 | if self.call_count == 1: |
| 408 | return [ |
| 409 | AssistantEvent(event_type="text_delta", text="让我看看当前目录。"), |
| 410 | AssistantEvent( |
| 411 | event_type="tool_use", |
| 412 | tool_id="tool-001", |
| 413 | tool_name="bash", |
| 414 | tool_input='{"command": "ls"}', |
| 415 | ), |
| 416 | AssistantEvent( |
| 417 | event_type="usage", |
| 418 | usage=TokenUsage(input_tokens=50, output_tokens=12), |
| 419 | ), |
| 420 | AssistantEvent(event_type="message_stop"), |
| 421 | ] |
| 422 | else: |
| 423 | # 从对话历史里找到工具结果 |
| 424 | tool_output = "" |
| 425 | for msg in request.messages: |
| 426 | for block in msg.blocks: |
| 427 | if isinstance(block, ToolResultBlock): |
| 428 | tool_output = block.output |
| 429 | |
| 430 | return [ |
| 431 | AssistantEvent( |
| 432 | event_type="text_delta", |
| 433 | text=f"当前目录的文件有:\n{tool_output}", |
| 434 | ), |
| 435 | AssistantEvent( |
| 436 | event_type="usage", |
| 437 | usage=TokenUsage(input_tokens=80, output_tokens=20), |
| 438 | ), |
| 439 | AssistantEvent(event_type="message_stop"), |
| 440 | ] |
| 441 | |
| 442 | |
| 443 | def main(): |