feat(llm): halkyon_llm, language models' APIs streamed over plain HTTP (ADR 0021, step 2)
A pure Dart package, no SDKs, one interface (LlmClient) over Anthropic's Messages API, OpenAI's chat completions, in each known host's dialect and the local servers' (D45), and OpenAI's Responses API, stateless (D46). A model's turn keeps what its provider wants back with the tools' results: Anthropic's thinking blocks, the Responses API's reasoning items and message phase, Gemini's thought signatures. Failures come by kind, the provider's words cut and without keys. Tested on replies written from the providers' documentation, replayed in pieces of 1, 7 and 4,096 bytes; tool/record_llm.dart records real ones with a key of one's own, which the tests then run on too (D36). FakeLlmClient for the code that uses it. BSD-3-Clause, as halkyon_oidc. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
e4c7259df3
commit
038aca5439
8 changed files with 4841 additions and 0 deletions
24
packages/halkyon_llm/test/fixtures/documented/openai-responses/incomplete.http
vendored
Normal file
24
packages/halkyon_llm/test/fixtures/documented/openai-responses/incomplete.http
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
HTTP 200
|
||||
content-type: text/event-stream; charset=utf-8
|
||||
|
||||
event: response.created
|
||||
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_2d8f33e0a1b2c3d4","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":1,"output_index":0,"item":{"id":"rs_2d8f33e0aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1","summary":[]}}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":2,"output_index":0,"item":{"id":"rs_2d8f33e0aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1nQ2xv8WcTq0Lz3HfJ5yV7aBdE9gKmPuRtY1sXo4iC6eNlA2vB8jM0zQwU=","summary":[]}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":3,"output_index":1,"item":{"id":"msg_2d8f33e0bb02","type":"message","status":"in_progress","role":"assistant","content":[],"phase":"final_answer"}}
|
||||
|
||||
event: response.output_text.delta
|
||||
data: {"type":"response.output_text.delta","sequence_number":4,"item_id":"msg_2d8f33e0bb02","output_index":1,"content_index":0,"delta":"„Hund“ heißt","logprobs":[],"obfuscation":"Zr"}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":5,"output_index":1,"item":{"id":"msg_2d8f33e0bb02","type":"message","status":"incomplete","role":"assistant","content":[{"type":"output_text","text":"„Hund“ heißt","annotations":[],"logprobs":[]}],"phase":"final_answer"}}
|
||||
|
||||
event: response.incomplete
|
||||
data: {"type":"response.incomplete","sequence_number":6,"response":{"id":"resp_2d8f33e0a1b2c3d4","object":"response","created_at":1761400200,"status":"incomplete","background":false,"error":null,"incomplete_details":{"reason":"max_output_tokens"},"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[{"id":"rs_2d8f33e0aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1nQ2xv8WcTq0Lz3HfJ5yV7aBdE9gKmPuRtY1sXo4iC6eNlA2vB8jM0zQwU=","summary":[]},{"id":"msg_2d8f33e0bb02","type":"message","status":"incomplete","role":"assistant","content":[{"type":"output_text","text":"„Hund“ heißt","annotations":[],"logprobs":[]}],"phase":"final_answer"}],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":{"input_tokens":412,"input_tokens_details":{"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":12},"total_tokens":428},"metadata":{}}}
|
||||
|
||||
15
packages/halkyon_llm/test/fixtures/documented/openai-responses/quota_error.http
vendored
Normal file
15
packages/halkyon_llm/test/fixtures/documented/openai-responses/quota_error.http
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
HTTP 200
|
||||
content-type: text/event-stream; charset=utf-8
|
||||
|
||||
event: response.created
|
||||
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_3e9044f1b2c3d4e5","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.in_progress
|
||||
data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_3e9044f1b2c3d4e5","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: error
|
||||
data: {"type":"error","sequence_number":2,"error":{"type":"insufficient_quota","code":"insufficient_quota","message":"You exceeded your current quota, please check your plan and billing details.","param":null}}
|
||||
|
||||
event: response.failed
|
||||
data: {"type":"response.failed","sequence_number":3,"response":{"id":"resp_3e9044f1b2c3d4e5","object":"response","created_at":1761400200,"status":"failed","background":false,"error":{"code":"insufficient_quota","message":"You exceeded your current quota, please check your plan and billing details."},"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
18
packages/halkyon_llm/test/fixtures/documented/openai-responses/server_error_midstream.http
vendored
Normal file
18
packages/halkyon_llm/test/fixtures/documented/openai-responses/server_error_midstream.http
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
HTTP 200
|
||||
content-type: text/event-stream; charset=utf-8
|
||||
|
||||
event: response.created
|
||||
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_4fa155a2c3d4e5f6","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":1,"output_index":0,"item":{"id":"msg_4fa155a2bb01","type":"message","status":"in_progress","role":"assistant","content":[],"phase":"final_answer"}}
|
||||
|
||||
event: response.output_text.delta
|
||||
data: {"type":"response.output_text.delta","sequence_number":2,"item_id":"msg_4fa155a2bb01","output_index":0,"content_index":0,"delta":"„Hund“","logprobs":[],"obfuscation":"Qx"}
|
||||
|
||||
event: error
|
||||
data: {"type":"error","sequence_number":3,"code":"server_error","message":"The server had an error while processing your request.","param":null}
|
||||
|
||||
event: response.failed
|
||||
data: {"type":"response.failed","sequence_number":4,"response":{"id":"resp_4fa155a2c3d4e5f6","object":"response","created_at":1761400200,"status":"failed","background":false,"error":{"code":"server_error","message":"The server had an error while processing your request."},"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":{"input_tokens":412,"input_tokens_details":{"cached_tokens":0},"output_tokens":3,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":415},"metadata":{}}}
|
||||
|
||||
4
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_401.http
vendored
Normal file
4
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_401.http
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
HTTP 401
|
||||
content-type: application/json
|
||||
|
||||
{"error":{"message":"Incorrect API key provided: sk-proj-****wxyz. You can find your API key at https://platform.openai.com/account/api-keys.","type":"invalid_request_error","param":null,"code":"invalid_api_key"}}
|
||||
5
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_429.http
vendored
Normal file
5
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_429.http
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
HTTP 429
|
||||
content-type: application/json
|
||||
retry-after: 20
|
||||
|
||||
{"error":{"message":"Rate limit reached for gpt-5-mini in organization org-x on requests per min (RPM): Limit 500, Used 500, Requested 1.","type":"requests","param":null,"code":"rate_limit_exceeded"}}
|
||||
4
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_429_quota.http
vendored
Normal file
4
packages/halkyon_llm/test/fixtures/documented/openai-responses/status_429_quota.http
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
HTTP 429
|
||||
content-type: application/json
|
||||
|
||||
{"error":{"message":"You exceeded your current quota, please check your plan and billing details.","type":"insufficient_quota","param":null,"code":"insufficient_quota"}}
|
||||
44
packages/halkyon_llm/test/fixtures/documented/openai-responses/text.http
vendored
Normal file
44
packages/halkyon_llm/test/fixtures/documented/openai-responses/text.http
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
HTTP 200
|
||||
content-type: text/event-stream; charset=utf-8
|
||||
|
||||
event: response.created
|
||||
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_0f3a91c2d4e5b6a7","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.in_progress
|
||||
data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_0f3a91c2d4e5b6a7","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"rs_0f3a91c2aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1","summary":[]}}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":3,"output_index":0,"item":{"id":"rs_0f3a91c2aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1nQ2xv8WcTq0Lz3HfJ5yV7aBdE9gKmPuRtY1sXo4iC6eNlA2vB8jM0zQwU=","summary":[]}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":4,"output_index":1,"item":{"id":"msg_0f3a91c2bb02","type":"message","status":"in_progress","role":"assistant","content":[],"phase":"final_answer"}}
|
||||
|
||||
event: response.content_part.added
|
||||
data: {"type":"response.content_part.added","sequence_number":5,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"part":{"type":"output_text","text":"","annotations":[],"logprobs":[]}}
|
||||
|
||||
event: response.output_text.delta
|
||||
data: {"type":"response.output_text.delta","sequence_number":6,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"delta":"„Hund“ heißt","logprobs":[],"obfuscation":"q8Zr"}
|
||||
|
||||
: keep-alive
|
||||
|
||||
event: response.output_text.delta
|
||||
data: {"type":"response.output_text.delta","sequence_number":7,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"delta":" auf Japanisch 犬","logprobs":[],"obfuscation":"Lm"}
|
||||
|
||||
event: response.output_text.delta
|
||||
data: {"type":"response.output_text.delta","sequence_number":8,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"delta":" (いぬ, inu).","logprobs":[],"obfuscation":"x0Tq3Wv"}
|
||||
|
||||
event: response.output_text.done
|
||||
data: {"type":"response.output_text.done","sequence_number":9,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"text":"„Hund“ heißt auf Japanisch 犬 (いぬ, inu).","logprobs":[]}
|
||||
|
||||
event: response.content_part.done
|
||||
data: {"type":"response.content_part.done","sequence_number":10,"item_id":"msg_0f3a91c2bb02","output_index":1,"content_index":0,"part":{"type":"output_text","text":"„Hund“ heißt auf Japanisch 犬 (いぬ, inu).","annotations":[],"logprobs":[]}}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":11,"output_index":1,"item":{"id":"msg_0f3a91c2bb02","type":"message","status":"completed","role":"assistant","content":[{"type":"output_text","text":"„Hund“ heißt auf Japanisch 犬 (いぬ, inu).","annotations":[],"logprobs":[]}],"phase":"final_answer"}}
|
||||
|
||||
event: response.completed
|
||||
data: {"type":"response.completed","sequence_number":12,"response":{"id":"resp_0f3a91c2d4e5b6a7","object":"response","created_at":1761400200,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[{"id":"rs_0f3a91c2aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1nQ2xv8WcTq0Lz3HfJ5yV7aBdE9gKmPuRtY1sXo4iC6eNlA2vB8jM0zQwU=","summary":[]},{"id":"msg_0f3a91c2bb02","type":"message","status":"completed","role":"assistant","content":[{"type":"output_text","text":"„Hund“ heißt auf Japanisch 犬 (いぬ, inu).","annotations":[],"logprobs":[]}],"phase":"final_answer"}],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":{"input_tokens":412,"input_tokens_details":{"cached_tokens":256},"output_tokens":62,"output_tokens_details":{"reasoning_tokens":24},"total_tokens":474},"metadata":{}}}
|
||||
|
||||
45
packages/halkyon_llm/test/fixtures/documented/openai-responses/tool.http
vendored
Normal file
45
packages/halkyon_llm/test/fixtures/documented/openai-responses/tool.http
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
HTTP 200
|
||||
content-type: text/event-stream; charset=utf-8
|
||||
|
||||
event: response.created
|
||||
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_1c7e22d9f0a1b2c3","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.in_progress
|
||||
data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_1c7e22d9f0a1b2c3","object":"response","created_at":1761400200,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":null,"metadata":{}}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"rs_1c7e22d9aa01","type":"reasoning","encrypted_content":"gAAAAABo_Rk1","summary":[]}}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":3,"output_index":0,"item":{"id":"rs_1c7e22d9aa01","type":"reasoning","encrypted_content":"gAAAAABo_Sx9pL3mN7kT1bV5cX2zA8dF4gH6jK0qW=","summary":[]}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":4,"output_index":1,"item":{"id":"fc_1c7e22d9cc01","type":"function_call","status":"in_progress","arguments":"","call_id":"call_Hq2ZtX0aP4kLm9sB","name":"find_cards"}}
|
||||
|
||||
event: response.function_call_arguments.delta
|
||||
data: {"type":"response.function_call_arguments.delta","sequence_number":5,"item_id":"fc_1c7e22d9cc01","output_index":1,"delta":"{\"query\":","obfuscation":"h0EQ"}
|
||||
|
||||
event: response.function_call_arguments.delta
|
||||
data: {"type":"response.function_call_arguments.delta","sequence_number":6,"item_id":"fc_1c7e22d9cc01","output_index":1,"delta":"\"Hund\",\"limit\":5}","obfuscation":"h0EQ"}
|
||||
|
||||
event: response.function_call_arguments.done
|
||||
data: {"type":"response.function_call_arguments.done","sequence_number":7,"item_id":"fc_1c7e22d9cc01","output_index":1,"arguments":"{\"query\":\"Hund\",\"limit\":5}"}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":8,"output_index":1,"item":{"id":"fc_1c7e22d9cc01","type":"function_call","status":"completed","arguments":"{\"query\":\"Hund\",\"limit\":5}","call_id":"call_Hq2ZtX0aP4kLm9sB","name":"find_cards"}}
|
||||
|
||||
event: response.output_item.added
|
||||
data: {"type":"response.output_item.added","sequence_number":9,"output_index":2,"item":{"id":"fc_1c7e22d9cc02","type":"function_call","status":"in_progress","arguments":"","call_id":"call_7DdmO9pD3xa9XTPN","name":"find_cards"}}
|
||||
|
||||
event: response.function_call_arguments.delta
|
||||
data: {"type":"response.function_call_arguments.delta","sequence_number":10,"item_id":"fc_1c7e22d9cc02","output_index":2,"delta":"{\"query\":\"犬\"}","obfuscation":"h0EQ"}
|
||||
|
||||
event: response.function_call_arguments.done
|
||||
data: {"type":"response.function_call_arguments.done","sequence_number":11,"item_id":"fc_1c7e22d9cc02","output_index":2,"arguments":"{\"query\":\"犬\"}"}
|
||||
|
||||
event: response.output_item.done
|
||||
data: {"type":"response.output_item.done","sequence_number":12,"output_index":2,"item":{"id":"fc_1c7e22d9cc02","type":"function_call","status":"completed","arguments":"{\"query\":\"犬\"}","call_id":"call_7DdmO9pD3xa9XTPN","name":"find_cards"}}
|
||||
|
||||
event: response.completed
|
||||
data: {"type":"response.completed","sequence_number":13,"response":{"id":"resp_1c7e22d9f0a1b2c3","object":"response","created_at":1761400200,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":"Du hilfst beim Japanischlernen.","max_output_tokens":4096,"model":"gpt-6-astra-2026-09-30","output":[{"id":"rs_1c7e22d9aa01","type":"reasoning","encrypted_content":"gAAAAABo_Sx9pL3mN7kT1bV5cX2zA8dF4gH6jK0qW=","summary":[]},{"id":"fc_1c7e22d9cc01","type":"function_call","status":"completed","arguments":"{\"query\":\"Hund\",\"limit\":5}","call_id":"call_Hq2ZtX0aP4kLm9sB","name":"find_cards"},{"id":"fc_1c7e22d9cc02","type":"function_call","status":"completed","arguments":"{\"query\":\"犬\"}","call_id":"call_7DdmO9pD3xa9XTPN","name":"find_cards"}],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":"p_8Zq3","store":false,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"truncation":"disabled","usage":{"input_tokens":472,"input_tokens_details":{"cached_tokens":0},"output_tokens":89,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":561},"metadata":{}}}
|
||||
|
||||
Loading…
Reference in a new issue