Merge pull request #2592 from charmbracelet/small-descs

Christian Rocha created

chore(tools): reduce tool call descriptions, behind a flag

Change summary

internal/agent/agent_tool.go                                                       |  2 
internal/agent/agentic_fetch_tool.go                                               |  2 
internal/agent/templates/agent_tool.md                                             |  2 
internal/agent/templates/agentic_fetch.md                                          |  2 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/bash_tool.yaml             | 23 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/download_tool.yaml         | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/fetch_tool.yaml            | 21 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/glob_tool.yaml             | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/grep_tool.yaml             | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/ls_tool.yaml               | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/multiedit_tool.yaml        | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/parallel_tool_calls.yaml   | 22 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/read_a_file.yaml           | 20 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/simple_test.yaml           | 23 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/sourcegraph_tool.yaml      | 23 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/update_a_file.yaml         | 19 
internal/agent/testdata/TestCoderAgent/anthropic-sonnet/write_tool.yaml            | 23 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/bash_tool.yaml                 | 36 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/download_tool.yaml             | 32 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/fetch_tool.yaml                | 30 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/glob_tool.yaml                 | 32 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/grep_tool.yaml                 | 36 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/ls_tool.yaml                   | 30 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/multiedit_tool.yaml            | 32 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/parallel_tool_calls.yaml       | 34 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/read_a_file.yaml               | 24 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/simple_test.yaml               | 18 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/sourcegraph_tool.yaml          | 38 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/update_a_file.yaml             | 34 
internal/agent/testdata/TestCoderAgent/openai-gpt-5/write_tool.yaml                | 28 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/bash_tool.yaml           | 30 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/download_tool.yaml       | 22 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/fetch_tool.yaml          | 22 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/glob_tool.yaml           | 32 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/grep_tool.yaml           | 22 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/ls_tool.yaml             | 20 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/multiedit_tool.yaml      | 24 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/parallel_tool_calls.yaml | 32 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/read_a_file.yaml         | 18 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/simple_test.yaml         | 16 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/sourcegraph_tool.yaml    | 22 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/update_a_file.yaml       | 20 
internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/write_tool.yaml          | 20 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/bash_tool.yaml                   | 24 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/download_tool.yaml               | 22 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/fetch_tool.yaml                  | 34 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/glob_tool.yaml                   | 22 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/grep_tool.yaml                   | 26 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/ls_tool.yaml                     | 22 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/multiedit_tool.yaml              | 28 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/parallel_tool_calls.yaml         | 28 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/read_a_file.yaml                 | 20 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/simple_test.yaml                 | 18 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/sourcegraph_tool.yaml            | 22 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/update_a_file.yaml               | 28 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/write_tool.yaml                  | 26 
internal/agent/tools/bash.tpl                                                      |  2 
internal/agent/tools/crush_info.md                                                 |  3 
internal/agent/tools/crush_logs.md                                                 |  2 
internal/agent/tools/diagnostics.go                                                |  2 
internal/agent/tools/diagnostics.md                                                |  2 
internal/agent/tools/download.go                                                   |  2 
internal/agent/tools/download.md                                                   |  2 
internal/agent/tools/edit.go                                                       |  2 
internal/agent/tools/edit.md                                                       |  2 
internal/agent/tools/fetch.go                                                      |  2 
internal/agent/tools/fetch.md                                                      |  2 
internal/agent/tools/glob.go                                                       |  2 
internal/agent/tools/glob.md                                                       |  2 
internal/agent/tools/grep.go                                                       |  2 
internal/agent/tools/grep.md                                                       |  2 
internal/agent/tools/job_kill.go                                                   |  2 
internal/agent/tools/job_kill.md                                                   |  2 
internal/agent/tools/job_output.go                                                 |  2 
internal/agent/tools/job_output.md                                                 |  2 
internal/agent/tools/list_mcp_resources.go                                         |  2 
internal/agent/tools/list_mcp_resources.md                                         |  2 
internal/agent/tools/ls.go                                                         |  2 
internal/agent/tools/ls.md                                                         |  2 
internal/agent/tools/lsp_restart.go                                                |  2 
internal/agent/tools/lsp_restart.md                                                |  2 
internal/agent/tools/multiedit.go                                                  |  2 
internal/agent/tools/multiedit.md                                                  |  2 
internal/agent/tools/read_mcp_resource.go                                          |  2 
internal/agent/tools/read_mcp_resource.md                                          |  2 
internal/agent/tools/references.go                                                 |  2 
internal/agent/tools/references.md                                                 |  2 
internal/agent/tools/sourcegraph.go                                                |  2 
internal/agent/tools/sourcegraph.md                                                |  2 
internal/agent/tools/todos.go                                                      |  2 
internal/agent/tools/todos.md                                                      |  2 
internal/agent/tools/tools.go                                                      | 22 
internal/agent/tools/view.go                                                       |  2 
internal/agent/tools/view.md                                                       |  2 
internal/agent/tools/web_fetch.go                                                  |  2 
internal/agent/tools/web_fetch.md                                                  |  2 
internal/agent/tools/web_search.go                                                 |  2 
internal/agent/tools/web_search.md                                                 |  2 
internal/agent/tools/write.go                                                      |  2 
internal/agent/tools/write.md                                                      |  2 
100 files changed, 718 insertions(+), 707 deletions(-)

Detailed changes

internal/agent/agent_tool.go 🔗

@@ -39,7 +39,7 @@ func (c *coordinator) agentTool(ctx context.Context) (fantasy.AgentTool, error)
 	}
 	return fantasy.NewParallelAgentTool(
 		AgentToolName,
-		string(agentToolDescription),
+		tools.FirstLineDescription(agentToolDescription),
 		func(ctx context.Context, params AgentParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Prompt == "" {
 				return fantasy.NewTextErrorResponse("prompt is required"), nil

internal/agent/agentic_fetch_tool.go 🔗

@@ -65,7 +65,7 @@ func (c *coordinator) agenticFetchTool(_ context.Context, client *http.Client) (
 
 	return fantasy.NewParallelAgentTool(
 		tools.AgenticFetchToolName,
-		string(agenticFetchToolDescription),
+		tools.FirstLineDescription(agenticFetchToolDescription),
 		func(ctx context.Context, params tools.AgenticFetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			validationResult, err := validateAgenticFetchParams(ctx, params)
 			if err != nil {

internal/agent/templates/agent_tool.md 🔗

@@ -1,4 +1,4 @@
-Launch a new agent that has access to the following tools: GlobTool, GrepTool, LS, View. When you are searching for a keyword or file and are not confident that you will find the right match on the first try, use the Agent tool to perform the search for you.
+Launch a new agent that has access to the following tools: glob, grep, ls, view. When you are searching for a keyword or file and are not confident that you will find the right match on the first try, use the agent tool to perform the search for you.
 
 <usage>
 - If you are searching for a keyword like "config" or "logger", or for questions like "which file does X?", the Agent tool is strongly recommended

internal/agent/templates/agentic_fetch.md 🔗

@@ -1,4 +1,4 @@
-Fetches content from a URL or searches the web, then processes it using an AI model to extract information or answer questions.
+Fetch a URL or search the web using an AI sub-agent that can extract, summarize, and answer questions. Slower and costlier than fetch; use fetch for raw content or API responses.
 
 <when_to_use>
 Use this tool when you need to:

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/bash_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 802
+    content_length: 886
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,46 +23,45 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
-    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01DtaEo6K6Jtip2sMvGuVcs5","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":152,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}}
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_0177UM6XRTDtJoPA1CS7DNYu","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":177,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}}
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}         }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}            }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Create"}             }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Bash create"}             }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" test.txt file with hello bash content"}   }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" test.txt with hello bash"}       }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0   }
+      data: {"type":"content_block_stop","index":0          }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":152,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":12}     }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":177,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":12}   }
 
       event: message_stop
-      data: {"type":"message_stop"       }
+      data: {"type":"message_stop"        }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 580.545416ms
+    duration: 902.800167ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52817
+    content_length: 31194
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/download_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 823
+    content_length: 907
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_017P1SJWwhE4ejMQeJw9zZE3","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":160,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}             }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01PS6qKVAAz9MYS8HXhaUzqv","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":185,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}} }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}          }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}             }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Download"}   }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Download"}             }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" and save example.txt file"}   }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" example.txt file"}}
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0    }
+      data: {"type":"content_block_stop","index":0     }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":160,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":10} }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":185,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":8}           }
 
       event: message_stop
-      data: {"type":"message_stop"     }
+      data: {"type":"message_stop"}
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 485.789125ms
+    duration: 552.012708ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52842
+    content_length: 31219
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/fetch_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 844
+    content_length: 928
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,45 +23,46 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
+    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_015nL1HBJZUm5axuGBKq86fq","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":167,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}       }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_019PvutHiAvPGAjwc3K7ZezY","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":192,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}  }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}       }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}          }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Fetch HTML"}       }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Fetch HTML"}          }
 
       event: content_block_delta
       data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" and search for John Doe"}    }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0      }
+      data: {"type":"content_block_stop","index":0   }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":167,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":12} }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":192,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":12}           }
 
       event: message_stop
-      data: {"type":"message_stop"        }
+      data: {"type":"message_stop"      }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 755.306ms
+    duration: 675.476542ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52860
+    content_length: 31237
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/glob_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 763
+    content_length: 847
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01PsvZKYEKUZb9cyoxEW1NSm","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":142,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}        }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01JWf2kRs87U3RHaC6KS2hKm","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":167,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}     }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}       }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}           }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Finding"}          }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Finding"}         }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" .go files with glob"}         }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" all .go files with glob"}        }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0               }
+      data: {"type":"content_block_stop","index":0     }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":142,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":9}            }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":167,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":10}  }
 
       event: message_stop
-      data: {"type":"message_stop"    }
+      data: {"type":"message_stop"        }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 516.836834ms
+    duration: 509.169834ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52778
+    content_length: 31155
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/grep_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 761
+    content_length: 845
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01JX9C9a3C3mcZYmBfvTCXLZ","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":144,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}       }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01PnGjtwtdArJitw6WVHbcho","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":169,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}          }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}              }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}    }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Grep search"} }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Grep search"}    }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for 'package' in Go files"}         }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for package in Go files"}              }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0           }
+      data: {"type":"content_block_stop","index":0          }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":144,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":14}               }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":169,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":11}        }
 
       event: message_stop
