chore: fix tool calls

kujtimiihoxha created

Change summary

go.mod                                                                     |  39 
go.sum                                                                     |  78 
internal/agent/.env.sample                                                 |   1 
internal/agent/agent.go                                                    |  11 
internal/agent/agent_test.go                                               |   1 
internal/agent/common_test.go                                              |  21 
internal/agent/coordinator.go                                              |   1 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/bash_tool.yaml           | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/download_tool.yaml       | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/fetch_tool.yaml          | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/glob_tool.yaml           | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/grep_tool.yaml           | 119 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/ls_tool.yaml             | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/multiedit_tool.yaml      | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/parallel_tool_calls.yaml | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/read_a_file.yaml         | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/simple_test.yaml         | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/sourcegraph_tool.yaml    | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/update_a_file.yaml       | 121 
internal/agent/testdata/TestCoderAgent/zai-glm4.6/write_tool.yaml          | 121 
internal/config/provider.go                                                |   6 
internal/config/provider_empty_test.go                                     |   2 
internal/config/provider_test.go                                           |   2 
internal/message/content.go                                                |  14 
24 files changed, 1,626 insertions(+), 121 deletions(-)

Detailed changes

go.mod 🔗

@@ -13,7 +13,7 @@ require (
 	github.com/charlievieth/fastwalk v1.0.14
 	github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
 	github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e
-	github.com/charmbracelet/catwalk v0.6.1
+	github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5
 	github.com/charmbracelet/fang v0.4.2
 	github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018
 	github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20250917201909-41ff0bf215ea
@@ -30,7 +30,6 @@ require (
 	github.com/ncruces/go-sqlite3 v0.29.0
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 	github.com/nxadm/tail v1.4.11
-	github.com/openai/openai-go v1.12.0
 	github.com/pressly/goose/v3 v3.25.0
 	github.com/qjebbs/go-jsons v1.0.0-alpha.4
 	github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06
@@ -42,7 +41,6 @@ require (
 	github.com/tidwall/sjson v1.2.5
 	github.com/zeebo/xxh3 v1.0.2
 	go.yaml.in/yaml/v4 v4.0.0-rc.2
-	google.golang.org/genai v1.26.0
 	gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20250923044825-7b4892dd3117
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
@@ -51,28 +49,8 @@ require (
 require (
 	cloud.google.com/go v0.116.0 // indirect
 	cloud.google.com/go/auth v0.9.3 // indirect
-	cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
 	cloud.google.com/go/compute/metadata v0.5.0 // indirect
-	github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
-	github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
-	github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect
-	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
-	github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect
-	github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect
-	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect
-	github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect
-	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect
-	github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect
-	github.com/aws/smithy-go v1.20.3 // indirect
 	github.com/charmbracelet/x/json v0.2.0 // indirect
-	github.com/felixge/httpsnoop v1.0.4 // indirect
-	github.com/go-logr/logr v1.4.3 // indirect
-	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/google/go-cmp v0.7.0 // indirect
 	github.com/google/s2a-go v0.1.8 // indirect
@@ -80,23 +58,16 @@ require (
 	github.com/gorilla/websocket v1.5.3 // indirect
 	github.com/openai/openai-go/v2 v2.3.0 // indirect
 	go.opencensus.io v0.24.0 // indirect
-	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
-	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
-	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
-	go.opentelemetry.io/otel v1.37.0 // indirect
-	go.opentelemetry.io/otel/metric v1.37.0 // indirect
-	go.opentelemetry.io/otel/trace v1.37.0 // indirect
 	golang.org/x/crypto v0.41.0 // indirect
-	golang.org/x/oauth2 v0.30.0 // indirect
-	golang.org/x/time v0.6.0 // indirect
-	google.golang.org/api v0.197.0 // indirect
+	google.golang.org/genai v1.26.0 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
 	google.golang.org/grpc v1.66.2 // indirect
 	google.golang.org/protobuf v1.36.8 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )
 
 require (
-	github.com/anthropics/anthropic-sdk-go v1.12.0
+	github.com/anthropics/anthropic-sdk-go v1.12.0 // indirect
 	github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77
 	github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
 )
@@ -107,7 +78,7 @@ require (
 	github.com/aymerick/douceur v0.2.0 // indirect
 	github.com/bahlo/generic-list-go v0.2.0 // indirect
 	github.com/buger/jsonparser v1.1.1 // indirect
-	github.com/charmbracelet/colorprofile v0.3.2 // indirect
+	github.com/charmbracelet/colorprofile v0.3.2
 	github.com/charmbracelet/ultraviolet v0.0.0-20250915111650-81d4262876ef
 	github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect
 	github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5

go.sum 🔗

@@ -3,18 +3,8 @@ cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
 cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
 cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U=
 cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
 cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
 cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/JohannesKaufmann/html-to-markdown v1.6.0 h1:04VXMiE50YYfCfLboJCLcgqF5x+rHJnb1ssNmqpLH/k=
 github.com/JohannesKaufmann/html-to-markdown v1.6.0/go.mod h1:NUI78lGg/a7vpEJTz/0uOcYMaibytE4BUOQS8k78yPQ=
@@ -36,34 +26,6 @@ github.com/anthropics/anthropic-sdk-go v1.12.0 h1:xPqlGnq7rWrTiHazIvCiumA0u7mGQn
 github.com/anthropics/anthropic-sdk-go v1.12.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE=
 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
-github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
-github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM=
-github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90=
-github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
-github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM=
-github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw=
-github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE=
-github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ=
-github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
-github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
 github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
@@ -83,14 +45,12 @@ github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2
 github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1.0.20250820203609-601216f68ee2/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw=
 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e h1:4BBnKWFwJ5FLyhw/ijFxKE04i9rubr8WIPR1kjO57iA=
 github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.4.0.20250910155747-997384b0b35e/go.mod h1:F7AfLKYQqpM3NNBVs7ctW417tavhvoh9SBjsgtwpzbY=
-github.com/charmbracelet/catwalk v0.6.1 h1:2rRqUlwo+fdyIty8jEvUufRTgqBl0aea21LV6YQPqb0=
-github.com/charmbracelet/catwalk v0.6.1/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
+github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5 h1:d/Gs0/fQoe4fJ7wnu7C1oA72C5KkTmacbXLN86EeqqE=
+github.com/charmbracelet/catwalk v0.6.4-0.20251002104711-f8c6c1e5b4a5/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY=
 github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
 github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
 github.com/charmbracelet/fang v0.4.2 h1:nWr7Tb82/TTNNGMGG35aTZ1X68loAOQmpb0qxkKXjas=
 github.com/charmbracelet/fang v0.4.2/go.mod h1:wHJKQYO5ReYsxx+yZl+skDtrlKO/4LLEQ6EXsdHhRhg=
-github.com/charmbracelet/fantasy v0.0.0-20250930080945-d8adb55feb9a h1:pD/ATiDbIRm8i5cKf8k1NR/0HhmSdAejY2kbIpmBiis=
-github.com/charmbracelet/fantasy v0.0.0-20250930080945-d8adb55feb9a/go.mod h1:RZotHpq44tKZDe6Vf0kk1iDqnUgH7Scx+K/7uJ9Qwnw=
 github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77 h1:YHuUqaojkeu00YtQeXPqM/1RNJH/jqGNaQYFwa7JQTk=
 github.com/charmbracelet/fantasy v0.0.0-20251002051643-c96822199d77/go.mod h1:RZotHpq44tKZDe6Vf0kk1iDqnUgH7Scx+K/7uJ9Qwnw=
 github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w=
@@ -143,8 +103,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
@@ -152,17 +110,10 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S
 github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
 github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
 github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
-github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
 github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
 github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
 github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
-github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
-github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
@@ -177,8 +128,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
-github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -218,6 +167,7 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
 github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -264,14 +214,10 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
 github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
-github.com/openai/openai-go v1.12.0 h1:NBQCnXzqOTv5wsgNC36PrFEiskGfO5wccfCWDo9S1U0=
-github.com/openai/openai-go v1.12.0/go.mod h1:g461MYGXEXBVdV5SaR/5tNzNbSfwTBBefwc+LlDCK0Y=
 github.com/openai/openai-go/v2 v2.3.0 h1:y9U+V1tlHjvvb/5XIswuySqnG5EnKBFAbMxgBvTHXvg=
 github.com/openai/openai-go/v2 v2.3.0/go.mod h1:sIUkR+Cu/PMUVkSKhkk742PRURkQOCFhiwJ7eRSBqmk=
 github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
 github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
-github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -359,18 +305,6 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
 github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
 go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
-go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
-go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
-go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
-go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
-go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
-go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
-go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s=
@@ -418,8 +352,6 @@ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
 golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
-golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -475,8 +407,6 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
 golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -489,8 +419,6 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58
 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
-google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genai v1.26.0 h1:r4HGL54kFv/WCRMTAbZg05Ct+vXfhAbTRlXhFyBkEQo=

internal/agent/agent.go 🔗

@@ -250,6 +250,17 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*ai.Agen
 		OnRetry: func(err *ai.APICallError, delay time.Duration) {
 			// TODO: implement
 		},
+		OnToolCall: func(tc ai.ToolCallContent) error {
+			toolCall := message.ToolCall{
+				ID:               tc.ToolCallID,
+				Name:             tc.ToolName,
+				Input:            tc.Input,
+				ProviderExecuted: false,
+				Finished:         true,
+			}
+			currentAssistant.AddToolCall(toolCall)
+			return a.messages.Update(genCtx, *currentAssistant)
+		},
 		OnToolResult: func(result ai.ToolResultContent) error {
 			var resultContent string
 			isError := false

internal/agent/agent_test.go 🔗

@@ -21,6 +21,7 @@ var modelPairs = []modelPair{
 	{"anthropic-sonnet", anthropicBuilder("claude-sonnet-4-5-20250929"), anthropicBuilder("claude-3-5-haiku-20241022")},
 	{"openai-gpt-5", openaiBuilder("gpt-5"), openaiBuilder("gpt-4o")},
 	{"openrouter-kimi-k2", openRouterBuilder("moonshotai/kimi-k2-0905"), openRouterBuilder("qwen/qwen3-next-80b-a3b-instruct")},
+	{"zai-glm4.6", zAIBuilder("glm-4.6"), zAIBuilder("glm-4.5-air")},
 }
 
 func getModels(t *testing.T, r *recorder.Recorder, pair modelPair) (ai.LanguageModel, ai.LanguageModel) {

internal/agent/common_test.go 🔗

@@ -22,6 +22,7 @@ import (
 	"github.com/charmbracelet/fantasy/ai"
 	"github.com/charmbracelet/fantasy/anthropic"
 	"github.com/charmbracelet/fantasy/openai"
+	"github.com/charmbracelet/fantasy/openaicompat"
 	"github.com/charmbracelet/fantasy/openrouter"
 	"github.com/stretchr/testify/require"
 	"gopkg.in/dnaeon/go-vcr.v4/pkg/recorder"
@@ -85,6 +86,26 @@ func openRouterBuilder(model string) builderFunc {
 	}
 }
 
+func zAIBuilder(model string) builderFunc {
+	return func(t *testing.T, r *recorder.Recorder) (ai.LanguageModel, error) {
+		tf := func() func() string {
+			id := 0
+			return func() string {
+				id += 1
+				return fmt.Sprintf("%s-%d", t.Name(), id)
+			}
+		}
+		provider := openaicompat.New(
+			"https://api.z.ai/api/coding/paas/v4",
+			openaicompat.WithAPIKey(os.Getenv("CRUSH_ZAI_API_KEY")),
+			openaicompat.WithHTTPClient(&http.Client{Transport: r}),
+			openaicompat.WithLanguageUniqueToolCallIds(),
+			openaicompat.WithLanguageModelGenerateIDFunc(tf()),
+		)
+		return provider.LanguageModel(model)
+	}
+}
+
 func testEnv(t *testing.T) env {
 	testDir := filepath.Join("/tmp/crush-test/", t.Name())
 	os.RemoveAll(testDir)

internal/agent/coordinator.go 🔗

@@ -371,6 +371,7 @@ func (c *coordinator) buildOpenrouterProvider(_, apiKey string, headers map[stri
 func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers map[string]string) ai.Provider {
 	opts := []openaicompat.Option{
 		openaicompat.WithAPIKey(apiKey),
+		openaicompat.WithLanguageUniqueToolCallIds(),
 	}
 	if c.cfg.Options.Debug {
 		httpClient := log.NewHTTPClient()

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

@@ -0,0 +1,247 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 676
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","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''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" use"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" bash"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" named"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" test"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".txt"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"hello"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" bash"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
+
+      data: {"id":"20251002201331c33af8c317314d35","created":1759407211,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":120,"completion_tokens":40,"total_tokens":160,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 836.495834ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30643
+    host: ""

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

@@ -0,0 +1,410 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 689
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\ndownload the file from https://httpbin.org/robots.txt and save it as robots.txt","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" which"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" downloading"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specific"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" URL"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" and"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" saving"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
+
+      data: {"id":"202510022013394ef1adf44a26449e","created":1759407219,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":123,"completion_tokens":40,"total_tokens":163,"prompt_tokens_details":{"cached_tokens":4}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 608.569667ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30660
+    host: ""

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

@@ -0,0 +1,278 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 702
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nfetch the content from https://httpbin.org/html and tell me if it contains the word ''Herman''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Fetch"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" https"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"://"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"http"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"bin"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".org"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"/html"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Check"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" if"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" it"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" contains"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201405fd37716f1a814455","created":1759407245,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":127,"completion_tokens":40,"total_tokens":167,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 776.999875ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30670
+    host: ""

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

@@ -0,0 +1,314 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 665
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse glob to find all .go files in the current directory","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ("}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"under"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":")"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" that"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" summarizes"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
+
+      data: {"id":"20251002201416402fca746c29478e","created":1759407256,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":117,"completion_tokens":40,"total_tokens":157,"prompt_tokens_details":{"cached_tokens":105}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 691.002625ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30632
+    host: ""

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

@@ -0,0 +1,224 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 663
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse grep to search for the word ''package'' in go files","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" this"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" request"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" grep"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" search"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" word"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" '"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"package"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" key"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" elements here"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" are"}}]}
+
+      data: {"id":"202510022014250e413c513a794e44","created":1759407265,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":118,"completion_tokens":40,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":105}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 693.52975ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30630
+    host: ""

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

@@ -0,0 +1,214 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 659
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse ls to list the files in the current directory","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" short"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"use"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" list"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" in"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" current"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" directory"}}]}
+
+      data: {"id":"20251002201445041809480c014e06","created":1759407285,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":115,"completion_tokens":40,"total_tokens":155,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 623.935583ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30624
+    host: ""

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

@@ -0,0 +1,253 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 738
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","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","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" mult"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"ied"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"it"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" make"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changes"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" code"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" describes"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" making"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" two"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changes"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Go"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Change"}}]}
+
+      data: {"id":"202510022014505d4877bbe7aa4368","created":1759407290,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":138,"completion_tokens":40,"total_tokens":178,"prompt_tokens_details":{"cached_tokens":105}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 617.733916ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30710
+    host: ""

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

@@ -0,0 +1,396 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 744
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","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","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".\n\n"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" glob"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" find"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" all"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ."}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"go"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" files"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Use"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" ls"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" list"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022015242e995145239b48a2","created":1759407324,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":134,"completion_tokens":40,"total_tokens":174,"prompt_tokens_details":{"cached_tokens":112}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 715.508583ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30721
+    host: ""

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

@@ -0,0 +1,238 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 625
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nRead the go mod","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"We"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" are"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generating"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Read"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" go"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" mod"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"\n"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" be"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" summary"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" of"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" not"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" more"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" than"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" one"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" line"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" long"}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":","}}]}
+
+      data: {"id":"202510022012550421aa8f0b8545f4","created":1759407175,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":109,"completion_tokens":40,"total_tokens":149,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 620.604541ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30594
+    host: ""

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

@@ -0,0 +1,179 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 615
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nHello","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" has"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asked"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" \""}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Hello"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"."}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" follow"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" instructions"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"1"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" The"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" should"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" not"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" be"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" more"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" than"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":" "}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"50"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" characters"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" long"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":"\n"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"2"}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201254d74393f3a8974817","created":1759407174,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":106,"completion_tokens":40,"total_tokens":146,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 1.8379335s
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30584
+    host: ""

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

@@ -0,0 +1,574 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 670
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","role":"system"},{"content":"Generate a concise title for the following content:\n\nuse sourcegraph to search for ''func main'' in Go repositories","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" based"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" on"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" what"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" wants"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" using"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Source"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"graph"}}]}
+
+      data: {"id":"20251002201458ba7a7edba8404818","created":1759407298,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":118,"completion_tokens":40,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":105}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 625.454292ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30644
+    host: ""

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

@@ -0,0 +1,402 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 679
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","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","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Let"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\""}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"Generate"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" following"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"update"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" main"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".go"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" by"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" changing"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" print"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" say"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" hello"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" from"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" crush"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"\n\n"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"The"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" is"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" asking"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022012597af3a0eb31494726","created":1759407179,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":119,"completion_tokens":40,"total_tokens":159,"prompt_tokens_details":{"cached_tokens":104}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 684.753833ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30650
+    host: ""

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

@@ -0,0 +1,204 @@
+---
+version: 2
+interactions:
+- id: 0
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 719
+    host: ""
+    body: '{"messages":[{"content":"you will generate a short title based on the first message a user begins a conversation with\n\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","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\"}''","role":"user"}],"model":"glm-4.5-air","max_tokens":40,"stream_options":{"include_usage":true},"stream":true}'
+    headers:
+      Accept:
+      - application/json
+      Content-Type:
+      - application/json
+      User-Agent:
+      - OpenAI/Go 2.3.0
+    url: https://api.z.ai/api/coding/paas/v4/chat/completions
+    method: POST
+  response:
+    proto: HTTP/2.0
+    proto_major: 2
+    proto_minor: 0
+    content_length: -1
+    body: |+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","content":"\n"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"I"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" need"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" generate"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" concise"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" title"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" for"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" user"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"'s"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" about"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" creating"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" config"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".json"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" with"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" specific"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" content"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"."}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" Let"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" me"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" analyze"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" the"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" message"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":":\n\n"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"\"use"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" write"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" to"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" create"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" a"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" new"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" file"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" called"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":" config"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":".json"}}]}
+
+      data: {"id":"202510022015130c3166a540c9449a","created":1759407313,"model":"glm-4.5-air","choices":[{"index":0,"finish_reason":"length","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":134,"completion_tokens":40,"total_tokens":174,"prompt_tokens_details":{"cached_tokens":105}}}
+
+      data: [DONE]
+
+    headers:
+      Content-Type:
+      - text/event-stream;charset=UTF-8
+    status: 200 OK
+    code: 200
+    duration: 631.146709ms
+- id: 1
+  request:
+    proto: HTTP/1.1
+    proto_major: 1
+    proto_minor: 1
+    content_length: 30687
+    host: ""

internal/config/provider.go 🔗

@@ -18,7 +18,7 @@ import (
 )
 
 type ProviderClient interface {
-	GetProviders() ([]catwalk.Provider, error)
+	GetProvidersV2() ([]catwalk.Provider, error)
 }
 
 var (
@@ -129,7 +129,7 @@ func loadProviders(autoUpdateDisabled bool, client ProviderClient, path string)
 	cacheIsStale, cacheExists := isCacheStale(path)
 
 	catwalkGetAndSave := func() ([]catwalk.Provider, error) {
-		providers, err := client.GetProviders()
+		providers, err := client.GetProvidersV2()
 		if err != nil {
 			return nil, fmt.Errorf("failed to fetch providers from catwalk: %w", err)
 		}
@@ -146,7 +146,7 @@ func loadProviders(autoUpdateDisabled bool, client ProviderClient, path string)
 		go func() {
 			slog.Info("Updating providers cache in background", "path", path)
 
-			providers, err := client.GetProviders()
+			providers, err := client.GetProvidersV2()
 			if err != nil {
 				slog.Error("Failed to fetch providers in background from Catwalk", "error", err)
 				return

internal/config/provider_empty_test.go 🔗

@@ -11,7 +11,7 @@ import (
 
 type emptyProviderClient struct{}
 
-func (m *emptyProviderClient) GetProviders() ([]catwalk.Provider, error) {
+func (m *emptyProviderClient) GetProvidersV2() ([]catwalk.Provider, error) {
 	return []catwalk.Provider{}, nil
 }
 

internal/config/provider_test.go 🔗

@@ -14,7 +14,7 @@ type mockProviderClient struct {
 	shouldFail bool
 }
 
-func (m *mockProviderClient) GetProviders() ([]catwalk.Provider, error) {
+func (m *mockProviderClient) GetProvidersV2() ([]catwalk.Provider, error) {
 	if m.shouldFail {
 		return nil, errors.New("failed to load providers")
 	}

internal/message/content.go 🔗

@@ -4,6 +4,7 @@ import (
 	"encoding/base64"
 	"errors"
 	"slices"
+	"strings"
 	"time"
 
 	"github.com/charmbracelet/catwalk/pkg/catwalk"
@@ -92,7 +93,6 @@ type ToolCall struct {
 	Name             string `json:"name"`
 	Input            string `json:"input"`
 	ProviderExecuted bool   `json:"provider_executed"`
-	Type             string `json:"type"`
 	Finished         bool   `json:"finished"`
 }
 
@@ -309,7 +309,6 @@ func (m *Message) FinishToolCall(toolCallID string) {
 					ID:       c.ID,
 					Name:     c.Name,
 					Input:    c.Input,
-					Type:     c.Type,
 					Finished: true,
 				}
 				return
@@ -326,7 +325,6 @@ func (m *Message) AppendToolCallInput(toolCallID string, inputDelta string) {
 					ID:       c.ID,
 					Name:     c.Name,
 					Input:    c.Input + inputDelta,
-					Type:     c.Type,
 					Finished: c.Finished,
 				}
 				return
@@ -396,8 +394,9 @@ func (m *Message) ToAIMessage() []ai.Message {
 	switch m.Role {
 	case User:
 		var parts []ai.MessagePart
-		if m.Content().Text != "" {
-			parts = append(parts, ai.TextPart{Text: m.Content().Text})
+		text := strings.TrimSpace(m.Content().Text)
+		if text != "" {
+			parts = append(parts, ai.TextPart{Text: text})
 		}
 		for _, content := range m.BinaryContent() {
 			parts = append(parts, ai.FilePart{
@@ -412,8 +411,9 @@ func (m *Message) ToAIMessage() []ai.Message {
 		})
 	case Assistant:
 		var parts []ai.MessagePart
-		if m.Content().Text != "" {
-			parts = append(parts, ai.TextPart{Text: m.Content().Text})
+		text := strings.TrimSpace(m.Content().Text)
+		if text != "" {
+			parts = append(parts, ai.TextPart{Text: text})
 		}
 		reasoning := m.ReasoningContent()
 		if reasoning.Thinking != "" {