-      data: {"type":"message_stop"         }
+      data: {"type":"message_stop"       }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 598.943875ms
+    duration: 526.974833ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52776
+    content_length: 31153
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/ls_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 757
+    content_length: 841
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01EZU8M1DU1DogUtWnVk1e6x","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":140,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"}}            }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01CaBgwQsqDXj8N1otrB7SVz","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":165,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"}}    }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}     }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}           }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Listing"}         }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Listing"}    }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" files with ls command"}  }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Files with ls Command"}     }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0               }
+      data: {"type":"content_block_stop","index":0             }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":140,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":9}               }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":165,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":9}              }
 
       event: message_stop
-      data: {"type":"message_stop"        }
+      data: {"type":"message_stop"              }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 584.570041ms
+    duration: 596.581875ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52770
+    content_length: 31147
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/multiedit_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 836
+    content_length: 920
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01Gfcq25Lk1PgEAVWHUChno8","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}               }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_019xXC3oRsSToBhvhwN62QVi","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":195,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}               }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}   }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"mult"}               }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"mult"}     }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"iedit Hello World to Hello Crush with comment"}              }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"iedit to change Hello World to Hello Crush"}       }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0   }
+      data: {"type":"content_block_stop","index":0    }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":14}  }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":195,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":14}      }
 
       event: message_stop
-      data: {"type":"message_stop" }
+      data: {"type":"message_stop"          }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 520.459542ms
+    duration: 596.690833ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52856
+    content_length: 31233
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/parallel_tool_calls.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 842
+    content_length: 926
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01S8DJt5aBFko4VZKAw5JK1q","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":159,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available"}}      }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01RGYbcTPp9oMAH8957nmkP8","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":184,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}           }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}               }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Glob ."}       }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Running"}     }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"go files and ls directory in parallel"}       }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" glob and ls commands in parallel"}    }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0              }
+      data: {"type":"content_block_stop","index":0         }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":159,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":13}          }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":184,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":10}         }
 
       event: message_stop
-      data: {"type":"message_stop"               }
+      data: {"type":"message_stop"            }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 584.945042ms
+    duration: 494.300334ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52867
+    content_length: 31244
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/read_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 723
+    content_length: 807
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nRead the go mod\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nRead the go mod\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,43 +26,43 @@ interactions:
     uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01LtJfXoxrXXhX2NZCJRzw7i","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":134,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}      }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01K8vQmuyKbjBQifeb2WUzZa","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":159,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}        }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}       }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}      }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Read"}              }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Go"}        }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the go mod"}          }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" module file review"}}
 
       event: content_block_stop
       data: {"type":"content_block_stop","index":0            }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":134,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":7}            }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":159,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":7}  }
 
       event: message_stop
-      data: {"type":"message_stop"      }
+      data: {"type":"message_stop"       }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 564.084541ms
+    duration: 615.172458ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52740
+    content_length: 31117
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/simple_test.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 713
+    content_length: 797
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nHello\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nHello\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,46 +23,45 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
-    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011rMH49V6yKTZeVv8uuCToD","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":131,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}        }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01EtZXHdNRPZ8DMfAdBXv1Fk","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":156,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}   }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}               }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}       }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"New"}       }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}           }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Conversation"}   }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" there"}              }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0          }
+      data: {"type":"content_block_stop","index":0               }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":131,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":6}  }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":156,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":5}        }
 
       event: message_stop
-      data: {"type":"message_stop"              }
+      data: {"type":"message_stop"         }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 892.834ms
+    duration: 770.471042ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52730
+    content_length: 31107
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/sourcegraph_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 768
+    content_length: 852
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,46 +23,45 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
-    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01EKQEbCC8jc88SBjmjhi5jz","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":145,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"}}           }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01Dn6kz1zwhHiNXgbUL57guo","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available"}}        }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}       }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Searching"}  }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Sourcegraph searching"}        }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for func main in Go repositories with Sourcegraph"}         }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for func main in Go repos"}  }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0        }
+      data: {"type":"content_block_stop","index":0    }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":145,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":16}      }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":14}    }
 
       event: message_stop
-      data: {"type":"message_stop"        }
+      data: {"type":"message_stop"}
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 787.54775ms
+    duration: 706.328458ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52790
+    content_length: 31167
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/update_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 777
+    content_length: 861
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,9 +23,10 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
+    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_013oCKmsTTzHR8ghNKXJdns6","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":145,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}} }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01NB5QFknQooeJuM7sm7ZnU4","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}} }
 
       event: content_block_start
       data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}        }
@@ -37,31 +38,31 @@ interactions:
       data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Update"}           }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" main.go print to say hello from crush"}             }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" main.go hello message from crush"}     }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0    }
+      data: {"type":"content_block_stop","index":0               }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":145,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":13}       }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":170,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":11}           }
 
       event: message_stop
-      data: {"type":"message_stop"            }
+      data: {"type":"message_stop"     }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 684.454333ms
+    duration: 596.008708ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52796
+    content_length: 31173
     host: ""

internal/agent/testdata/TestCoderAgent/anthropic-sonnet/write_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 817
+    content_length: 901
     host: ""
-    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"you will generate a short title based on the first message a user begins a conversation with\n\n\u003crules\u003e\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
+    body: '{"max_tokens":40,"messages":[{"content":[{"text":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n \u003cthink\u003e\n\n\u003c/think\u003e","type":"text"}],"role":"user"}],"model":"claude-haiku-4-5-20251001","system":[{"text":"You will generate a short title based on the first message a user begins a conversation with.\n\n\u003crules\u003e\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n\u003c/rules\u003e\n\n /no_think","type":"text"}],"stream":true}'
     headers:
       Accept:
       - application/json
@@ -23,46 +23,45 @@ interactions:
     proto_major: 2
     proto_minor: 0
     content_length: -1
-    uncompressed: true
     body: |+
       event: message_start
-      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01JQwDhoANA7GJSndUgASpAs","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":161,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}} }
+      data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_01Ut7n8edSPhwrdGNd6DAs5b","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":186,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"}}  }
 
       event: content_block_start
-      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}    }
+      data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}        }
 
       event: ping
       data: {"type": "ping"}
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Creating"}}
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Creating"}              }
 
       event: content_block_delta
-      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" config.json file with write command"}   }
+      data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" config.json with write command"}         }
 
       event: content_block_stop
-      data: {"type":"content_block_stop","index":0   }
+      data: {"type":"content_block_stop","index":0              }
 
       event: message_delta
-      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":161,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":11} }
+      data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":186,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":10}    }
 
       event: message_stop
-      data: {"type":"message_stop"             }
+      data: {"type":"message_stop"           }
 
     headers:
       Content-Type:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 525.598417ms
+    duration: 623.949ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 52833
+    content_length: 31210
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/bash_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 752
+    content_length: 836
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,25 +24,33 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ak9gymROcqmixL"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j31hpz57PbCUp5"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":"Creating"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0CjjkejY"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Create"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"smZWT2ViIs"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YIpzKHBxvDl6Dg"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" test"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dsRO6W34I11"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" File"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EXA8nGCmQ0U"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":".txt"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"y1RHAzoKKTu3"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uyRGm6tV5kIYK"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zK9BMVInPWE"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" Bash"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ffnz0HSlz0Q"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZILJtdKwT7CwHV"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" Without"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"idN9vNdm"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"hello"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BWCasWyCwjk"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" Timestamp"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n0gbdI"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" bash"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KtcNSDFqqxD"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"wYOgaaelio"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aR4JCAPH0NCMioH"}
 
-      data: {"id":"chatcmpl-DNLTI1nJf8f5pkrWwpaU26SDMJULW","object":"chat.completion.chunk","created":1774456452,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[],"usage":{"prompt_tokens":145,"completion_tokens":7,"total_tokens":152,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"eVXTQAUN3DWBYa"}
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" content"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6h9A4duE"}
+
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9YnvfPrwzZXim"}
+
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Bash"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4XlpTxpq6Ox"}
+
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"nQQOQMffUP"}
+
+      data: {"id":"chatcmpl-DTBShhjEdipyusO44qHtguBDtZYpc","object":"chat.completion.chunk","created":1775847943,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":161,"completion_tokens":11,"total_tokens":172,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"FnsCGu8aJqv5Y"}
 
       data: [DONE]
 
@@ -51,15 +59,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 1.319103375s
+    duration: 583.310209ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51167
+    content_length: 30854
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/download_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 773
+    content_length: 857
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,21 +24,29 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"l53a83AoSNOotM"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ip35hh5JVCH8fB"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"content":"Download"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0fszLlLN"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Download"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tUMsweNo"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wO4YkhksjnRn"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WmkSXDrhx1aK"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"content":" Save"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ehnIUsLCeVj"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Save"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PQZ7DNZWxzY"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"content":" Example"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Yn10h99T"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" File"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"TcF4DJd2Aue"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{"content":" File"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q7kQCbytAsZ"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" from"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"B6896ktnKvt"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"mYzATcqPdL"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" URL"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CCOz9exFCK9q"}
 
-      data: {"id":"chatcmpl-DNLTU6WoRMEDEaIrNCUPuvyWb9Abb","object":"chat.completion.chunk","created":1774456464,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9894c391cd","choices":[],"usage":{"prompt_tokens":148,"completion_tokens":5,"total_tokens":153,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"gwosEop7ZWtmER"}
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" as"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ujWXgrW87kjWO"}
+
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" example"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CePCkwEa"}
+
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":".txt"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"IhiSIOsJLoSn"}
+
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ACGJudtzHq"}
+
+      data: {"id":"chatcmpl-DTBSr8xjMtA2YjYriw992Z8CsPC1W","object":"chat.completion.chunk","created":1775847953,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":164,"completion_tokens":9,"total_tokens":173,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"AMn3T5819SD7Nr"}
 
       data: [DONE]
 
@@ -47,15 +55,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 636.694292ms
+    duration: 2.194561792s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51192
+    content_length: 30879
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/fetch_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 794
+    content_length: 878
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,27 +24,27 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Hq6GJ6CHHlClRp"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HFzR8wz8ZBVTIq"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":"Check"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"worOQrqWVBu"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"Check"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"E8TgwKSPPu2"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":" HTML"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vcBLE6ESli8"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Website"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7yiAHM7w"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":" for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GZToq93sljwz"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Content"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iSnvgIq5"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0tMeHwodUIoBAL"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4Niq20xkJjX0"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":"John"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lwwoxREHB44n"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bL9xnph8Csmyu0"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":" Doe"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wa4Twt6Jpmzi"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"John"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"IPjCWHV7Kpfq"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yI2ZApnrOmL9JXX"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Doe"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jMmNW0E1bQbq"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{"content":" Presence"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QhiyrsY"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cUQPNWKQImIihiY"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"SJVcozKkm5"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"urZcl1x3Wp"}
 
-      data: {"id":"chatcmpl-DNLTeIbn5fEbZKj1GmomUBGrkUOG2","object":"chat.completion.chunk","created":1774456474,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_6c2e0b41b2","choices":[],"usage":{"prompt_tokens":153,"completion_tokens":8,"total_tokens":161,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ObBF1NIOkET0EP"}
+      data: {"id":"chatcmpl-DTBT7z5RnFzyxDEoivkImtAvWXvSC","object":"chat.completion.chunk","created":1775847969,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[],"usage":{"prompt_tokens":169,"completion_tokens":8,"total_tokens":177,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"wZb8jaymz7IhEQ"}
 
       data: [DONE]
 
@@ -53,15 +53,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 1.414687416s
+    duration: 698.907958ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51210
+    content_length: 30897
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/glob_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 713
+    content_length: 797
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,29 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pMtKY4sEu1jtpF"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Gyh2d77d9h9fei"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Finding"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SxnCdjkrg"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Finding"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"h9ZQtv0Lw"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" ."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4zPlBnZhMTifrL"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" ."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZXciTfqJ5zlGRa"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SUef5HGA4b8Cft"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SWxhda8L27XOZ7"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Algj74QWfR"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"12bhJiwbyj"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X9LMrHw9A8o"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Using"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"deHf8Gv1T4"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Glob"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RovWvD6dTPy"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Glob"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2MNUCMpPoYn"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zPD1fBiTLB8uW"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"lXGvNnQLfK"}
 
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PWReXPw7"}
-
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Directory"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"26mLkk"}
-
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"dtsbQhSSKo"}
-
-      data: {"id":"chatcmpl-DNLTk0x7QU5SmrHLCW8nHq68WApVi","object":"chat.completion.chunk","created":1774456480,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":137,"completion_tokens":9,"total_tokens":146,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"g4ryvzsHRzZXou"}
+      data: {"id":"chatcmpl-DTBTKUHr31EPvyQMFbXdeejY7EZHs","object":"chat.completion.chunk","created":1775847982,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":153,"completion_tokens":6,"total_tokens":159,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"l9uSLJDmJOqQiN"}
 
       data: [DONE]
 
@@ -55,15 +49,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 714.728166ms
+    duration: 424.062292ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51128
+    content_length: 30815
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/grep_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 711
+    content_length: 795
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,33 +24,31 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uYyTiIQz0zgplw"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bl27TTSk47YiRv"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Using"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCMpreR57CN"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Search"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jyQCPGnGnD"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Gre"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vhhdv4cLF5gE"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ccDq7Sajt9t1"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"p"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"buwfk2P0VKd18Gp"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZoPB12juvEv0Y4"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mhPukHs1ZJZ7h"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"package"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"b6sES8uG0"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Find"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JrC6aT9kFiO"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6UnCnrWxWDKKy2F"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" \""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"N9HURje5reRyU"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mc0g2xOQRptkb"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Package"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8W0GAvLPN"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eHiJUSJsN3i6P"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M1GYcf28glGrGX"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8onElgzCTD"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"F92WMyZ0C6KHQ"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" using"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i7NAD8buYQ"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eYrDbEEfhd2bm"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" grep"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7omcvQ2zFR9"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"TeZoFDOqBC"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"XRLHHqhIyd"}
 
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"TA0GZeApUv"}
-
-      data: {"id":"chatcmpl-DNLTpKJVyp5Lf7K0hb9g1oCeQ1Jf3","object":"chat.completion.chunk","created":1774456485,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":138,"completion_tokens":11,"total_tokens":149,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"mgDnggJoflZ4P"}
+      data: {"id":"chatcmpl-DTBTOFxlnrQzL6Q4euaMFP0ITI1fb","object":"chat.completion.chunk","created":1775847986,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":154,"completion_tokens":10,"total_tokens":164,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"5UCFYEgY93Mj3"}
 
       data: [DONE]
 
@@ -59,15 +57,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 884.009042ms
+    duration: 424.598542ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51126
+    content_length: 30813
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/ls_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 707
+    content_length: 791
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,27 +24,21 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"REGF7fP3BceGRl"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1UUoppHKnlOYUk"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":"Listing"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"G1JxtpiTn"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Listing"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mM8p9AbGv"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X1ADQKBrDK"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pL4dtpcB1y"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cJAUQxdX14I2J"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VO0rgaQFv1X"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1ztuwP5N"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" ls"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wB095nslLkxPh"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Directory"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mK9NJ8"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Command"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ubq3RY4B"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VHjFAbZ7TQs"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"X30CeKPPiH"}
 
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" LS"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tpiVLcH8WnXMb"}
-
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Command"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ulw8QDNP"}
-
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"UqB1kF1w21"}
-
-      data: {"id":"chatcmpl-DNLTtlrOkX7bjJZckn8V4dImKRy94","object":"chat.completion.chunk","created":1774456489,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[],"usage":{"prompt_tokens":135,"completion_tokens":8,"total_tokens":143,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"8PP3wNQUKT0u9o"}
+      data: {"id":"chatcmpl-DTBTViJPe8lif4yuMeeyz7X4Am8Jq","object":"chat.completion.chunk","created":1775847993,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":151,"completion_tokens":5,"total_tokens":156,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"HsDTBXKAqa5Uib"}
 
       data: [DONE]
 
@@ -53,15 +47,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 600.211084ms
+    duration: 690.410167ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51120
+    content_length: 30807
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/multiedit_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 786
+    content_length: 870
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,23 +24,29 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HFRi6wt7sdJD7K"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ES3H5R6rrAELN3"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":"Updating"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eUz8plm9"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Editing"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4E69x3U39"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Greeting"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y2flVV1"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" main"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ohg0gOCEB97"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Message"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hi2D9cm4"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":".go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Lt6wj4gMIcyIe"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X5h37onohN1O"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EKhSYxOQqF6ZbZM"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Adding"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eZ88rSCGN"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Change"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"R5oYkt1j6"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{"content":" Comment"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Hdg4fmnv"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Greeting"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xi7sy2I"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"4bV0QC3zDf"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hBUsRQlVwpjU"}
 
-      data: {"id":"chatcmpl-DNLTyG4VYU1SAZqGTWsqL91dHyBYf","object":"chat.completion.chunk","created":1774456494,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_be98c6bd39","choices":[],"usage":{"prompt_tokens":157,"completion_tokens":6,"total_tokens":163,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"uUqgNlLbexVFxe"}
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Add"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FPvNUSqT0EQ4"}
+
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Comment"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0iMaM2Q2"}
+
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"hy2tQRrruS"}
+
+      data: {"id":"chatcmpl-DTBwIBSrGhw5Qx6YzZ3FLUt5Zr38r","object":"chat.completion.chunk","created":1775849778,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":173,"completion_tokens":9,"total_tokens":182,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"HXGzvV9LVSJp7P"}
 
       data: [DONE]
 
@@ -49,15 +55,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 924.968666ms
+    duration: 532.62975ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51206
+    content_length: 30893
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/parallel_tool_calls.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 792
+    content_length: 876
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,29 +24,31 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lH98qLyoldWIc9"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GlJsJCepcpNmGp"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Parallel"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gNp77kol"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Parallel"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XcZtR2Aw"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Commands"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7yhQp0r"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Execution"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uIVoqp"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zbaYREjzbXP5"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"g69IIsZhkIm1A"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" ."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QeR2FLWlTMygKJ"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Glob"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QBhvu10YwcM"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rZvtiTUwa9gc5P"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZXlwpuZPQkL8"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9kglcpYGKF"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" LS"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dzpTJ7cu1ydsl"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gpgbw2Rf0BAU"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nZQf5hR5RLjD"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Directory"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"IMrooe"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" ."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gpeNnuvduDJlPP"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Listing"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n3y0kd0t"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"42BBnnQAr8wIg8"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Kl0WPDg2JY"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5tRtsu32QZ"}
 
-      data: {"id":"chatcmpl-DNLVSW1wlPCzUP2DHwUrRusz2yoRT","object":"chat.completion.chunk","created":1774456586,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":154,"completion_tokens":9,"total_tokens":163,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"0eA5bb9Z0LyJc0"}
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"3PgLwKh330"}
+
+      data: {"id":"chatcmpl-DTBV8tpswlz4avSwi7JkfmCW31tNt","object":"chat.completion.chunk","created":1775848094,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":170,"completion_tokens":10,"total_tokens":180,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ERSXp7nJ5kQ0Q"}
 
       data: [DONE]
 
@@ -55,15 +57,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 682.044666ms
+    duration: 605.141916ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51217
+    content_length: 30904
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/read_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 673
+    content_length: 757
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,21 +24,21 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2fLhd1wGudN0X8"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6HiEiB8HX3Zelt"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Reading"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5u06Dqtj5"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Understanding"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"f71"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"der23rJV27R0"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5trz9i18qdDn"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"67eeIdkhgdKjN"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7sV7YlGq8wFU8"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Mod"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JK0e4jUywCWq"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Module"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bi1bbJbBH"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" File"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PRUv8ruoaaY"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" System"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VrqvQeRPa"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"cZ0AotOMQp"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"kAE9G1K7Tb"}
 
-      data: {"id":"chatcmpl-DNLSu63OpjOn8cb7DwZwoLjQV0wjd","object":"chat.completion.chunk","created":1774456428,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":129,"completion_tokens":5,"total_tokens":134,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"hy1N4ONQpPFz7g"}
+      data: {"id":"chatcmpl-DTBSDLMiDBYMB7R8mrUKOEgQ1ZmT4","object":"chat.completion.chunk","created":1775847913,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":145,"completion_tokens":5,"total_tokens":150,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"lXr3eSUfBpvRzv"}
 
       data: [DONE]
 
@@ -47,15 +47,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 1.296206084s
+    duration: 2.223565125s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51090
+    content_length: 30777
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/simple_test.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 663
+    content_length: 747
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,15 +24,15 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLSsXOs37ig7DqzPR7RJsBrgOpkW","object":"chat.completion.chunk","created":1774456426,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xpUMdIcnpMeUJ3"}
+      data: {"id":"chatcmpl-DTBS9KD8X0Mlnl19ZMcxmOdgxaxTQ","object":"chat.completion.chunk","created":1775847909,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AdDeGbcc7dHmjr"}
 
-      data: {"id":"chatcmpl-DNLSsXOs37ig7DqzPR7RJsBrgOpkW","object":"chat.completion.chunk","created":1774456426,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":"User"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZSfj5D8D3zBr"}
+      data: {"id":"chatcmpl-DTBS9KD8X0Mlnl19ZMcxmOdgxaxTQ","object":"chat.completion.chunk","created":1775847909,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"Greeting"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"M3BSMEDL"}
 
-      data: {"id":"chatcmpl-DNLSsXOs37ig7DqzPR7RJsBrgOpkW","object":"chat.completion.chunk","created":1774456426,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{"content":" Greeting"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3JkzS0G"}
+      data: {"id":"chatcmpl-DTBS9KD8X0Mlnl19ZMcxmOdgxaxTQ","object":"chat.completion.chunk","created":1775847909,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Message"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6iUQFg26"}
 
-      data: {"id":"chatcmpl-DNLSsXOs37ig7DqzPR7RJsBrgOpkW","object":"chat.completion.chunk","created":1774456426,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"HmISF5D0TH"}
+      data: {"id":"chatcmpl-DTBS9KD8X0Mlnl19ZMcxmOdgxaxTQ","object":"chat.completion.chunk","created":1775847909,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"8y7EZOYm9f"}
 
-      data: {"id":"chatcmpl-DNLSsXOs37ig7DqzPR7RJsBrgOpkW","object":"chat.completion.chunk","created":1774456426,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_92d15debfd","choices":[],"usage":{"prompt_tokens":126,"completion_tokens":2,"total_tokens":128,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"c9b4bWVUtITZOd"}
+      data: {"id":"chatcmpl-DTBS9KD8X0Mlnl19ZMcxmOdgxaxTQ","object":"chat.completion.chunk","created":1775847909,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[],"usage":{"prompt_tokens":142,"completion_tokens":2,"total_tokens":144,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"B9RoBbXjiQRgSF"}
 
       data: [DONE]
 
@@ -41,15 +41,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 2.221166541s
+    duration: 2.473751083s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51080
+    content_length: 30767
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/sourcegraph_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 718
+    content_length: 802
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,35 +24,35 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4BTtMVWSsc67nO"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5kG5O1A43eibDJ"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Searching"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u5dEho6"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Searching"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tdSzgIc"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PkxyNJt8UUu8XY"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" '"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tmZP7uZlCvzVRi"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"func"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lRxnzekgLRUI"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"func"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YsfebVLDiCzu"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" main"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oVxxgr9Cy87"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" main"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q88QwG9ngyu"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vAxEDgSzQTmJJP2"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"'"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"B036jaBzefBtzKL"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wk6YTNLpykE0K"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"S0zqsNVBKRm9L"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zbC53NngWNuAP"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"j7ANV9tb3DUC8"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Re"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mlFx7kpDlvLkj"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Re"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"unfuMA7HY2MbN"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"positories"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RMn6il"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"positories"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Cuk8nR"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s0E4rMH57cv"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Using"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rm6ttFhyp6"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Source"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JBi6JLhx7"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Source"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9dOclbEVR"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"graph"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3lXPcuhv6Jp"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"graph"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jtIKG9hYHfd"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"F9DVilghqP"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Mo49yPMTvh"}
 
-      data: {"id":"chatcmpl-DNLUHmZ1zJ6XQObTQxMsgGm12G9qg","object":"chat.completion.chunk","created":1774456513,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":138,"completion_tokens":12,"total_tokens":150,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"054TZEKggLyNj"}
+      data: {"id":"chatcmpl-DTBUbbGQVZAktEDyQ7m4poBHyoc8G","object":"chat.completion.chunk","created":1775848061,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":154,"completion_tokens":12,"total_tokens":166,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"sEPbr5nYPwbiX"}
 
       data: [DONE]
 
@@ -61,15 +61,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 2.196706958s
+    duration: 455.111834ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51140
+    content_length: 30827
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/update_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 727
+    content_length: 811
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,25 +24,31 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kyCrZaCvIvtcJ0"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XiDvZTyJxQP7Wx"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":"Update"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"B0SZU1IRsc"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"Update"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Kwws4GTQvc"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":" main"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"H09PWm1kBiq"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" main"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CKFDfDXsFdZ"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":".go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fDzEeCSonwasd"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":".go"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kIoLxopTEYkwW"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ILGeCAVJBQ30Ujh"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"U0096QLSQEvqa"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":" Change"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2VLAaYsIm"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Print"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uS1g40cgJB"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":" Print"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oqtkIHqoeR"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" \""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dYMU5ssbFCLTN"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{"content":" Message"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yxgBh188"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"Hello"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7OjhUDzYLiV"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"RIXrXeant8"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" from"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kd9TQoJtczG"}
 
-      data: {"id":"chatcmpl-DNLT275CAqqb3FVuXGKXsGTOtzgMt","object":"chat.completion.chunk","created":1774456436,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_302b87bc9f","choices":[],"usage":{"prompt_tokens":139,"completion_tokens":7,"total_tokens":146,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"BRZfoPmqVdF0Br"}
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":" Crush"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Dxzbbl0miI"}
+
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{"content":"\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QvtEkvgdVFFMrO"}
+
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"pSwNgqujle"}
+
+      data: {"id":"chatcmpl-DTBSQDHEN4I5KzLMNCIljfZucWic9","object":"chat.completion.chunk","created":1775847926,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_32f061d4be","choices":[],"usage":{"prompt_tokens":155,"completion_tokens":10,"total_tokens":165,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"VzZbhjcibajyj"}
 
       data: [DONE]
 
@@ -51,15 +57,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 1.529203542s
+    duration: 1.264199208s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51146
+    content_length: 30833
     host: ""

internal/agent/testdata/TestCoderAgent/openai-gpt-5/write_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 767
+    content_length: 851
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"gpt-4o","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,25 +24,25 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nDxfWT7oRFxst6"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EX0ikWZWRqPJPo"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":"Creating"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RWfg0Mnw"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":"Creating"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Cxwu1MJS"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hc4Rxu0UG4JOFT"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" config"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"huiyrtI7q"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" New"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RMwWczVUZKrF"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":".json"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZgjrpNOKfBl"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" File"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4MG211x6hoE"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AVwdINmLUMR"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" Named"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fgisfXMeAg"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Sample"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4LU0Xo82N"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":" config"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m9VSTgbx6"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" JSON"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V8O3P8dog8l"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{"content":".json"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"x0fWDdVQ846"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{"content":" Content"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rPBmCUGm"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Sc1rkinrDG"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"b31EDRCL5b"}
 
-      data: {"id":"chatcmpl-DNLUvBP2we6ypSAHwNO6rkeCGTXvc","object":"chat.completion.chunk","created":1774456553,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_49bd10b094","choices":[],"usage":{"prompt_tokens":153,"completion_tokens":7,"total_tokens":160,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"lr2acshDNFOEcQ"}
+      data: {"id":"chatcmpl-DTBV0n6tjwbhP4dljyR8Beo5fTKL6","object":"chat.completion.chunk","created":1775848086,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_9860921a69","choices":[],"usage":{"prompt_tokens":169,"completion_tokens":7,"total_tokens":176,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"dUflUOLLQtoMQw"}
 
       data: [DONE]
 
@@ -51,15 +51,15 @@ interactions:
       - text/event-stream; charset=utf-8
     status: 200 OK
     code: 200
-    duration: 810.570875ms
+    duration: 541.715708ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51183
+    content_length: 30870
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/bash_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 803
+    content_length: 887
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,27 +26,25 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      : OPENROUTER PROCESSING
-
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"Create","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"Create","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" test","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" test","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":".txt","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":".txt","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" with","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" with","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" bash","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" bash","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" using","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" using","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" bash","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" bash","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456635-9s4O9wmF0LoJItmVTX4s","object":"chat.completion.chunk","created":1774456635,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":147,"completion_tokens":9,"total_tokens":156,"cost":0.0000246,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000246,"upstream_inference_prompt_cost":0.0000147,"upstream_inference_completions_cost":0.0000099},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848133-vVvlZfNWdhFhpeO7z5Sl","object":"chat.completion.chunk","created":1775848133,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":163,"completion_tokens":9,"total_tokens":172,"cost":0.0000262,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000262,"upstream_inference_prompt_cost":0.0000163,"upstream_inference_completions_cost":0.0000099},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -55,15 +53,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 1.048188458s
+    duration: 842.086375ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51316
+    content_length: 31003
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/download_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 824
+    content_length: 908
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,19 +26,19 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Download","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Download","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":".txt from example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":".txt from example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"-files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"-files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":".online-convert.com","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":".online-convert.com","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456643-2NA5CsHETCqN6Kpoh5gg","object":"chat.completion.chunk","created":1774456643,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":154,"completion_tokens":10,"total_tokens":164,"cost":0.000022815,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000351,"upstream_inference_prompt_cost":0.0000231,"upstream_inference_completions_cost":0.000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848142-yji54RTp8WmHXnz9zjAZ","object":"chat.completion.chunk","created":1775848142,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":170,"completion_tokens":10,"total_tokens":180,"cost":0.000024375,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000375,"upstream_inference_prompt_cost":0.0000255,"upstream_inference_completions_cost":0.000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -47,15 +47,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 684.727584ms
+    duration: 827.37675ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51341
+    content_length: 31028
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/fetch_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 845
+    content_length: 929
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,19 +24,17 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      : OPENROUTER PROCESSING
-
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Check","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"Check","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" if example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" if example","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":".html contains John","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":".html contains John","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" Doe","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" Doe","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456656-kLgickPBoh5tJwTa9fWO","object":"chat.completion.chunk","created":1774456656,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":159,"completion_tokens":7,"total_tokens":166,"cost":0.0000209625,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003225,"upstream_inference_prompt_cost":0.00002385,"upstream_inference_completions_cost":0.0000084},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848152-c06ZG7R2WQwamZxuORB6","object":"chat.completion.chunk","created":1775848152,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":171,"completion_tokens":8,"total_tokens":179,"cost":0.00003525,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003525,"upstream_inference_prompt_cost":0.00002565,"upstream_inference_completions_cost":0.0000096},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -45,15 +43,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 561.340875ms
+    duration: 624.011292ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51359
+    content_length: 31046
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/glob_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 764
+    content_length: 848
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,29 +24,21 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"Find","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" all","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" .","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"go","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"Find","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" directory","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" all .go files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" using","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" in current directory using","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" glob","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" glob","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456666-K5jCTkoQpskLWE04K0W8","object":"chat.completion.chunk","created":1774456666,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":139,"completion_tokens":11,"total_tokens":150,"cost":0.000026,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000026,"upstream_inference_prompt_cost":0.0000139,"upstream_inference_completions_cost":0.0000121},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848160-EXZu21IQsNfb2DPfrmS7","object":"chat.completion.chunk","created":1775848160,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":159,"completion_tokens":10,"total_tokens":169,"cost":0.00003885,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003885,"upstream_inference_prompt_cost":0.00002385,"upstream_inference_completions_cost":0.000015},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -55,15 +47,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 447.589459ms
+    duration: 1.024881084s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51277
+    content_length: 30964
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/grep_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 762
+    content_length: 846
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,15 +24,19 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"gen-1774456675-MJCODZaHeH6YCYQp6Dsu","object":"chat.completion.chunk","created":1774456675,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"Search","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
+
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Search","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456675-MJCODZaHeH6YCYQp6Dsu","object":"chat.completion.chunk","created":1774456675,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" for package in Go","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" for '","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456675-MJCODZaHeH6YCYQp6Dsu","object":"chat.completion.chunk","created":1774456675,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" files using grep","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"package' in Go","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456675-MJCODZaHeH6YCYQp6Dsu","object":"chat.completion.chunk","created":1774456675,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" files using grep","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456675-MJCODZaHeH6YCYQp6Dsu","object":"chat.completion.chunk","created":1774456675,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":140,"completion_tokens":9,"total_tokens":149,"cost":0.0000225,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000225,"upstream_inference_prompt_cost":0.0000126,"upstream_inference_completions_cost":0.0000099},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+
+      data: {"id":"gen-1775848165-gwf5ZdJEWzvjfzj9U74D","object":"chat.completion.chunk","created":1775848165,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":160,"completion_tokens":10,"total_tokens":170,"cost":0.0000234,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000036,"upstream_inference_prompt_cost":0.000024,"upstream_inference_completions_cost":0.000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -41,15 +45,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 352.105208ms
+    duration: 841.949208ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51275
+    content_length: 30962
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/ls_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 758
+    content_length: 842
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,17 +24,17 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      : OPENROUTER PROCESSING
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"List","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456682-e8NSNDQng0ucLwb9TZoG","object":"chat.completion.chunk","created":1774456682,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"List","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" files in current directory","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456682-e8NSNDQng0ucLwb9TZoG","object":"chat.completion.chunk","created":1774456682,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" files in current directory","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" with","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456682-e8NSNDQng0ucLwb9TZoG","object":"chat.completion.chunk","created":1774456682,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" using ls","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" ls","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456682-e8NSNDQng0ucLwb9TZoG","object":"chat.completion.chunk","created":1774456682,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456682-e8NSNDQng0ucLwb9TZoG","object":"chat.completion.chunk","created":1774456682,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":141,"completion_tokens":7,"total_tokens":148,"cost":0.0000192075,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002955,"upstream_inference_prompt_cost":0.00002115,"upstream_inference_completions_cost":0.0000084},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848171-AilTnncZvKu3pyyDGKQh","object":"chat.completion.chunk","created":1775848171,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":153,"completion_tokens":8,"total_tokens":161,"cost":0.00002257,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002257,"upstream_inference_prompt_cost":0.00001377,"upstream_inference_completions_cost":0.0000088},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -43,15 +43,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 854.344417ms
+    duration: 420.668167ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51269
+    content_length: 30956
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/multiedit_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 837
+    content_length: 921
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,19 +26,21 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"Use","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
+
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"Use","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" multiedit to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" multiedit to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" update greeting","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" update","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" and add comment in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" greeting and add","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" main.go","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" comment","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456692-1bw7QI4pqgllPdwXginq","object":"chat.completion.chunk","created":1774456692,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":160,"completion_tokens":14,"total_tokens":174,"cost":0.0000408,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000408,"upstream_inference_prompt_cost":0.000024,"upstream_inference_completions_cost":0.0000168},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848177-Y6umktjag466F1KjsWzb","object":"chat.completion.chunk","created":1775848177,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":176,"completion_tokens":11,"total_tokens":187,"cost":0.00002794,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002794,"upstream_inference_prompt_cost":0.00001584,"upstream_inference_completions_cost":0.0000121},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -47,15 +49,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 683.094417ms
+    duration: 784.322667ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51355
+    content_length: 31042
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/parallel_tool_calls.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 843
+    content_length: 927
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,29 +26,23 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"Run","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" glob","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
-
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" .","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"go","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"Run","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" glob and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" ls in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" ls","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" parallel to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" find .go files","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":" parallel","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" and list directory","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456756-qbHZbvAkQphT61DYgXUh","object":"chat.completion.chunk","created":1774456756,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Parasail","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":156,"completion_tokens":11,"total_tokens":167,"cost":0.0000277,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000277,"upstream_inference_prompt_cost":0.0000156,"upstream_inference_completions_cost":0.0000121},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848229-REjGu5cgiYpV7zhESWI8","object":"chat.completion.chunk","created":1775848229,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":172,"completion_tokens":15,"total_tokens":187,"cost":0.00003198,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003198,"upstream_inference_prompt_cost":0.00001548,"upstream_inference_completions_cost":0.0000165},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -57,15 +51,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 485.97875ms
+    duration: 802.121416ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51366
+    content_length: 31053
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/read_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 724
+    content_length: 808
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,15 +24,13 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      : OPENROUTER PROCESSING
-
-      data: {"id":"gen-1774456604-qXmqMZzVgJogU5OQuEYa","object":"chat.completion.chunk","created":1774456604,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"Read","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848108-3Wrv1w0bSoRkjgrPmcYd","object":"chat.completion.chunk","created":1775848108,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"Read","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456604-qXmqMZzVgJogU5OQuEYa","object":"chat.completion.chunk","created":1774456604,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" the go mod","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848108-3Wrv1w0bSoRkjgrPmcYd","object":"chat.completion.chunk","created":1775848108,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":" the go mod","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456604-qXmqMZzVgJogU5OQuEYa","object":"chat.completion.chunk","created":1774456604,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848108-3Wrv1w0bSoRkjgrPmcYd","object":"chat.completion.chunk","created":1775848108,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456604-qXmqMZzVgJogU5OQuEYa","object":"chat.completion.chunk","created":1774456604,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":135,"completion_tokens":4,"total_tokens":139,"cost":0.00002625,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002625,"upstream_inference_prompt_cost":0.00002025,"upstream_inference_completions_cost":0.000006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848108-3Wrv1w0bSoRkjgrPmcYd","object":"chat.completion.chunk","created":1775848108,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":147,"completion_tokens":5,"total_tokens":152,"cost":0.00002805,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002805,"upstream_inference_prompt_cost":0.00002205,"upstream_inference_completions_cost":0.000006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -41,15 +39,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 794.436292ms
+    duration: 616.527791ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51239
+    content_length: 30926
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/simple_test.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 714
+    content_length: 798
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,13 +26,11 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      : OPENROUTER PROCESSING
-
-      data: {"id":"gen-1774456601-VF56KloP49tZGyNR9PD6","object":"chat.completion.chunk","created":1774456601,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848106-BMdw8CLic23r38YJvppB","object":"chat.completion.chunk","created":1775848106,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456601-VF56KloP49tZGyNR9PD6","object":"chat.completion.chunk","created":1774456601,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848106-BMdw8CLic23r38YJvppB","object":"chat.completion.chunk","created":1775848106,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456601-VF56KloP49tZGyNR9PD6","object":"chat.completion.chunk","created":1774456601,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":132,"completion_tokens":1,"total_tokens":133,"cost":0.00001365,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000021,"upstream_inference_prompt_cost":0.0000198,"upstream_inference_completions_cost":0.0000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848106-BMdw8CLic23r38YJvppB","object":"chat.completion.chunk","created":1775848106,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":148,"completion_tokens":1,"total_tokens":149,"cost":0.00001521,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000234,"upstream_inference_prompt_cost":0.0000222,"upstream_inference_completions_cost":0.0000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -41,15 +39,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 1.54613175s
+    duration: 1.755025916s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51229
+    content_length: 30916
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/sourcegraph_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 769
+    content_length: 853
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,17 +26,19 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Search","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      : OPENROUTER PROCESSING
+
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Search","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" for func","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" for func","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" main in Go repositories","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" main in Go repositories","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" using Sourcegraph","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" using Sourcegraph","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456734-n88rDjuZXAhxc7zcBVBK","object":"chat.completion.chunk","created":1774456734,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":144,"completion_tokens":10,"total_tokens":154,"cost":0.00002184,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000336,"upstream_inference_prompt_cost":0.0000216,"upstream_inference_completions_cost":0.000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848201-JsSCFbc2Ugp9h31uvdgd","object":"chat.completion.chunk","created":1775848201,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":160,"completion_tokens":10,"total_tokens":170,"cost":0.0000234,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000036,"upstream_inference_prompt_cost":0.000024,"upstream_inference_completions_cost":0.000012},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -45,15 +47,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 956.934708ms
+    duration: 1.073539541s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51289
+    content_length: 30976
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/update_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 778
+    content_length: 862
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,17 +26,17 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Update","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"Update","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" main.go to print","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" main.go to print","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" hello","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" from crush","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":" from crush","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456613-kga4lFcyckfpo5fCgXsx","object":"chat.completion.chunk","created":1774456613,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":145,"completion_tokens":8,"total_tokens":153,"cost":0.0000203775,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003135,"upstream_inference_prompt_cost":0.00002175,"upstream_inference_completions_cost":0.0000096},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848114-Z2x1Sp6hvWVcLByQ8VID","object":"chat.completion.chunk","created":1775848114,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"DeepInfra","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":157,"completion_tokens":9,"total_tokens":166,"cost":0.00002403,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00002403,"upstream_inference_prompt_cost":0.00001413,"upstream_inference_completions_cost":0.0000099},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -45,15 +45,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 598.857875ms
+    duration: 856.267708ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51295
+    content_length: 30982
     host: ""

internal/agent/testdata/TestCoderAgent/openrouter-kimi-k2/write_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 818
+    content_length: 902
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"qwen/qwen3-next-80b-a3b-instruct","max_tokens":40,"stream_options":{"include_usage":true},"usage":{"include":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -26,17 +26,15 @@ interactions:
     body: |+
       : OPENROUTER PROCESSING
 
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"Create","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848221-dKPjp0bQ9hCZ0qlk90M5","object":"chat.completion.chunk","created":1775848221,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"Create","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" config.json with sample","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848221-dKPjp0bQ9hCZ0qlk90M5","object":"chat.completion.chunk","created":1775848221,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" config.json with test","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" JSON","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848221-dKPjp0bQ9hCZ0qlk90M5","object":"chat.completion.chunk","created":1775848221,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":" data","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
 
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":" content","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]}
+      data: {"id":"gen-1775848221-dKPjp0bQ9hCZ0qlk90M5","object":"chat.completion.chunk","created":1775848221,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
 
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]}
-
-      data: {"id":"gen-1774456747-3dOGy2K1ZrWDbyNYaNyT","object":"chat.completion.chunk","created":1774456747,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Alibaba","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":159,"completion_tokens":7,"total_tokens":166,"cost":0.0000209625,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003225,"upstream_inference_prompt_cost":0.00002385,"upstream_inference_completions_cost":0.0000084},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
+      data: {"id":"gen-1775848221-dKPjp0bQ9hCZ0qlk90M5","object":"chat.completion.chunk","created":1775848221,"model":"qwen/qwen3-next-80b-a3b-instruct-2509","provider":"Novita","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":175,"completion_tokens":6,"total_tokens":181,"cost":0.00003525,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003525,"upstream_inference_prompt_cost":0.00002625,"upstream_inference_completions_cost":0.000009},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}}
 
       data: [DONE]
 
@@ -45,15 +43,15 @@ interactions:
       - text/event-stream
     status: 200 OK
     code: 200
-    duration: 569.744791ms
+    duration: 957.28575ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51332
+    content_length: 31019
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/bash_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 757
+    content_length: 841
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse bash to create a file named test.txt with content ''hello bash''. do not print its timestamp\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,21 +24,19 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"B"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Create"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"ash"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" creation"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" bash"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" without"}}]}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
 
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" timestamp"}}]}
-
-      data: {"id":"20260326003947ebfb4d16b83248b7","created":1774456787,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":140,"completion_tokens":10,"total_tokens":150,"prompt_tokens_details":{"cached_tokens":114}}}
+      data: {"id":"2026041103110119d5e5e9f55a4783","created":1775848261,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":156,"completion_tokens":9,"total_tokens":165,"prompt_tokens_details":{"cached_tokens":130}}}
 
       data: [DONE]
 
@@ -47,15 +45,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 670.626042ms
+    duration: 561.313167ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51156
+    content_length: 30843
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/download_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 778
+    content_length: 862
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://example-files.online-convert.com/document/txt/example.txt and save it as example.txt\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,19 +24,19 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Download"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Download"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" example"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" save"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" from"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" text"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" URL"}}]}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
 
-      data: {"id":"20260326003953b49a83f756f94900","created":1774456793,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":143,"completion_tokens":9,"total_tokens":152,"prompt_tokens_details":{"cached_tokens":114}}}
+      data: {"id":"2026041103110800a5c8e46aca4473","created":1775848268,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":159,"completion_tokens":9,"total_tokens":168,"prompt_tokens_details":{"cached_tokens":130}}}
 
       data: [DONE]
 
@@ -45,15 +45,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 804.547167ms
+    duration: 572.8685ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51181
+    content_length: 30868
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/fetch_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 799
+    content_length: 883
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://example-files.online-convert.com/website/html/example.html and tell me if it contains the word ''John Doe''\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,31 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Fetch"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Check"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" for"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" check"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" John"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" for"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Doe"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" '"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" in"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"John"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" HTML"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Doe"}}]}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
 
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"'"}}]}
-
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" in"}}]}
-
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" HTML"}}]}
-
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
-
-      data: {"id":"2026032600395898ee153e91124c9d","created":1774456798,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":148,"completion_tokens":15,"total_tokens":163,"prompt_tokens_details":{"cached_tokens":114}}}
+      data: {"id":"2026041103111447b6f2618be349f4","created":1775848274,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":164,"completion_tokens":11,"total_tokens":175,"prompt_tokens_details":{"cached_tokens":130}}}
 
       data: [DONE]
 
@@ -57,15 +49,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 665.613834ms
+    duration: 558.774375ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51199
+    content_length: 30886
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/glob_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 718
+    content_length: 802
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,19 +24,19 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Go"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Find"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" search"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Files"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" glob"}}]}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Glob"}}]}
 
-      data: {"id":"2026032600400301b4c6a0d1fe40ef","created":1774456803,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":132,"completion_tokens":9,"total_tokens":141,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"2026041103112049ecef9602e0472b","created":1775848280,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":148,"completion_tokens":9,"total_tokens":157,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -45,15 +45,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 671.620667ms
+    duration: 570.766917ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51117
+    content_length: 30804
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/grep_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 716
+    content_length: 800
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,17 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"grep"}}]}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Search"}}]}
 
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" package"}}]}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" '"}}]}
 
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" *."}}]}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"package"}}]}
 
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"go"}}]}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"'"}}]}
 
-      data: {"id":"20260326004006160d61700e42415d","created":1774456806,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":133,"completion_tokens":8,"total_tokens":141,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" in"}}]}
+
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
+
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" files"}}]}
+
+      data: {"id":"202604110311232b54345db0b44f5a","created":1775848283,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":149,"completion_tokens":11,"total_tokens":160,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -43,15 +49,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 705.752167ms
+    duration: 630.303875ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51115
+    content_length: 30802
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/ls_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 712
+    content_length: 796
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,19 +24,17 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"List"}}]}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"List"}}]}
 
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" files"}}]}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" files"}}]}
 
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
 
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" ls"}}]}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" ls"}}]}
 
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" command"}}]}
-
-      data: {"id":"202603260040152d5e76d3cea9425a","created":1774456815,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":130,"completion_tokens":9,"total_tokens":139,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"202604110311288bd030015eb04f33","created":1775848288,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":146,"completion_tokens":8,"total_tokens":154,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -45,15 +43,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 640.512209ms
+    duration: 541.881125ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51109
+    content_length: 30796
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/multiedit_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 791
+    content_length: 875
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse multiedit to change ''Hello, World!'' to ''Hello, Crush!'' and add a comment ''// Greeting'' above the fmt.Println line in main.go\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,25 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Mult"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Mult"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"ied"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"ied"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"it"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"it"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" changes"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" in"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" G"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"reeting"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Change"}}]}
 
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
-
-      data: {"id":"20260326004018b881b8e25e054a99","created":1774456818,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":153,"completion_tokens":12,"total_tokens":165,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"202604110311317bc7ba741be145a0","created":1775848291,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":169,"completion_tokens":11,"total_tokens":180,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -51,15 +49,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 700.349292ms
+    duration: 550.673917ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51195
+    content_length: 30882
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/parallel_tool_calls.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 797
+    content_length: 881
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files and use ls to list the current directory, it is very important that you run both tool calls in parallel\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,25 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"glob"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Parallel"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" find"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" glob"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" go"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" and"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" files"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" ls"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" ls"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" for"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" list"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" directory"}}]}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" files"}}]}
 
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" parallel"}}]}
-
-      data: {"id":"202603260040440feda096cd8a4f0c","created":1774456844,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":149,"completion_tokens":12,"total_tokens":161,"prompt_tokens_details":{"cached_tokens":122}}}
+      data: {"id":"2026041103115861920b9d636c4e17","created":1775848318,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":165,"completion_tokens":11,"total_tokens":176,"prompt_tokens_details":{"cached_tokens":138}}}
 
       data: [DONE]
 
@@ -51,15 +49,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 587.556292ms
+    duration: 562.572458ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51206
+    content_length: 30893
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/read_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 678
+    content_length: 762
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,17 +24,15 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103104011fb4c996fa24f0e","created":1775848240,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Read"}}]}
+      data: {"id":"2026041103104011fb4c996fa24f0e","created":1775848240,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Go"}}]}
 
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" the"}}]}
+      data: {"id":"2026041103104011fb4c996fa24f0e","created":1775848240,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Mod"}}]}
 
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" go"}}]}
+      data: {"id":"2026041103104011fb4c996fa24f0e","created":1775848240,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Analysis"}}]}
 
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" mod"}}]}
-
-      data: {"id":"202603260039353515ac4e38944910","created":1774456776,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":124,"completion_tokens":8,"total_tokens":132,"prompt_tokens_details":{"cached_tokens":114}}}
+      data: {"id":"2026041103104011fb4c996fa24f0e","created":1775848240,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":140,"completion_tokens":7,"total_tokens":147,"prompt_tokens_details":{"cached_tokens":130}}}
 
       data: [DONE]
 
@@ -43,15 +41,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 701.49375ms
+    duration: 591.461209ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51079
+    content_length: 30766
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/simple_test.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 668
+    content_length: 752
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,15 +24,11 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326003933b3aba6ff49a24113","created":1774456773,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110310385d74b2651033440e","created":1775848238,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326003933b3aba6ff49a24113","created":1774456773,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Simple"}}]}
+      data: {"id":"202604110310385d74b2651033440e","created":1775848238,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Hello"}}]}
 
-      data: {"id":"20260326003933b3aba6ff49a24113","created":1774456773,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" G"}}]}
-
-      data: {"id":"20260326003933b3aba6ff49a24113","created":1774456773,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"reeting"}}]}
-
-      data: {"id":"20260326003933b3aba6ff49a24113","created":1774456773,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":121,"completion_tokens":7,"total_tokens":128,"prompt_tokens_details":{"cached_tokens":4}}}
+      data: {"id":"202604110310385d74b2651033440e","created":1775848238,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":137,"completion_tokens":5,"total_tokens":142,"prompt_tokens_details":{"cached_tokens":4}}}
 
       data: [DONE]
 
@@ -41,15 +37,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 2.772573542s
+    duration: 1.984886625s
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51069
+    content_length: 30756
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/sourcegraph_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 723
+    content_length: 807
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,17 +24,19 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Go"}}]}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Search"}}]}
 
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" function"}}]}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" for"}}]}
 
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" Go"}}]}
 
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" search"}}]}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
 
-      data: {"id":"20260326004031f8bdfe37dc4a4d25","created":1774456831,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":133,"completion_tokens":8,"total_tokens":141,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" functions"}}]}
+
+      data: {"id":"202604110311391dc483e004db438c","created":1775848299,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":149,"completion_tokens":9,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -43,15 +45,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 681.869334ms
+    duration: 590.892541ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51129
+    content_length: 30816
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/update_a_file.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 732
+    content_length: 816
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nupdate the main.go file by changing the print to say hello from crush\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,23 +24,25 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Update"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Update"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" main"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":".go"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" to"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" to"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" print"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" print"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" hello"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" hello"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" crush"}}]}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" from"}}]}
 
-      data: {"id":"2026032600393934a6335421aa4b8e","created":1774456780,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":134,"completion_tokens":11,"total_tokens":145,"prompt_tokens_details":{"cached_tokens":114}}}
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" crush"}}]}
+
+      data: {"id":"202604110310469c7b587666ea48f1","created":1775848246,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":150,"completion_tokens":12,"total_tokens":162,"prompt_tokens_details":{"cached_tokens":130}}}
 
       data: [DONE]
 
@@ -49,15 +51,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 715.173125ms
+    duration: 635.146167ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51135
+    content_length: 30822
     host: ""

internal/agent/testdata/TestCoderAgent/zai-glm4.6/write_tool.yaml 🔗

@@ -6,9 +6,9 @@ interactions:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 772
+    content_length: 856
     host: ""
-    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\n<rules>\n- ensure it is not more than 50 characters long\n- the title should be a summary of the user''s message\n- it should be one line long\n- do not use quotes or colons\n- the entire text you return will be used as the title\n- never return anything that is more than one sentence (one line) long\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    body: '{"messages":[{"content":"You will generate a short title based on the first message a user begins a conversation with.\n\n<rules>\n- Keep the title in the same language that the user wrote their message in.\n- Ensure it is not more than 50 characters long.\n- The title should be a summary of the user''s message.\n- It should be one line long.\n- Do not use quotes or colons.\n- The entire text you return will be used as the title.\n- Never return anything that is more than one sentence (one line) long.\n</rules>\n\n /no_think","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse write to create a new file called config.json with content ''{\"name\": \"test\", \"version\": \"1.0.0\"}''\n <think>\n\n</think>","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
     headers:
       Accept:
       - application/json
@@ -24,19 +24,23 @@ interactions:
     proto_minor: 0
     content_length: -1
     body: |+
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\n"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Create"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"Creating"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" config"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" config"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":".json"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":".json"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" file"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" content"}}]}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" with"}}]}
 
-      data: {"id":"202603260040399cfa6f5afdb84416","created":1774456839,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":148,"completion_tokens":9,"total_tokens":157,"prompt_tokens_details":{"cached_tokens":115}}}
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" version"}}]}
+
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":" info"}}]}
+
+      data: {"id":"2026041103115445ebc15ea74549f3","created":1775848314,"object":"chat.completion.chunk","model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":164,"completion_tokens":11,"total_tokens":175,"prompt_tokens_details":{"cached_tokens":131}}}
 
       data: [DONE]
 
@@ -45,15 +49,15 @@ interactions:
       - text/event-stream;charset=UTF-8
     status: 200 OK
     code: 200
-    duration: 697.623042ms
+    duration: 546.9515ms
 - id: 1
   request:
     proto: HTTP/1.1
     proto_major: 1
     proto_minor: 1
-    content_length: 51172
+    content_length: 30859
     host: ""

internal/agent/tools/bash.tpl 🔗

@@ -1,4 +1,4 @@
-Executes bash commands with automatic background conversion for long-running tasks.
+Execute shell commands; long-running commands automatically move to background and return a shell ID.
 
 <cross_platform>
 Uses mvdan/sh interpreter (Bash-compatible on all platforms including Windows).

internal/agent/tools/crush_info.md 🔗

@@ -1,5 +1,4 @@
-Get information about Crush's current runtime configuration and service
-state.
+Get Crush's current runtime state: active model, provider, LSP/MCP status, skills, permissions, and disabled tools. No parameters needed.
 
 <usage>
 - Shows active model and provider, LSP/MCP server status, skills,

internal/agent/tools/crush_logs.md 🔗

@@ -1,4 +1,4 @@
-Read Crush's own application logs.
+Read Crush's internal application logs (default 50 entries, max 100); useful for diagnosing provider errors, tool failures, LSP/MCP issues.
 
 <usage>
 - Returns recent log entries from Crush's internal log file

internal/agent/tools/diagnostics.go 🔗

@@ -27,7 +27,7 @@ var diagnosticsDescription []byte
 func NewDiagnosticsTool(lspManager *lsp.Manager) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		DiagnosticsToolName,
-		string(diagnosticsDescription),
+		FirstLineDescription(diagnosticsDescription),
 		func(ctx context.Context, params DiagnosticsParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if lspManager.Clients().Len() == 0 {
 				return fantasy.NewTextErrorResponse("no LSP clients available"), nil

internal/agent/tools/diagnostics.md 🔗

@@ -1,4 +1,4 @@
-Get diagnostics for file and/or project.
+Get LSP errors, warnings, and hints for a file or the whole project.
 
 <usage>
 - Provide file path to get diagnostics for that file

internal/agent/tools/download.go 🔗

@@ -48,7 +48,7 @@ func NewDownloadTool(permissions permission.Service, workingDir string, client *
 	}
 	return fantasy.NewParallelAgentTool(
 		DownloadToolName,
-		string(downloadDescription),
+		FirstLineDescription(downloadDescription),
 		func(ctx context.Context, params DownloadParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.URL == "" {
 				return fantasy.NewTextErrorResponse("URL parameter is required"), nil

internal/agent/tools/download.md 🔗

@@ -1,4 +1,4 @@
-Downloads binary data from URL and saves to local file.
+Download a URL directly to a local file (binary-safe, streaming, max 100MB); overwrites without warning. For reading content into context use fetch.
 
 <usage>
 - Provide URL to download from

internal/agent/tools/edit.go 🔗

@@ -68,7 +68,7 @@ func NewEditTool(
 ) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		EditToolName,
-		string(editDescription),
+		FirstLineDescription(editDescription),
 		func(ctx context.Context, params EditParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.FilePath == "" {
 				return fantasy.NewTextErrorResponse("file_path is required"), nil

internal/agent/tools/edit.md 🔗

@@ -1,4 +1,4 @@
-Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.
+Edit a file by exact find-and-replace; can also create or delete content. For renames/moves use bash. For large edits use write.
 
 <prerequisites>
 1. Use View tool to understand file contents and context

internal/agent/tools/fetch.go 🔗

@@ -39,7 +39,7 @@ func NewFetchTool(permissions permission.Service, workingDir string, client *htt
 
 	return fantasy.NewParallelAgentTool(
 		FetchToolName,
-		string(fetchDescription),
+		FirstLineDescription(fetchDescription),
 		func(ctx context.Context, params FetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.URL == "" {
 				return fantasy.NewTextErrorResponse("URL parameter is required"), nil

internal/agent/tools/fetch.md 🔗

@@ -1,4 +1,4 @@
-Fetches raw content from URL and returns it in specified format without any AI processing.
+Fetch raw content from a URL as text, markdown, or html (max 5MB); no AI processing. For analysis or extraction use agentic_fetch.
 
 <when_to_use>
 Use this tool when you need:

internal/agent/tools/glob.go 🔗

@@ -34,7 +34,7 @@ type GlobResponseMetadata struct {
 func NewGlobTool(workingDir string) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		GlobToolName,
-		string(globDescription),
+		FirstLineDescription(globDescription),
 		func(ctx context.Context, params GlobParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Pattern == "" {
 				return fantasy.NewTextErrorResponse("pattern is required"), nil

internal/agent/tools/glob.md 🔗

@@ -1,4 +1,4 @@
-Fast file pattern matching tool that finds files by name/pattern, returning paths sorted by modification time (newest first).
+Find files by name/pattern (glob syntax), sorted by modification time; max 100 results; skips hidden files. Use grep to search file contents.
 
 <usage>
 - Provide glob pattern to match against file paths

internal/agent/tools/grep.go 🔗

@@ -105,7 +105,7 @@ func escapeRegexPattern(pattern string) string {
 func NewGrepTool(workingDir string, config config.ToolGrep) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		GrepToolName,
-		string(grepDescription),
+		FirstLineDescription(grepDescription),
 		func(ctx context.Context, params GrepParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Pattern == "" {
 				return fantasy.NewTextErrorResponse("pattern is required"), nil

internal/agent/tools/grep.md 🔗

@@ -1,4 +1,4 @@
-Fast content search tool that finds files containing specific text/patterns, returning matching paths sorted by modification time (newest first).
+Search file contents by regex or literal text; returns matching file paths sorted by modification time (max 100); respects .gitignore. Use glob to filter by filename, not contents.
 
 <usage>
 - Provide regex pattern to search within file contents

internal/agent/tools/job_kill.go 🔗

@@ -29,7 +29,7 @@ type JobKillResponseMetadata struct {
 func NewJobKillTool() fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		JobKillToolName,
-		string(jobKillDescription),
+		FirstLineDescription(jobKillDescription),
 		func(ctx context.Context, params JobKillParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.ShellID == "" {
 				return fantasy.NewTextErrorResponse("missing shell_id"), nil

internal/agent/tools/job_kill.md 🔗

@@ -1,4 +1,4 @@
-Terminates a background shell process.
+Terminate a background shell process by ID; shell ID becomes invalid after killing.
 
 <usage>
 - Provide the shell ID returned from a background bash execution

internal/agent/tools/job_output.go 🔗

@@ -33,7 +33,7 @@ type JobOutputResponseMetadata struct {
 func NewJobOutputTool() fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		JobOutputToolName,
-		string(jobOutputDescription),
+		FirstLineDescription(jobOutputDescription),
 		func(ctx context.Context, params JobOutputParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.ShellID == "" {
 				return fantasy.NewTextErrorResponse("missing shell_id"), nil

internal/agent/tools/job_output.md 🔗

@@ -1,4 +1,4 @@
-Retrieves the current output from a background shell.
+Get stdout/stderr from a background shell by ID; set wait=true to block until completion.
 
 <usage>
 - Provide the shell ID returned from a background bash execution

internal/agent/tools/list_mcp_resources.go 🔗

@@ -31,7 +31,7 @@ var listMCPResourcesDescription []byte
 func NewListMCPResourcesTool(cfg *config.ConfigStore, permissions permission.Service) fantasy.AgentTool {
 	return fantasy.NewParallelAgentTool(
 		ListMCPResourcesToolName,
-		string(listMCPResourcesDescription),
+		FirstLineDescription(listMCPResourcesDescription),
 		func(ctx context.Context, params ListMCPResourcesParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			params.MCPName = strings.TrimSpace(params.MCPName)
 			if params.MCPName == "" {

internal/agent/tools/list_mcp_resources.md 🔗

@@ -1,4 +1,4 @@
-Lists available resources from an MCP server.
+List available resource URIs from an MCP server by name; use before read_mcp_resource.
 
 <when_to_use>
 Use this tool to discover which resources are available before reading them.

internal/agent/tools/ls.go 🔗

@@ -58,7 +58,7 @@ var lsDescription []byte
 func NewLsTool(permissions permission.Service, workingDir string, lsConfig config.ToolLs) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		LSToolName,
-		string(lsDescription),
+		FirstLineDescription(lsDescription),
 		func(ctx context.Context, params LSParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			searchPath, err := fsext.Expand(cmp.Or(params.Path, workingDir))
 			if err != nil {

internal/agent/tools/ls.md 🔗

@@ -1,4 +1,4 @@
-Shows files and subdirectories in tree structure for exploring project organization.
+List files and directories as a tree; skips hidden files and common system dirs; max 1000 files. Use glob to find files by pattern, grep to search contents.
 
 <usage>
 - Provide path to list (defaults to current working directory)

internal/agent/tools/lsp_restart.go 🔗

@@ -27,7 +27,7 @@ type LSPRestartParams struct {
 func NewLSPRestartTool(lspManager *lsp.Manager) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		LSPRestartToolName,
-		string(lspRestartDescription),
+		FirstLineDescription(lspRestartDescription),
 		func(ctx context.Context, params LSPRestartParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if lspManager.Clients().Len() == 0 {
 				return fantasy.NewTextErrorResponse("no LSP clients available to restart"), nil

internal/agent/tools/lsp_restart.md 🔗

@@ -1,4 +1,4 @@
-Restart LSP (Language Server Protocol) clients.
+Restart one or all LSP clients by name; use when diagnostics are stale or the LSP is unresponsive.
 
 <usage>
 - Restart all running LSP clients or a specific LSP client by name

internal/agent/tools/multiedit.go 🔗

@@ -66,7 +66,7 @@ func NewMultiEditTool(
 ) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		MultiEditToolName,
-		string(multieditDescription),
+		FirstLineDescription(multieditDescription),
 		func(ctx context.Context, params MultiEditParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.FilePath == "" {
 				return fantasy.NewTextErrorResponse("file_path is required"), nil

internal/agent/tools/multiedit.md 🔗

@@ -1,4 +1,4 @@
-Makes multiple edits to a single file in one operation. Built on Edit tool for efficient multiple find-and-replace operations. Prefer over Edit tool for multiple edits to same file.
+Apply multiple find-and-replace edits to a single file in one operation; edits run sequentially. Prefer over edit for multiple changes to the same file. Same exact-match rules as edit apply.
 
 <prerequisites>
 1. Use View tool to understand file contents and context

internal/agent/tools/read_mcp_resource.go 🔗

@@ -33,7 +33,7 @@ var readMCPResourceDescription []byte
 func NewReadMCPResourceTool(cfg *config.ConfigStore, permissions permission.Service) fantasy.AgentTool {
 	return fantasy.NewParallelAgentTool(
 		ReadMCPResourceToolName,
-		string(readMCPResourceDescription),
+		FirstLineDescription(readMCPResourceDescription),
 		func(ctx context.Context, params ReadMCPResourceParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			params.MCPName = strings.TrimSpace(params.MCPName)
 			params.URI = strings.TrimSpace(params.URI)

internal/agent/tools/read_mcp_resource.md 🔗

@@ -1,4 +1,4 @@
-Reads a resource from an MCP server and returns its contents.
+Read a resource by URI from an MCP server; returns text content.
 
 <when_to_use>
 Use this tool to fetch a specific resource URI exposed by an MCP server.

internal/agent/tools/references.go 🔗

@@ -36,7 +36,7 @@ var referencesDescription []byte
 func NewReferencesTool(lspManager *lsp.Manager) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		ReferencesToolName,
-		string(referencesDescription),
+		FirstLineDescription(referencesDescription),
 		func(ctx context.Context, params ReferencesParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Symbol == "" {
 				return fantasy.NewTextErrorResponse("symbol is required"), nil

internal/agent/tools/references.md 🔗

@@ -1,4 +1,4 @@
-Find all references to/usage of a symbol by name using the Language Server Protocol (LSP).
+Find all references to a symbol by name via LSP; more accurate than grep for code symbols.
 
 <usage>
 - Provide symbol name (e.g., "MyFunction", "myVariable", "MyType").

internal/agent/tools/sourcegraph.go 🔗

@@ -45,7 +45,7 @@ func NewSourcegraphTool(client *http.Client) fantasy.AgentTool {
 	}
 	return fantasy.NewParallelAgentTool(
 		SourcegraphToolName,
-		string(sourcegraphDescription),
+		FirstLineDescription(sourcegraphDescription),
 		func(ctx context.Context, params SourcegraphParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Query == "" {
 				return fantasy.NewTextErrorResponse("Query parameter is required"), nil

internal/agent/tools/sourcegraph.md 🔗

@@ -1,4 +1,4 @@
-Search code across public repositories using Sourcegraph's GraphQL API.
+Search code across public GitHub repositories via Sourcegraph; supports regex, language/repo/file filters, and symbol search (max 20 results). Only searches public repos.
 
 <usage>
 - Provide search query using Sourcegraph syntax

internal/agent/tools/todos.go 🔗

@@ -36,7 +36,7 @@ type TodosResponseMetadata struct {
 func NewTodosTool(sessions session.Service) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		TodosToolName,
-		string(todosDescription),
+		FirstLineDescription(todosDescription),
 		func(ctx context.Context, params TodosParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			sessionID := GetSessionFromContext(ctx)
 			if sessionID == "" {

internal/agent/tools/todos.md 🔗

@@ -1,4 +1,4 @@
-Creates and manages a structured task list for tracking progress on complex, multi-step coding tasks.
+Manage a structured task list for multi-step work; each task has pending/in_progress/completed state. Keep exactly one task in_progress at a time. Skip for simple or single-step tasks.
 
 <when_to_use>
 Use this tool proactively in these scenarios:

internal/agent/tools/tools.go 🔗

@@ -2,6 +2,10 @@ package tools
 
 import (
 	"context"
+	"os"
+	"strconv"
+	"strings"
+	"testing"
 )
 
 type (
@@ -54,3 +58,21 @@ func GetSupportsImagesFromContext(ctx context.Context) bool {
 func GetModelNameFromContext(ctx context.Context) string {
 	return getContextValue(ctx, ModelNameContextKey, "")
 }
+
+// FirstLineDescription returns just the first non-empty line from the embedded
+// markdown description when CRUSH_SHORT_TOOL_DESCRIPTIONS is set, significantly
+// reducing token usage. Otherwise returns the full description.
+func FirstLineDescription(content []byte) string {
+	if !testing.Testing() {
+		if v, _ := strconv.ParseBool(os.Getenv("CRUSH_SHORT_TOOL_DESCRIPTIONS")); !v {
+			return strings.TrimSpace(string(content))
+		}
+	}
+	for line := range strings.SplitSeq(string(content), "\n") {
+		line = strings.TrimSpace(line)
+		if line != "" {
+			return line
+		}
+	}
+	return ""
+}

internal/agent/tools/view.go 🔗

@@ -69,7 +69,7 @@ func NewViewTool(
 ) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		ViewToolName,
-		string(viewDescription),
+		FirstLineDescription(viewDescription),
 		func(ctx context.Context, params ViewParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.FilePath == "" {
 				return fantasy.NewTextErrorResponse("file_path is required"), nil

internal/agent/tools/view.md 🔗

@@ -1,4 +1,4 @@
-Reads and displays file contents with line numbers for examining code, logs, or text data.
+Read a file by path with line numbers; supports offset and line limit (default 2000, max 5MB); renders images (PNG, JPEG, GIF, BMP, SVG, WebP); use ls for directories.
 
 <usage>
 - Provide file path to read

internal/agent/tools/web_fetch.go 🔗

@@ -31,7 +31,7 @@ func NewWebFetchTool(workingDir string, client *http.Client) fantasy.AgentTool {
 
 	return fantasy.NewParallelAgentTool(
 		WebFetchToolName,
-		string(webFetchToolDescription),
+		FirstLineDescription(webFetchToolDescription),
 		func(ctx context.Context, params WebFetchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.URL == "" {
 				return fantasy.NewTextErrorResponse("url is required"), nil

internal/agent/tools/web_fetch.md 🔗

@@ -1,4 +1,4 @@
-Fetches content from a web URL (for use by sub-agents).
+Fetch a web URL and return content as markdown; for use inside sub-agents. Large pages (>50KB) are saved to a temp file for grep/view.
 
 <usage>
 - Provide a URL to fetch

internal/agent/tools/web_search.go 🔗

@@ -29,7 +29,7 @@ func NewWebSearchTool(client *http.Client) fantasy.AgentTool {
 
 	return fantasy.NewParallelAgentTool(
 		WebSearchToolName,
-		string(webSearchToolDescription),
+		FirstLineDescription(webSearchToolDescription),
 		func(ctx context.Context, params WebSearchParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.Query == "" {
 				return fantasy.NewTextErrorResponse("query is required"), nil

internal/agent/tools/web_search.md 🔗

@@ -1,4 +1,4 @@
-Searches the web using DuckDuckGo and returns search results.
+Search the web via DuckDuckGo; returns titles, URLs, and snippets. Follow up with web_fetch to get full page content.
 
 <usage>
 - Provide a search query to find information on the web

internal/agent/tools/write.go 🔗

@@ -52,7 +52,7 @@ func NewWriteTool(
 ) fantasy.AgentTool {
 	return fantasy.NewAgentTool(
 		WriteToolName,
-		string(writeDescription),
+		FirstLineDescription(writeDescription),
 		func(ctx context.Context, params WriteParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {
 			if params.FilePath == "" {
 				return fantasy.NewTextErrorResponse("file_path is required"), nil

internal/agent/tools/write.md 🔗

@@ -1,4 +1,4 @@
-Creates or updates files in filesystem for saving/modifying text content.
+Create or overwrite a file with given content; auto-creates parent dirs. Cannot append. Read the file first to avoid conflicts. For surgical changes use edit or multiedit.
 
 <usage>
 - Provide file path to write