From 32045bee0ecf41971eb07ae72819125fb091b69d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 09:33:57 +0000 Subject: [PATCH 01/95] chore(deps): bump the all group with 5 updates (#190) Bumps the all group with 5 updates: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go) | `0.18.2` | `0.19.0` | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.41.4` | `1.41.5` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.32.12` | `1.32.13` | | [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) | `0.7.6` | `0.7.7` | | [google.golang.org/genai](https://github.com/googleapis/go-genai) | `1.51.0` | `1.52.0` | Updates `cloud.google.com/go/auth` from 0.18.2 to 0.19.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/auth/v0.18.2...v0.19.0) Updates `github.com/aws/aws-sdk-go-v2` from 1.41.4 to 1.41.5 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.41.4...v1.41.5) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.12 to 1.32.13 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.12...config/v1.32.13) Updates `github.com/kaptinlin/jsonschema` from 0.7.6 to 0.7.7 - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.6...v0.7.7) Updates `google.golang.org/genai` from 1.51.0 to 1.52.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/v1.52.0/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.51.0...v1.52.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/auth dependency-version: 0.19.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.41.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.7.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.52.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 34 ++++++++++++++--------------- go.sum | 68 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 40fc064f3..fb564ea81 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,10 @@ go 1.26.1 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.18.2 + cloud.google.com/go/auth v0.19.0 github.com/ardanlabs/kronk v1.21.4 - github.com/aws/aws-sdk-go-v2 v1.41.4 - github.com/aws/aws-sdk-go-v2/config v1.32.12 + github.com/aws/aws-sdk-go-v2 v1.41.5 + github.com/aws/aws-sdk-go-v2/config v1.32.13 github.com/aws/smithy-go v1.24.2 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 @@ -16,10 +16,10 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.6 + github.com/kaptinlin/jsonschema v0.7.7 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.51.0 + google.golang.org/genai v1.52.0 ) require ( @@ -36,21 +36,21 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.13 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -80,9 +80,9 @@ require ( github.com/hybridgroup/yzma v1.11.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect - github.com/kaptinlin/go-i18n v0.2.12 // indirect + github.com/kaptinlin/go-i18n v0.3.0 // indirect github.com/kaptinlin/jsonpointer v0.4.17 // indirect - github.com/kaptinlin/messageformat-go v0.4.18 // indirect + github.com/kaptinlin/messageformat-go v0.4.19 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -128,7 +128,7 @@ require ( google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/grpc v1.79.2 // indirect + google.golang.org/grpc v1.79.3 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 94d6438c5..e7a794bb6 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= -cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth v0.19.0 h1:DGYwtbcsGsT1ywuxsIoWi1u/vlks0moIblQHgSDgQkQ= +cloud.google.com/go/auth v0.19.0/go.mod h1:2Aph7BT2KnaSFOM0JDPyiYgNh6PL9vGMiP8CUIXZ+IY= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -42,20 +42,20 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/ardanlabs/kronk v1.21.4 h1:h/Wy+nxwKH8OZAuJfCZ/dSzKD0YNCGLcrswLqRb4Gk4= github.com/ardanlabs/kronk v1.21.4/go.mod h1:07fwlo30o3xn8utYjAcy/3TCTNZbanP2WFthyjgBxPY= -github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= -github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= +github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= -github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= -github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/config v1.32.13 h1:5KgbxMaS2coSWRrx9TX/QtWbqzgQkOdEa3sZPhBhCSg= +github.com/aws/aws-sdk-go-v2/config v1.32.13/go.mod h1:8zz7wedqtCbw5e9Mi2doEwDyEgHcEE9YOJp6a8jdSMY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.13 h1:mA59E3fokBvyEGHKFdnpNNrvaR351cqiHgRg+JzOSRI= +github.com/aws/aws-sdk-go-v2/credentials v1.19.13/go.mod h1:yoTXOQKea18nrM69wGF9jBdG4WocSZA1h38A+t/MAsk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= @@ -64,20 +64,20 @@ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhL github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 h1:GcLE9ba5ehAQma6wlopUesYg/hbcOhFNWTjELkiWkh4= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.14/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 h1:mP49nTpfKtpXLt5SLn8Uv8z6W+03jYVoOSAl/c02nog= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -172,14 +172,14 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= -github.com/kaptinlin/go-i18n v0.2.12 h1:ywDsvb4KDFddMC2dpI/rrIzGU2mWUSvHmWUm9BMsdl4= -github.com/kaptinlin/go-i18n v0.2.12/go.mod h1:pVcu9qsW5pOIOoZFJXesRYmLos1vMQrby70JPAoWmJU= +github.com/kaptinlin/go-i18n v0.3.0 h1:wP76dvYg04bvwTb+8NB+CmdZ2kL7lSSCQ9B/kFv7QHo= +github.com/kaptinlin/go-i18n v0.3.0/go.mod h1:pVcu9qsW5pOIOoZFJXesRYmLos1vMQrby70JPAoWmJU= github.com/kaptinlin/jsonpointer v0.4.17 h1:mY9k8ciWncxbsECyaxKnR0MdmxamNdp2tLQkAKVrtSk= github.com/kaptinlin/jsonpointer v0.4.17/go.mod h1:SsfsjqnHG5zuKo1DTBzk1VknaHlL4osHw+X9kZKukpU= -github.com/kaptinlin/jsonschema v0.7.6 h1:UUMqZGFAk7nOzQsYAxvgygm4wpDp/nwXxA4VP9mCPCs= -github.com/kaptinlin/jsonschema v0.7.6/go.mod h1:GGk/oE+F1lWUfYrzKaCf4QWZmMdytt0LL4XdFEFB0LE= -github.com/kaptinlin/messageformat-go v0.4.18 h1:RBlHVWgZyoxTcUgGWBsl2AcyScq/urqbLZvzgryTmSI= -github.com/kaptinlin/messageformat-go v0.4.18/go.mod h1:ntI3154RnqJgr7GaC+vZBnIExl2V3sv9selvRNNEM24= +github.com/kaptinlin/jsonschema v0.7.7 h1:41BlQJ9dskH0oE5DSzBUrl/w4JQYIr6N6L0B5GNyDoM= +github.com/kaptinlin/jsonschema v0.7.7/go.mod h1:rKjWfyySHSxAD7Li2ctYkPlOu960igoKBvZ2ADRtd5Q= +github.com/kaptinlin/messageformat-go v0.4.19 h1:A5kuuZ1ybXDQ7kD1aoEWGAOemX7hLsMY0yolgSbgpRI= +github.com/kaptinlin/messageformat-go v0.4.19/go.mod h1:utSDTfiXTxl66OC5RIEuObLH7Ue3YjbA2X86SYMBYWg= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -300,16 +300,16 @@ gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= -google.golang.org/genai v1.51.0 h1:IZGuUqgfx40INv3hLFGCbOSGp0qFqm7LVmDghzNIYqg= -google.golang.org/genai v1.51.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.52.0 h1:ekVIxWHtLUNbt+v0WWi4j3JT4yrHDEbysMcHQcaCQoI= +google.golang.org/genai v1.52.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c h1:ZhFDeBMmFc/4g8/GwxnJ4rzB3O4GwQVNr+8Mh7Y5z4g= google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c/go.mod h1:hf4r/rBuzaTkLUWRO03771Xvcs6P5hwdQK3UUEJjqo0= google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI= google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= -google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 783847b7d1820ddf072327f0ceb0ee5c26a979ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 09:23:36 +0000 Subject: [PATCH 02/95] chore(deps): bump the all group with 3 updates (#193) Bumps the all group with 3 updates: [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/smithy-go](https://github.com/aws/smithy-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.13 to 1.32.14 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.13...config/v1.32.14) Updates `github.com/aws/smithy-go` from 1.24.2 to 1.24.3 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.24.2...v1.24.3) Updates `google.golang.org/genai` from 1.52.0 to 1.52.1 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.52.0...v1.52.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/smithy-go dependency-version: 1.24.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.52.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index fb564ea81..191974ac1 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,8 @@ require ( cloud.google.com/go/auth v0.19.0 github.com/ardanlabs/kronk v1.21.4 github.com/aws/aws-sdk-go-v2 v1.41.5 - github.com/aws/aws-sdk-go-v2/config v1.32.13 - github.com/aws/smithy-go v1.24.2 + github.com/aws/aws-sdk-go-v2/config v1.32.14 + github.com/aws/smithy-go v1.24.3 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -19,7 +19,7 @@ require ( github.com/kaptinlin/jsonschema v0.7.7 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.52.0 + google.golang.org/genai v1.52.1 ) require ( @@ -36,7 +36,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.13 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect @@ -48,8 +48,8 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect diff --git a/go.sum b/go.sum index e7a794bb6..ce853f3f4 100644 --- a/go.sum +++ b/go.sum @@ -46,10 +46,10 @@ github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= -github.com/aws/aws-sdk-go-v2/config v1.32.13 h1:5KgbxMaS2coSWRrx9TX/QtWbqzgQkOdEa3sZPhBhCSg= -github.com/aws/aws-sdk-go-v2/config v1.32.13/go.mod h1:8zz7wedqtCbw5e9Mi2doEwDyEgHcEE9YOJp6a8jdSMY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.13 h1:mA59E3fokBvyEGHKFdnpNNrvaR351cqiHgRg+JzOSRI= -github.com/aws/aws-sdk-go-v2/credentials v1.19.13/go.mod h1:yoTXOQKea18nrM69wGF9jBdG4WocSZA1h38A+t/MAsk= +github.com/aws/aws-sdk-go-v2/config v1.32.14 h1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI= +github.com/aws/aws-sdk-go-v2/config v1.32.14/go.mod h1:U4/V0uKxh0Tl5sxmCBZ3AecYny4UNlVmObYjKuuaiOo= +github.com/aws/aws-sdk-go-v2/credentials v1.19.14 h1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI= +github.com/aws/aws-sdk-go-v2/credentials v1.19.14/go.mod h1:cJKuyWB59Mqi0jM3nFYQRmnHVQIcgoxjEMAbLkpr62w= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= @@ -72,14 +72,14 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7 github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.14 h1:GcLE9ba5ehAQma6wlopUesYg/hbcOhFNWTjELkiWkh4= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.14/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18 h1:mP49nTpfKtpXLt5SLn8Uv8z6W+03jYVoOSAl/c02nog= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.18/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.15/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 h1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U= github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= -github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= -github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.24.3 h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg= +github.com/aws/smithy-go v1.24.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -300,8 +300,8 @@ gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= -google.golang.org/genai v1.52.0 h1:ekVIxWHtLUNbt+v0WWi4j3JT4yrHDEbysMcHQcaCQoI= -google.golang.org/genai v1.52.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.52.1 h1:dYoljKtLDXMiBdVaClSJ/ZPwZ7j1N0lGjMhwOKOQUlk= +google.golang.org/genai v1.52.1/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c h1:ZhFDeBMmFc/4g8/GwxnJ4rzB3O4GwQVNr+8Mh7Y5z4g= google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c/go.mod h1:hf4r/rBuzaTkLUWRO03771Xvcs6P5hwdQK3UUEJjqo0= google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI= From 92dc3aeb0c5ec0c1c1747166dfdd078ebb251384 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 09:29:02 +0000 Subject: [PATCH 03/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#194) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.21.4 to 1.22.0 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.21.4...v1.22.0) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.22.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 38 ++++++++++++++-------------- go.sum | 80 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/go.mod b/go.mod index 191974ac1..71ae53d2c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.1 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.19.0 - github.com/ardanlabs/kronk v1.21.4 + github.com/ardanlabs/kronk v1.22.0 github.com/aws/aws-sdk-go-v2 v1.41.5 github.com/aws/aws-sdk-go-v2/config v1.32.14 github.com/aws/smithy-go v1.24.3 @@ -27,7 +27,7 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/iam v1.6.0 // indirect cloud.google.com/go/monitoring v1.24.3 // indirect cloud.google.com/go/storage v1.61.3 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect @@ -35,18 +35,18 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect @@ -62,7 +62,7 @@ require ( github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -70,20 +70,20 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.18.0 // indirect + github.com/googleapis/gax-go/v2 v2.21.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.5 // indirect - github.com/hashicorp/go-version v1.8.0 // indirect - github.com/hybridgroup/yzma v1.11.0 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect + github.com/hybridgroup/yzma v1.11.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect github.com/kaptinlin/go-i18n v0.3.0 // indirect github.com/kaptinlin/jsonpointer v0.4.17 // indirect github.com/kaptinlin/messageformat-go v0.4.19 // indirect - github.com/klauspost/compress v1.18.4 // indirect + github.com/klauspost/compress v1.18.5 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -124,11 +124,11 @@ require ( golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.271.0 // indirect - google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/grpc v1.79.3 // indirect + google.golang.org/api v0.273.1 // indirect + google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/grpc v1.80.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ce853f3f4..b68eee1ba 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= -cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/iam v1.6.0 h1:JiSIcEi38dWBKhB3BtfKCW+dMvCZJEhBA2BsaGJgoxs= +cloud.google.com/go/iam v1.6.0/go.mod h1:ZS6zEy7QHmcNO18mjO2viYv/n+wOUkhJqGNkPPGueGU= cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= @@ -40,12 +40,12 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/ardanlabs/kronk v1.21.4 h1:h/Wy+nxwKH8OZAuJfCZ/dSzKD0YNCGLcrswLqRb4Gk4= -github.com/ardanlabs/kronk v1.21.4/go.mod h1:07fwlo30o3xn8utYjAcy/3TCTNZbanP2WFthyjgBxPY= +github.com/ardanlabs/kronk v1.22.0 h1:2bzmlbM1+HefkVdFR3l8XRur/HBqSaF2qnTquYtIpyY= +github.com/ardanlabs/kronk v1.22.0/go.mod h1:wML/0reuaAXE6Bk6EnEXXEQVQosZ/pt/AZlCzi6BJTg= github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/config v1.32.14 h1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI= github.com/aws/aws-sdk-go-v2/config v1.32.14/go.mod h1:U4/V0uKxh0Tl5sxmCBZ3AecYny4UNlVmObYjKuuaiOo= github.com/aws/aws-sdk-go-v2/credentials v1.19.14 h1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI= @@ -58,18 +58,18 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgq github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 h1:foqo/ocQ7WqKwy3FojGtZQJo0FR4vto9qnz9VaumbCo= +github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= @@ -118,8 +118,8 @@ github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMD github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 h1:vymEbVwYFP/L05h5TKQxvkXoKxNvTpjxYKdF1Nlwuao= github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -150,22 +150,22 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI= -github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE= +github.com/googleapis/gax-go/v2 v2.21.0 h1:h45NjjzEO3faG9Lg/cFrBh2PgegVVgzqKzuZl/wMbiI= +github.com/googleapis/gax-go/v2 v2.21.0/go.mod h1:But/NJU6TnZsrLai/xBAQLLz+Hc7fHZJt/hsCz3Fih4= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71 h1:3qrWTgbR0uMacRVnE6//G1B20hUJexxqqmQ2OTs1+0s= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71/go.mod h1:YV27+mh2SLUqeP36G1a9MiqL5eBkFnZQJjNTR9Q9NcY= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.5 h1:DMPV5CSw5JrNg/IK7kDZt3+l2REKXOi3oAw7uYLh2NM= -github.com/hashicorp/go-getter v1.8.5/go.mod h1:WIffejwAyDSJhoVptc3UEshEMkR9O63rw34V7k43O3Q= -github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= -github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.11.0 h1:dIAs/GoV8imTB1fsFk1ft0ejI5APhUK6iHBSMudbfZc= -github.com/hybridgroup/yzma v1.11.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hybridgroup/yzma v1.11.1 h1:HvpPAFzg6lAWTFgxC8R/wjkRbTW2hd2dEM0F41t/gq8= +github.com/hybridgroup/yzma v1.11.1/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -180,8 +180,8 @@ github.com/kaptinlin/jsonschema v0.7.7 h1:41BlQJ9dskH0oE5DSzBUrl/w4JQYIr6N6L0B5G github.com/kaptinlin/jsonschema v0.7.7/go.mod h1:rKjWfyySHSxAD7Li2ctYkPlOu960igoKBvZ2ADRtd5Q= github.com/kaptinlin/messageformat-go v0.4.19 h1:A5kuuZ1ybXDQ7kD1aoEWGAOemX7hLsMY0yolgSbgpRI= github.com/kaptinlin/messageformat-go v0.4.19/go.mod h1:utSDTfiXTxl66OC5RIEuObLH7Ue3YjbA2X86SYMBYWg= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -296,20 +296,20 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= -google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/api v0.273.1 h1:L7G/TmpAMz0nKx/ciAVssVmWQiOF6+pOuXeKrWVsquY= +google.golang.org/api v0.273.1/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= google.golang.org/genai v1.52.1 h1:dYoljKtLDXMiBdVaClSJ/ZPwZ7j1N0lGjMhwOKOQUlk= google.golang.org/genai v1.52.1/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c h1:ZhFDeBMmFc/4g8/GwxnJ4rzB3O4GwQVNr+8Mh7Y5z4g= -google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c/go.mod h1:hf4r/rBuzaTkLUWRO03771Xvcs6P5hwdQK3UUEJjqo0= -google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI= -google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= -google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 h1:w8JYjr7zHemS95YA5FFwk+fUv5tdQU4I8twN9bFdxVU= +google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:YCEC8W7HTtK7iBv+pI7g7hGAi7qdGB6bQXw3BIYAusM= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= +google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c8896d3668f712fef6a8c3216efbef788c6bb55c Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 10 Apr 2026 09:24:32 -0300 Subject: [PATCH 04/95] chore: add `CODEOWNERS` to ask review from me --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..31ecec2fc --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @andreynering From 06f2e8fa04565ab0a47d707f4441e0d594c79889 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 11:00:34 -0300 Subject: [PATCH 05/95] chore(deps): bump the all group with 2 updates (#199) --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 71ae53d2c..30f4731bc 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.26.1 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.19.0 + cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.22.0 github.com/aws/aws-sdk-go-v2 v1.41.5 github.com/aws/aws-sdk-go-v2/config v1.32.14 @@ -19,7 +19,7 @@ require ( github.com/kaptinlin/jsonschema v0.7.7 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.52.1 + google.golang.org/genai v1.53.0 ) require ( @@ -107,13 +107,13 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect - go.opentelemetry.io/otel v1.42.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect - go.opentelemetry.io/otel/metric v1.42.0 // indirect - go.opentelemetry.io/otel/sdk v1.42.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect - go.opentelemetry.io/otel/trace v1.42.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect @@ -124,7 +124,7 @@ require ( golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.273.1 // indirect + google.golang.org/api v0.274.0 // indirect google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect diff --git a/go.sum b/go.sum index b68eee1ba..4f443a095 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.19.0 h1:DGYwtbcsGsT1ywuxsIoWi1u/vlks0moIblQHgSDgQkQ= -cloud.google.com/go/auth v0.19.0/go.mod h1:2Aph7BT2KnaSFOM0JDPyiYgNh6PL9vGMiP8CUIXZ+IY= +cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= +cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -252,22 +252,22 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= -go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= -go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= -go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= -go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= -go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= -go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= -go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= -go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= -go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= -go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= @@ -298,10 +298,10 @@ golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.273.1 h1:L7G/TmpAMz0nKx/ciAVssVmWQiOF6+pOuXeKrWVsquY= -google.golang.org/api v0.273.1/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= -google.golang.org/genai v1.52.1 h1:dYoljKtLDXMiBdVaClSJ/ZPwZ7j1N0lGjMhwOKOQUlk= -google.golang.org/genai v1.52.1/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/api v0.274.0 h1:aYhycS5QQCwxHLwfEHRRLf9yNsfvp1JadKKWBE54RFA= +google.golang.org/api v0.274.0/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= +google.golang.org/genai v1.53.0 h1:8tR9MuO/TdaXSc8PEFamohQKxRz5M/qctbyzhV2YwMM= +google.golang.org/genai v1.53.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 h1:w8JYjr7zHemS95YA5FFwk+fUv5tdQU4I8twN9bFdxVU= google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:YCEC8W7HTtK7iBv+pI7g7hGAi7qdGB6bQXw3BIYAusM= google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= From 5f011418fbc5df2ce10ab4f4a4583b9b5233baa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:06:15 +0000 Subject: [PATCH 06/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#200) --- go.mod | 36 +++++++++++------------ go.sum | 92 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index 30f4731bc..145e89f1e 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.1 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.22.0 + github.com/ardanlabs/kronk v1.22.2 github.com/aws/aws-sdk-go-v2 v1.41.5 github.com/aws/aws-sdk-go-v2/config v1.32.14 github.com/aws/smithy-go v1.24.3 @@ -27,14 +27,14 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.6.0 // indirect - cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.61.3 // indirect + cloud.google.com/go/iam v1.7.0 // indirect + cloud.google.com/go/monitoring v1.25.0 // indirect + cloud.google.com/go/storage v1.62.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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect @@ -46,7 +46,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect @@ -104,12 +104,12 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.15 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.42.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect go.opentelemetry.io/otel/metric v1.43.0 // indirect go.opentelemetry.io/otel/sdk v1.43.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect @@ -121,13 +121,13 @@ require ( golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect golang.org/x/net v0.52.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect + golang.org/x/sys v0.43.0 // indirect golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.274.0 // indirect - google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect + google.golang.org/api v0.275.0 // indirect + google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect google.golang.org/grpc v1.80.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 4f443a095..8609a0ac9 100644 --- a/go.sum +++ b/go.sum @@ -10,18 +10,18 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.6.0 h1:JiSIcEi38dWBKhB3BtfKCW+dMvCZJEhBA2BsaGJgoxs= -cloud.google.com/go/iam v1.6.0/go.mod h1:ZS6zEy7QHmcNO18mjO2viYv/n+wOUkhJqGNkPPGueGU= -cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= -cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= -cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= -cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= -cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= -cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= -cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= -cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= -cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cloud.google.com/go/iam v1.7.0 h1:JD3zh0C6LHl16aCn5Akff0+GELdp1+4hmh6ndoFLl8U= +cloud.google.com/go/iam v1.7.0/go.mod h1:tetWZW1PD/m6vcuY2Zj/aU0eCHNPuxedbnbRTyKXvdY= +cloud.google.com/go/logging v1.14.0 h1:xpPpY8cVT6n9DgIRgrWyE+YEsGlO/994pWnbc7o5Eh4= +cloud.google.com/go/logging v1.14.0/go.mod h1:jmI+Try/fZeOTOAer3wVYOuPf9WX9PyzhlSDoBAi4HM= +cloud.google.com/go/longrunning v0.9.0 h1:0EzbDEGsAvOZNbqXopgniY0w0a1phvu5IdUFq8grmqY= +cloud.google.com/go/longrunning v0.9.0/go.mod h1:pkTz846W7bF4o2SzdWJ40Hu0Re+UoNT6Q5t+igIcb8E= +cloud.google.com/go/monitoring v1.25.0 h1:HnsTIOxTN6BCSkt1P/Im23r1m7MHTTpmSYCzPkW7NK4= +cloud.google.com/go/monitoring v1.25.0/go.mod h1:wlj6rX+JGyusw/8+2duW4cJ6kmDHGmde3zMTJuG3Jpc= +cloud.google.com/go/storage v1.62.0 h1:w2pQJhpUqVerMON45vatE2FpCYsNTf7OHjkn6ux5mMU= +cloud.google.com/go/storage v1.62.0/go.mod h1:T5hz3qzcpnxZ5LdKc7y8Tw7lh4v9zeeVyrD/cLJAzZU= +cloud.google.com/go/trace v1.12.0 h1:XvWHYfr9q88cX4pZyou6qCcSagnuASyUq2ej1dB6NzQ= +cloud.google.com/go/trace v1.12.0/go.mod h1:TOYfyeoyCGsSH0ifXD6Aius24uQI9xV3RyvOdljFIyg= 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= @@ -30,18 +30,18 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/ardanlabs/kronk v1.22.0 h1:2bzmlbM1+HefkVdFR3l8XRur/HBqSaF2qnTquYtIpyY= -github.com/ardanlabs/kronk v1.22.0/go.mod h1:wML/0reuaAXE6Bk6EnEXXEQVQosZ/pt/AZlCzi6BJTg= +github.com/ardanlabs/kronk v1.22.2 h1:86V7wMBc4JT5VPHhls/tzmHWUu/xHj2QsadeF57o3Ok= +github.com/ardanlabs/kronk v1.22.2/go.mod h1:kCGX1KkU2JlzkIKJgUoXAxsBZu4g5HQqeJ52lnCWDew= github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= @@ -68,8 +68,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3x github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0 h1:foqo/ocQ7WqKwy3FojGtZQJo0FR4vto9qnz9VaumbCo= -github.com/aws/aws-sdk-go-v2/service/s3 v1.98.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 h1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= @@ -246,20 +246,20 @@ github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= -go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= @@ -288,8 +288,8 @@ golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= @@ -298,16 +298,16 @@ golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.274.0 h1:aYhycS5QQCwxHLwfEHRRLf9yNsfvp1JadKKWBE54RFA= -google.golang.org/api v0.274.0/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= +google.golang.org/api v0.275.0 h1:vfY5d9vFVJeWEZT65QDd9hbndr7FyZ2+6mIzGAh71NI= +google.golang.org/api v0.275.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= google.golang.org/genai v1.53.0 h1:8tR9MuO/TdaXSc8PEFamohQKxRz5M/qctbyzhV2YwMM= google.golang.org/genai v1.53.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9 h1:w8JYjr7zHemS95YA5FFwk+fUv5tdQU4I8twN9bFdxVU= -google.golang.org/genproto v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:YCEC8W7HTtK7iBv+pI7g7hGAi7qdGB6bQXw3BIYAusM= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d h1:N1Ec54vZnIPd7MnxRiYLW+oY4fDR4BOS/LrssdD9+ek= +google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:c2hJ1grtnH0xUiEKGDGkjGNTJ1Hy2LrblyKOHF0sqRM= +google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d h1:/aDRtSZJjyLQzm75d+a1wOJaqyKBMvIAfeQmoa3ORiI= +google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:etfGUgejTiadZAUaEP14NP97xi1RGeawqkjDARA/UOs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1:wT2n40TBqFY6wiwazVK9/iTWbsQrgk5ZfCSVFLO9LQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From ce26050611b2a797f961a04975765c832589318d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 13 Apr 2026 11:07:30 -0300 Subject: [PATCH 07/95] ci: fix govulncheck by updating to go 1.26.2 (#201) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 145e89f1e..851af2f95 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.26.1 +go 1.26.2 require ( charm.land/x/vcr v0.1.1 From bbf53dca72d1ea29bc6769bc968cfadbaaa5cb6a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Apr 2026 11:53:22 -0400 Subject: [PATCH 08/95] fix(agent): buffer tool calls Wait until streaming has finished before dispatching tool calls to avoid getting tool results without a matching call: essentially orphans. --- agent.go | 12 ++++++++++-- providers/anthropic/anthropic_test.go | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/agent.go b/agent.go index 34d4f8a1f..f0b981be6 100644 --- a/agent.go +++ b/agent.go @@ -1248,6 +1248,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op parallel bool } toolChan := make(chan toolExecutionRequest, 10) + var pendingDispatches []toolExecutionRequest var toolExecutionWg sync.WaitGroup var toolStateMu sync.Mutex toolResults := make([]ToolResultContent, 0) @@ -1475,8 +1476,9 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op isParallel = tool.Info().Parallel } - // Send tool call to execution channel - toolChan <- toolExecutionRequest{toolCall: validatedToolCall, parallel: isParallel} + // Buffer dispatch until stream is fully consumed so that all + // OnToolCall callbacks complete before any tool result is written. + pendingDispatches = append(pendingDispatches, toolExecutionRequest{toolCall: validatedToolCall, parallel: isParallel}) // Clean up active tool call delete(activeToolCalls, part.ID) @@ -1534,6 +1536,12 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } } + // Dispatch all buffered tool calls now that the complete set is known and + // every OnToolCall callback has been called. + for _, req := range pendingDispatches { + toolChan <- req + } + // Close the tool execution channel and wait for all executions to complete close(toolChan) toolExecutionWg.Wait() diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 4387a34fa..d447954cb 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -1574,7 +1574,8 @@ func TestComputerUseToolJSON(t *testing.T) { } _, err := computerUseToolJSON(pdt) require.Error(t, err) - require.Contains(t, err.Error(), "tool_version arg is missing") }) + require.Contains(t, err.Error(), "tool_version arg is missing") + }) t.Run("returns error for unsupported version", func(t *testing.T) { t.Parallel() From 15bced7a1c8ab695bd73cf463343c79a2fb9a9ce Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Apr 2026 12:08:58 -0400 Subject: [PATCH 09/95] chore(agent): move tool execution after stream loop + add test --- agent.go | 93 +++++++++++++++++++++++--------------------- agent_stream_test.go | 86 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 45 deletions(-) diff --git a/agent.go b/agent.go index f0b981be6..7adf521ff 100644 --- a/agent.go +++ b/agent.go @@ -1247,12 +1247,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op toolCall ToolCallContent parallel bool } - toolChan := make(chan toolExecutionRequest, 10) var pendingDispatches []toolExecutionRequest - var toolExecutionWg sync.WaitGroup - var toolStateMu sync.Mutex - toolResults := make([]ToolResultContent, 0) - var toolExecutionErr error // Create a map for quick tool lookup toolMap := make(map[string]AgentTool) @@ -1265,43 +1260,6 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op execProviderToolMap[ept.GetName()] = ept } - // Semaphores for controlling parallelism - parallelSem := make(chan struct{}, 5) - var sequentialMu sync.Mutex - - // Single coordinator goroutine that dispatches tools - toolExecutionWg.Go(func() { - for req := range toolChan { - if req.parallel { - parallelSem <- struct{}{} - toolExecutionWg.Go(func() { - defer func() { <-parallelSem }() - result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) - toolStateMu.Lock() - toolResults = append(toolResults, result) - if isCriticalError && toolExecutionErr == nil { - if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error - } - } - toolStateMu.Unlock() - }) - } else { - sequentialMu.Lock() - result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) - toolStateMu.Lock() - toolResults = append(toolResults, result) - if isCriticalError && toolExecutionErr == nil { - if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error - } - } - toolStateMu.Unlock() - sequentialMu.Unlock() - } - } - }) - // Process stream parts for part := range stream { // Forward all parts to chunk callback @@ -1536,13 +1494,58 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } } - // Dispatch all buffered tool calls now that the complete set is known and - // every OnToolCall callback has been called. + // All tool calls are now collected. Create the execution channel sized to + // avoid blocking during dispatch, start the coordinator, then flush the batch. + toolChan := make(chan toolExecutionRequest, len(pendingDispatches)) + var toolExecutionWg sync.WaitGroup + var toolStateMu sync.Mutex + toolResults := make([]ToolResultContent, 0, len(pendingDispatches)) + var toolExecutionErr error + + // Semaphores for controlling parallelism. + parallelSem := make(chan struct{}, 5) + var sequentialMu sync.Mutex + + // Single coordinator goroutine that dispatches tools. + toolExecutionWg.Go(func() { + for req := range toolChan { + if req.parallel { + parallelSem <- struct{}{} + toolExecutionWg.Go(func() { + defer func() { <-parallelSem }() + result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) + toolStateMu.Lock() + toolResults = append(toolResults, result) + if isCriticalError && toolExecutionErr == nil { + if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { + toolExecutionErr = errorResult.Error + } + } + toolStateMu.Unlock() + }) + } else { + sequentialMu.Lock() + result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) + toolStateMu.Lock() + toolResults = append(toolResults, result) + if isCriticalError && toolExecutionErr == nil { + if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { + toolExecutionErr = errorResult.Error + } + } + toolStateMu.Unlock() + sequentialMu.Unlock() + } + } + }) + + // Dispatch all buffered tool calls now that every OnToolCall callback has + // been called, then close and wait. for _, req := range pendingDispatches { toolChan <- req } - // Close the tool execution channel and wait for all executions to complete + // Close the tool execution channel and wait for all executions to complete. close(toolChan) toolExecutionWg.Wait() diff --git a/agent_stream_test.go b/agent_stream_test.go index ea9009305..cddc83dd5 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "fmt" + "strings" + "sync" "testing" "github.com/stretchr/testify/require" @@ -366,6 +368,90 @@ func TestStreamingAgentWithTools(t *testing.T) { require.Equal(t, "echo", toolResults[0].ToolName) } +// TestStreamingAgentToolCallBeforeResult verifies that all OnToolCall callbacks +// complete before any OnToolResult fires. This is the ordering guarantee +// provided by buffering dispatches until the stream is fully consumed. +func TestStreamingAgentToolCallBeforeResult(t *testing.T) { + t.Parallel() + + stepCount := 0 + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + stepCount++ + return func(yield func(StreamPart) bool) { + if stepCount == 1 { + // Emit two tool calls in the same step. + for _, id := range []string{"tool-1", "tool-2"} { + if !yield(StreamPart{Type: StreamPartTypeToolInputStart, ID: id, ToolCallName: "echo"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputDelta, ID: id, Delta: `{"message": "` + id + `"}`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputEnd, ID: id}) { + return + } + if !yield(StreamPart{ + Type: StreamPartTypeToolCall, + ID: id, + ToolCallName: "echo", + ToolCallInput: `{"message": "` + id + `"}`, + }) { + return + } + } + yield(StreamPart{ + Type: StreamPartTypeFinish, + FinishReason: FinishReasonToolCalls, + }) + } else { + yield(StreamPart{ + Type: StreamPartTypeFinish, + FinishReason: FinishReasonStop, + }) + } + }, nil + }, + } + + agent := NewAgent(mockModel, WithTools(&EchoTool{})) + + var mu sync.Mutex + var events []string + + _, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "echo twice", + OnToolCall: func(tc ToolCallContent) error { + mu.Lock() + events = append(events, "call:"+tc.ToolCallID) + mu.Unlock() + return nil + }, + OnToolResult: func(tr ToolResultContent) error { + mu.Lock() + events = append(events, "result:"+tr.ToolCallID) + mu.Unlock() + return nil + }, + }) + require.NoError(t, err) + + // Both OnToolCall events must appear before any OnToolResult event. + lastCallIdx := -1 + firstResultIdx := len(events) + for i, e := range events { + if strings.HasPrefix(e, "call:") { + lastCallIdx = i + } + if strings.HasPrefix(e, "result:") && i < firstResultIdx { + firstResultIdx = i + } + } + require.Equal(t, 2, stepCount) + require.Less(t, lastCallIdx, firstResultIdx, + "all OnToolCall events must complete before the first OnToolResult; got %v", events) +} + // TestStreamingAgentTextDeltas tests text streaming (mirrors TS textStream tests) func TestStreamingAgentTextDeltas(t *testing.T) { t.Parallel() From d9b6308ceae180d3a1f9ce80ac430fb2ae543dab Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Apr 2026 12:52:11 -0400 Subject: [PATCH 10/95] v0.17.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7cca7711a..c3d16c164 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.17.1 +0.17.2 From 61bc0b206af4df5cb8b25fa20ee0082312b1a98d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Apr 2026 16:27:44 -0400 Subject: [PATCH 11/95] feat(agent): add the ability to stop a turn and end the agent loop --- agent.go | 22 +++++++- agent_stream_test.go | 80 ++++++++++++++++++++++++++ agent_test.go | 130 +++++++++++++++++++++++++++++++++++++++++++ content.go | 4 ++ tool.go | 1 + 5 files changed, 234 insertions(+), 3 deletions(-) diff --git a/agent.go b/agent.go index 7adf521ff..01912bbf3 100644 --- a/agent.go +++ b/agent.go @@ -485,7 +485,12 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err toolResults, err := a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) - // Build step content with validated tool calls and tool results. // Provider-executed tool calls are kept as-is. + // If any tool result requested a stop, deliver all results but don't + // request another completion from the model. + stopTurnRequested := hasStopTurn(toolResults) + + // Build step content with validated tool calls and tool results. + // Provider-executed tool calls are kept as-is. stepContent := []Content{} toolCallIndex := 0 for _, content := range result.Content { @@ -523,7 +528,7 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err steps = append(steps, stepResult) shouldStop := isStopConditionMet(opts.StopWhen, steps) - if shouldStop || err != nil || len(stepToolCalls) == 0 || result.FinishReason != FinishReasonToolCalls { + if shouldStop || err != nil || stopTurnRequested || len(stepToolCalls) == 0 || result.FinishReason != FinishReasonToolCalls { break } } @@ -561,6 +566,15 @@ func isStopConditionMet(conditions []StopCondition, steps []StepResult) bool { return false } +func hasStopTurn(results []ToolResultContent) bool { + for _, r := range results { + if r.StopTurn { + return true + } + } + return false +} + func toResponseMessages(content []Content) []Message { var assistantParts []MessagePart var toolParts []MessagePart @@ -729,6 +743,7 @@ func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentT Error: err, } result.ClientMetadata = toolResult.Metadata + result.StopTurn = toolResult.StopTurn if toolResultCallback != nil { _ = toolResultCallback(result) } @@ -736,6 +751,7 @@ func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentT } result.ClientMetadata = toolResult.Metadata + result.StopTurn = toolResult.StopTurn if toolResult.IsError { result.Result = ToolResultOutputContentError{ Error: errors.New(toolResult.Content), @@ -1573,7 +1589,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } // Determine if we should continue (has tool calls and not stopped) - shouldContinue := len(stepToolCalls) > 0 && stepFinishReason == FinishReasonToolCalls + shouldContinue := len(stepToolCalls) > 0 && stepFinishReason == FinishReasonToolCalls && !hasStopTurn(toolResults) return stepExecutionResult{ StepResult: stepResult, diff --git a/agent_stream_test.go b/agent_stream_test.go index cddc83dd5..13e0ac3d2 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -681,3 +681,83 @@ func TestStreamingAgentSources(t *testing.T) { resultSources := result.Response.Content.Sources() require.Equal(t, 2, len(resultSources)) } + +func TestStreamingAgent_StopTurn(t *testing.T) { + t.Parallel() + + stepCount := 0 + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + stepCount++ + return func(yield func(StreamPart) bool) { + if stepCount == 1 { + if !yield(StreamPart{Type: StreamPartTypeToolInputStart, ID: "tool-1", ToolCallName: "blocked_tool"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputDelta, ID: "tool-1", Delta: `{"message"`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputDelta, ID: "tool-1", Delta: `: "test"}`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputEnd, ID: "tool-1"}) { + return + } + if !yield(StreamPart{ + Type: StreamPartTypeToolCall, + ID: "tool-1", + ToolCallName: "blocked_tool", + ToolCallInput: `{"message": "test"}`, + }) { + return + } + yield(StreamPart{ + Type: StreamPartTypeFinish, + Usage: Usage{InputTokens: 10, OutputTokens: 5, TotalTokens: 15}, + FinishReason: FinishReasonToolCalls, + }) + } else { + // Should not be reached because StopTurn prevents a second step + t.Fatal("model should not be called a second time after StopTurn") + } + }, nil + }, + } + + type BlockedInput struct { + Message string `json:"message" description:"Message"` + } + + blockedTool := NewAgentTool( + "blocked_tool", + "A tool that stops the turn", + func(ctx context.Context, input BlockedInput, _ ToolCall) (ToolResponse, error) { + resp := NewTextErrorResponse("permission denied") + resp.StopTurn = true + return resp, nil + }, + ) + + agent := NewAgent(mockModel, WithTools(blockedTool)) + + result, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "test stop turn", + }) + require.NoError(t, err) + require.NotNil(t, result) + + // Only one step — StopTurn prevented the second model call. + require.Len(t, result.Steps, 1) + require.Equal(t, 1, stepCount) + + // Tool result should be present with StopTurn=true. + toolResults := result.Steps[0].Content.ToolResults() + require.Len(t, toolResults, 1) + require.Equal(t, "blocked_tool", toolResults[0].ToolName) + require.True(t, toolResults[0].StopTurn) + + // The final response also includes the stop-marked tool result. + responseResults := result.Response.Content.ToolResults() + require.Len(t, responseResults, 1) + require.True(t, responseResults[0].StopTurn) +} diff --git a/agent_test.go b/agent_test.go index 8d45429d2..da10747cd 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2428,3 +2428,133 @@ func TestAgent_Generate_ExecutableProviderTool_CriticalError(t *testing.T) { require.Equal(t, 1, callCount) require.Len(t, result.Steps, 1) } + +func TestAgent_Generate_StopTurn(t *testing.T) { + t.Parallel() + + type TestInput struct { + Value string `json:"value" description:"Test value"` + } + + tool1 := NewAgentTool( + "tool1", + "Test tool", + func(ctx context.Context, input TestInput, _ ToolCall) (ToolResponse, error) { + resp := NewTextErrorResponse("permission denied: this tool call was blocked") + resp.StopTurn = true + return resp, nil + }, + ) + + callCount := 0 + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + callCount++ + return &Response{ + Content: []Content{ + ToolCallContent{ + ToolCallID: "call-1", + ToolName: "tool1", + Input: `{"value":"test"}`, + }, + }, + Usage: Usage{ + InputTokens: 10, + OutputTokens: 5, + TotalTokens: 15, + }, + FinishReason: FinishReasonToolCalls, + }, nil + }, + } + + agent := NewAgent(model, WithTools(tool1)) + result, err := agent.Generate(context.Background(), AgentCall{ + Prompt: "test-input", + }) + + require.NoError(t, err) + require.NotNil(t, result) + // The model should only be called once — StopTurn prevents the second call. + require.Equal(t, 1, callCount) + require.Len(t, result.Steps, 1) + + // The tool result should still be in the step content. + toolResults := result.Steps[0].Content.ToolResults() + require.Len(t, toolResults, 1) + require.Equal(t, "tool1", toolResults[0].ToolName) + require.True(t, toolResults[0].StopTurn) + + // The final response also includes the stop-marked tool result. + responseResults := result.Response.Content.ToolResults() + require.Len(t, responseResults, 1) + require.True(t, responseResults[0].StopTurn) +} + +func TestAgent_Generate_StopTurn_NotSet(t *testing.T) { + t.Parallel() + + type TestInput struct { + Value string `json:"value" description:"Test value"` + } + + tool1 := NewAgentTool( + "tool1", + "Test tool", + func(ctx context.Context, input TestInput, _ ToolCall) (ToolResponse, error) { + return NewTextErrorResponse("normal error"), nil + }, + ) + + callCount := 0 + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + callCount++ + switch callCount { + case 1: + return &Response{ + Content: []Content{ + ToolCallContent{ + ToolCallID: "call-1", + ToolName: "tool1", + Input: `{"value":"test"}`, + }, + }, + Usage: Usage{ + InputTokens: 10, + OutputTokens: 5, + TotalTokens: 15, + }, + FinishReason: FinishReasonToolCalls, + }, nil + case 2: + return &Response{ + Content: []Content{ + TextContent{Text: "Done"}, + }, + Usage: Usage{InputTokens: 3, OutputTokens: 5, TotalTokens: 8}, + FinishReason: FinishReasonStop, + }, nil + default: + t.Fatalf("Unexpected call count: %d", callCount) + return nil, nil + } + }, + } + + agent := NewAgent(model, WithTools(tool1)) + result, err := agent.Generate(context.Background(), AgentCall{ + Prompt: "test-input", + }) + + require.NoError(t, err) + require.NotNil(t, result) + // Without StopTurn, the model gets a second call. + require.Equal(t, 2, callCount) + require.Len(t, result.Steps, 2) + + // StopTurn should be false on the tool result. + toolResults := result.Steps[0].Content.ToolResults() + require.Len(t, toolResults, 1) + require.False(t, toolResults[0].StopTurn) +} diff --git a/content.go b/content.go index 8787f7cd0..f2a122ec4 100644 --- a/content.go +++ b/content.go @@ -463,6 +463,10 @@ type ToolResultContent struct { ProviderExecuted bool `json:"provider_executed"` // Additional provider-specific metadata for the tool result. ProviderMetadata ProviderMetadata `json:"provider_metadata"` + // StopTurn indicates that the agent loop should stop after this result. + // The tool result is still delivered to the model's context, but the model + // does not get another chance to make tool calls in the same turn. + StopTurn bool `json:"stop_turn,omitempty"` } // GetType returns the type of the tool result content. diff --git a/tool.go b/tool.go index be146ef3f..b856d55fa 100644 --- a/tool.go +++ b/tool.go @@ -38,6 +38,7 @@ type ToolResponse struct { MediaType string `json:"media_type,omitempty"` Metadata string `json:"metadata,omitempty"` IsError bool `json:"is_error"` + StopTurn bool `json:"stop_turn,omitempty"` } // NewTextResponse creates a text response. From 402a113a8014ebd1088f4379f328aa6a87b106fd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Apr 2026 12:51:46 -0400 Subject: [PATCH 12/95] v0.18.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index c3d16c164..66333910a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.17.2 +0.18.0 From f60d4fef5f5e415d2065ef90ae263f20e1fae049 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Thu, 16 Apr 2026 18:47:51 +0100 Subject: [PATCH 13/95] feat(anthropic): add `EffortXHigh` constant (#204) --- providers/anthropic/provider_options.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/providers/anthropic/provider_options.go b/providers/anthropic/provider_options.go index 1bff4979a..a429b3ec8 100644 --- a/providers/anthropic/provider_options.go +++ b/providers/anthropic/provider_options.go @@ -19,6 +19,8 @@ const ( EffortMedium Effort = "medium" // EffortHigh represents high output effort. EffortHigh Effort = "high" + // EffortXHigh represents extra-high output effort. + EffortXHigh Effort = "xhigh" // EffortMax represents maximum output effort. EffortMax Effort = "max" ) From b2c4b61366bca30980955dda63e90289e45d3115 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 16 Apr 2026 14:50:22 -0300 Subject: [PATCH 14/95] v0.19.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 66333910a..1cf0537c3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.18.0 +0.19.0 From 12cec6447e7ef5851748b8dcfc525ba180c55812 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 10:09:32 +0000 Subject: [PATCH 15/95] chore(deps): bump the all group with 4 updates (#206) Bumps the all group with 4 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/smithy-go](https://github.com/aws/smithy-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2` from 1.41.5 to 1.41.6 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.41.5...v1.41.6) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.14 to 1.32.16 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.14...config/v1.32.16) Updates `github.com/aws/smithy-go` from 1.24.3 to 1.25.0 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.24.3...v1.25.0) Updates `google.golang.org/genai` from 1.53.0 to 1.54.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.53.0...v1.54.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.41.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.16 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/smithy-go dependency-version: 1.25.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.54.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 31 ++++++++++++++--------------- go.sum | 62 ++++++++++++++++++++++++++++------------------------------ 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/go.mod b/go.mod index 851af2f95..4e56deaf6 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.22.2 - github.com/aws/aws-sdk-go-v2 v1.41.5 - github.com/aws/aws-sdk-go-v2/config v1.32.14 - github.com/aws/smithy-go v1.24.3 + github.com/aws/aws-sdk-go-v2 v1.41.6 + github.com/aws/aws-sdk-go-v2/config v1.32.16 + github.com/aws/smithy-go v1.25.0 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -19,7 +19,7 @@ require ( github.com/kaptinlin/jsonschema v0.7.7 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.53.0 + google.golang.org/genai v1.54.0 ) require ( @@ -36,21 +36,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.14 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.15 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect diff --git a/go.sum b/go.sum index 8609a0ac9..0fc88588f 100644 --- a/go.sum +++ b/go.sum @@ -42,44 +42,42 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/ardanlabs/kronk v1.22.2 h1:86V7wMBc4JT5VPHhls/tzmHWUu/xHj2QsadeF57o3Ok= github.com/ardanlabs/kronk v1.22.2/go.mod h1:kCGX1KkU2JlzkIKJgUoXAxsBZu4g5HQqeJ52lnCWDew= -github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= -github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2 v1.41.6 h1:1AX0AthnBQzMx1vbmir3Y4WsnJgiydmnJjiLu+LvXOg= +github.com/aws/aws-sdk-go-v2 v1.41.6/go.mod h1:dy0UzBIfwSeot4grGvY1AqFWN5zgziMmWGzysDnHFcQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= -github.com/aws/aws-sdk-go-v2/config v1.32.14 h1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI= -github.com/aws/aws-sdk-go-v2/config v1.32.14/go.mod h1:U4/V0uKxh0Tl5sxmCBZ3AecYny4UNlVmObYjKuuaiOo= -github.com/aws/aws-sdk-go-v2/credentials v1.19.14 h1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI= -github.com/aws/aws-sdk-go-v2/credentials v1.19.14/go.mod h1:cJKuyWB59Mqi0jM3nFYQRmnHVQIcgoxjEMAbLkpr62w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21 h1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.21/go.mod h1:YWNWJQNjKigKY1RHVJCuupeWDrrHjRqHm0N9rdrWzYI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/config v1.32.16 h1:Q0iQ7quUgJP0F/SCRTieScnaMdXr9h/2+wze1u3cNeM= +github.com/aws/aws-sdk-go-v2/config v1.32.16/go.mod h1:duCCnJEFqpt2RC6no1iK6q+8HpwOAkiUua0pY507dQc= +github.com/aws/aws-sdk-go-v2/credentials v1.19.15 h1:fyvgWTszojq8hEnMi8PPBTvZdTtEVmAVyo+NFLHBhH4= +github.com/aws/aws-sdk-go-v2/credentials v1.19.15/go.mod h1:gJiYyMOjNg8OEdRWOf3CrFQxM2a98qmrtjx1zuiQfB8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 h1:IOGsJ1xVWhsi+ZO7/NW8OuZZBtMJLZbk4P5HDjJO0jQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22/go.mod h1:b+hYdbU+jGKfXE8kKM6g1+h+L/Go3vMvzlxBsiuGsxg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 h1:GmLa5Kw1ESqtFpXsx5MmC84QWa/ZrLZvlJGa2y+4kcQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22/go.mod h1:6sW9iWm9DK9YRpRGga/qzrzNLgKpT2cIxb7Vo2eNOp0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 h1:dY4kWZiSaXIzxnKlj17nHnBcXXBfac6UlsAx2qL6XrU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22/go.mod h1:KIpEUx0JuRZLO7U6cbV204cWAEco2iC3l061IxlwLtI= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 h1:FPXsW9+gMuIeKmz7j6ENWcWtBGTe1kH8r9thNt5Uxx4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23/go.mod h1:7J8iGMdRKk6lw2C+cMIphgAnT8uTwBwNOsGkyOCm80U= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 h1:HtOTYcbVcGABLOVuPYaIihj6IlkqubBwFj10K5fxRek= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8/go.mod h1:VsK9abqQeGlzPgUr+isNWzPlK2vKe9INMLWnY65f5Xs= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 h1:PUmZeJU6Y1Lbvt9WFuJ0ugUK2xn6hIWUBBbKuOWF30s= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22/go.mod h1:nO6egFBoAaoXze24a2C0NjQCvdpk8OueRoYimvEB9jo= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 h1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk= github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.9 h1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.9/go.mod h1:7yuQJoT+OoH8aqIxw9vwF+8KpvLZ8AWmvmUWHsGQZvI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.15 h1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.15/go.mod h1:WSvS1NLr7JaPunCXqpJnWk1Bjo7IxzZXrZi1QQCkuqM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19 h1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.19/go.mod h1:YO8TrYtFdl5w/4vmjL8zaBSsiNp3w0L1FfKVKenZT7w= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.10 h1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.10/go.mod h1:60dv0eZJfeVXfbT1tFJinbHrDfSJ2GZl4Q//OSSNAVw= -github.com/aws/smithy-go v1.24.3 h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg= -github.com/aws/smithy-go v1.24.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 h1:a1Fq/KXn75wSzoJaPQTgZO0wHGqE9mjFnylnqEPTchA= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.10/go.mod h1:p6+MXNxW7IA6dMgHfTAzljuwSKD0NCm/4lbS4t6+7vI= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 h1:x6bKbmDhsgSZwv6q19wY/u3rLk/3FGjJWyqKcIRufpE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.16/go.mod h1:CudnEVKRtLn0+3uMV0yEXZ+YZOKnAtUJ5DmDhilVnIw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 h1:oK/njaL8GtyEihkWMD4k3VgHCT64RQKkZwh0DG5j8ak= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20/go.mod h1:JHs8/y1f3zY7U5WcuzoJ/yAYGYtNIVPKLIbp61euvmg= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 h1:ks8KBcZPh3PYISr5dAiXCM5/Thcuxk8l+PG4+A0exds= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.0/go.mod h1:pFw33T0WLvXU3rw1WBkpMlkgIn54eCB5FYLhjDc9Foo= +github.com/aws/smithy-go v1.25.0 h1:Sz/XJ64rwuiKtB6j98nDIPyYrV1nVNJ4YU74gttcl5U= +github.com/aws/smithy-go v1.25.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -300,8 +298,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.275.0 h1:vfY5d9vFVJeWEZT65QDd9hbndr7FyZ2+6mIzGAh71NI= google.golang.org/api v0.275.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= -google.golang.org/genai v1.53.0 h1:8tR9MuO/TdaXSc8PEFamohQKxRz5M/qctbyzhV2YwMM= -google.golang.org/genai v1.53.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.54.0 h1:ZQCa70WMTJDI11FdqWCzGvZ5PanpcpfoO6jl/lrSnGU= +google.golang.org/genai v1.54.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d h1:N1Ec54vZnIPd7MnxRiYLW+oY4fDR4BOS/LrssdD9+ek= google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:c2hJ1grtnH0xUiEKGDGkjGNTJ1Hy2LrblyKOHF0sqRM= google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d h1:/aDRtSZJjyLQzm75d+a1wOJaqyKBMvIAfeQmoa3ORiI= From 3bfd3c8f6b927eeaba26946cd7a7e39107f85835 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 10:15:10 +0000 Subject: [PATCH 16/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#207) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.22.2 to 1.23.1 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.22.2...v1.23.1) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.23.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 37 ++++++++----------- go.sum | 111 ++++++++++++++++++++------------------------------------- 2 files changed, 53 insertions(+), 95 deletions(-) diff --git a/go.mod b/go.mod index 4e56deaf6..5b7f43992 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.2 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.22.2 + github.com/ardanlabs/kronk v1.23.1 github.com/aws/aws-sdk-go-v2 v1.41.6 github.com/aws/aws-sdk-go-v2/config v1.32.16 github.com/aws/smithy-go v1.25.0 @@ -27,14 +27,15 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.7.0 // indirect - cloud.google.com/go/monitoring v1.25.0 // indirect - cloud.google.com/go/storage v1.62.0 // indirect + cloud.google.com/go/iam v1.9.0 // indirect + cloud.google.com/go/monitoring v1.27.0 // indirect + cloud.google.com/go/storage v1.62.1 // 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect + github.com/ardanlabs/jinja v1.1.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.15 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 // indirect @@ -56,7 +57,6 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.10.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect @@ -68,34 +68,28 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.21.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect + github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.11.1 // indirect - github.com/json-iterator/go v1.1.12 // indirect + github.com/hybridgroup/yzma v1.12.0 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect github.com/kaptinlin/go-i18n v0.3.0 // indirect github.com/kaptinlin/jsonpointer v0.4.17 // indirect github.com/kaptinlin/messageformat-go v0.4.19 // indirect github.com/klauspost/compress v1.18.5 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nikolalohinski/gonja/v2 v2.7.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/procfs v0.20.1 // indirect - github.com/sirupsen/logrus v1.9.4 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -116,17 +110,16 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.49.0 // indirect - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/net v0.52.0 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/net v0.53.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.35.0 // indirect + golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.275.0 // indirect - google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect + google.golang.org/api v0.276.0 // indirect + google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/grpc v1.80.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 0fc88588f..690b1e625 100644 --- a/go.sum +++ b/go.sum @@ -10,18 +10,18 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.7.0 h1:JD3zh0C6LHl16aCn5Akff0+GELdp1+4hmh6ndoFLl8U= -cloud.google.com/go/iam v1.7.0/go.mod h1:tetWZW1PD/m6vcuY2Zj/aU0eCHNPuxedbnbRTyKXvdY= -cloud.google.com/go/logging v1.14.0 h1:xpPpY8cVT6n9DgIRgrWyE+YEsGlO/994pWnbc7o5Eh4= -cloud.google.com/go/logging v1.14.0/go.mod h1:jmI+Try/fZeOTOAer3wVYOuPf9WX9PyzhlSDoBAi4HM= -cloud.google.com/go/longrunning v0.9.0 h1:0EzbDEGsAvOZNbqXopgniY0w0a1phvu5IdUFq8grmqY= -cloud.google.com/go/longrunning v0.9.0/go.mod h1:pkTz846W7bF4o2SzdWJ40Hu0Re+UoNT6Q5t+igIcb8E= -cloud.google.com/go/monitoring v1.25.0 h1:HnsTIOxTN6BCSkt1P/Im23r1m7MHTTpmSYCzPkW7NK4= -cloud.google.com/go/monitoring v1.25.0/go.mod h1:wlj6rX+JGyusw/8+2duW4cJ6kmDHGmde3zMTJuG3Jpc= -cloud.google.com/go/storage v1.62.0 h1:w2pQJhpUqVerMON45vatE2FpCYsNTf7OHjkn6ux5mMU= -cloud.google.com/go/storage v1.62.0/go.mod h1:T5hz3qzcpnxZ5LdKc7y8Tw7lh4v9zeeVyrD/cLJAzZU= -cloud.google.com/go/trace v1.12.0 h1:XvWHYfr9q88cX4pZyou6qCcSagnuASyUq2ej1dB6NzQ= -cloud.google.com/go/trace v1.12.0/go.mod h1:TOYfyeoyCGsSH0ifXD6Aius24uQI9xV3RyvOdljFIyg= +cloud.google.com/go/iam v1.9.0 h1:89wyjxT6DL4b5rk/Nk8eBC9DHqf+JiMstrn5IEYxFw4= +cloud.google.com/go/iam v1.9.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.15.0 h1:6ooUEBNT6jdWh2b36+iuPn6b/R9qN/tHCbvGS5255gg= +cloud.google.com/go/logging v1.15.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.10.0 h1:4OWvp1BjCvoeSZTog3sRFDu6j4IrI9TI4/Y9N+8h25g= +cloud.google.com/go/longrunning v0.10.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.27.0 h1:BhYwMqao+e5Nn7JtWMM9m6zRtKtVUK6kJWMizXChkLU= +cloud.google.com/go/monitoring v1.27.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= +cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.13.0 h1:RfqsqPOiSCG8ql50UZt5F65KrVa1zbY9mJrO7xvZfbE= +cloud.google.com/go/trace v1.13.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= 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= @@ -38,10 +38,10 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/ardanlabs/kronk v1.22.2 h1:86V7wMBc4JT5VPHhls/tzmHWUu/xHj2QsadeF57o3Ok= -github.com/ardanlabs/kronk v1.22.2/go.mod h1:kCGX1KkU2JlzkIKJgUoXAxsBZu4g5HQqeJ52lnCWDew= +github.com/ardanlabs/jinja v1.1.0 h1:SZtVrV+1szfSBXBKQA5FoJtOabUxkJu5IvEX+ADUtcM= +github.com/ardanlabs/jinja v1.1.0/go.mod h1:onVec/ZOYPqNm7TRiNfJBnW+t9VxSi2gkARWhgP9qwQ= +github.com/ardanlabs/kronk v1.23.1 h1:5grtasj/ZIPHod0P9tG38RKZkRiOmLMjX2QwxpLzi8s= +github.com/ardanlabs/kronk v1.23.1/go.mod h1:a3FhTn4vz2tR0axNBCiG8SzFw33bN0WA9EBAK+YMYIE= github.com/aws/aws-sdk-go-v2 v1.41.6 h1:1AX0AthnBQzMx1vbmir3Y4WsnJgiydmnJjiLu+LvXOg= github.com/aws/aws-sdk-go-v2 v1.41.6/go.mod h1:dy0UzBIfwSeot4grGvY1AqFWN5zgziMmWGzysDnHFcQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= @@ -96,14 +96,10 @@ github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQA github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= @@ -125,8 +121,6 @@ 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-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= @@ -137,19 +131,16 @@ 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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= -github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.21.0 h1:h45NjjzEO3faG9Lg/cFrBh2PgegVVgzqKzuZl/wMbiI= -github.com/googleapis/gax-go/v2 v2.21.0/go.mod h1:But/NJU6TnZsrLai/xBAQLLz+Hc7fHZJt/hsCz3Fih4= +github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas= +github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= @@ -162,12 +153,10 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.11.1 h1:HvpPAFzg6lAWTFgxC8R/wjkRbTW2hd2dEM0F41t/gq8= -github.com/hybridgroup/yzma v1.11.1/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hybridgroup/yzma v1.12.0 h1:kRHZdzEQCuQaBCUx7AVWYqVUvTHw8qB6gp+9ORcryLg= +github.com/hybridgroup/yzma v1.12.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= github.com/kaptinlin/go-i18n v0.3.0 h1:wP76dvYg04bvwTb+8NB+CmdZ2kL7lSSCQ9B/kFv7QHo= @@ -188,28 +177,14 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nikolalohinski/gonja/v2 v2.7.0 h1:XuwnulQVPwzGaM0J/9AaQv0AFPBAxKI1GILifQ1r9pk= -github.com/nikolalohinski/gonja/v2 v2.7.0/go.mod h1:UIzXPVuOsr5h7dZ5DUbqk3/Z7oFA/NLGQGMjqT4L2aU= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= @@ -222,12 +197,8 @@ github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEy github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= -github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -256,8 +227,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bT go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= @@ -268,44 +239,38 @@ go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09 go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.275.0 h1:vfY5d9vFVJeWEZT65QDd9hbndr7FyZ2+6mIzGAh71NI= -google.golang.org/api v0.275.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= +google.golang.org/api v0.276.0 h1:nVArUtfLEihtW+b0DdcqRGK1xoEm2+ltAihyztq7MKY= +google.golang.org/api v0.276.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= google.golang.org/genai v1.54.0 h1:ZQCa70WMTJDI11FdqWCzGvZ5PanpcpfoO6jl/lrSnGU= google.golang.org/genai v1.54.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d h1:N1Ec54vZnIPd7MnxRiYLW+oY4fDR4BOS/LrssdD9+ek= -google.golang.org/genproto v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:c2hJ1grtnH0xUiEKGDGkjGNTJ1Hy2LrblyKOHF0sqRM= -google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d h1:/aDRtSZJjyLQzm75d+a1wOJaqyKBMvIAfeQmoa3ORiI= -google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:etfGUgejTiadZAUaEP14NP97xi1RGeawqkjDARA/UOs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d h1:wT2n40TBqFY6wiwazVK9/iTWbsQrgk5ZfCSVFLO9LQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 h1:aLsVTW0lZ8+IY5u/ERjZSCvAmhuR7slKzyha3YikDNA= +google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478/go.mod h1:YJAzKjfHIUHb9T+bfu8L7mthAp7VVXQBUs1PLdBWS7M= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From 471520cfa309312970eaff6c8803434e33b4ae94 Mon Sep 17 00:00:00 2001 From: Lauri Jutila Date: Wed, 22 Apr 2026 18:04:13 +0300 Subject: [PATCH 17/95] fix(anthropic/openai/google): wrap `io.ErrUnexpectedEOF` as `ProviderError` (#198) --- providers/anthropic/error.go | 9 +++++ providers/anthropic/error_test.go | 67 +++++++++++++++++++++++++++++++ providers/google/error.go | 9 +++++ providers/google/error_test.go | 63 +++++++++++++++++++++++++++++ providers/openai/error.go | 8 ++++ providers/openai/error_test.go | 63 +++++++++++++++++++++++++++++ 6 files changed, 219 insertions(+) create mode 100644 providers/anthropic/error_test.go create mode 100644 providers/google/error_test.go create mode 100644 providers/openai/error_test.go diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index c4022d464..a2a351d50 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -3,6 +3,7 @@ package anthropic import ( "cmp" "errors" + "io" "net/http" "regexp" "strconv" @@ -32,6 +33,14 @@ func toProviderErr(err error) error { return providerErr } + // Wrap in a `ProviderError` so `.IsRetriable()` works. + if errors.Is(err, io.ErrUnexpectedEOF) { + return &fantasy.ProviderError{ + Title: "stream transport error", + Message: err.Error(), + Cause: err, + } + } return err } diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go new file mode 100644 index 000000000..26273a352 --- /dev/null +++ b/providers/anthropic/error_test.go @@ -0,0 +1,67 @@ +package anthropic + +import ( + "errors" + "fmt" + "io" + "testing" + + "charm.land/fantasy" +) + +func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + err error + }{ + {"direct", io.ErrUnexpectedEOF}, + {"wrapped", fmt.Errorf("read stream: %w", io.ErrUnexpectedEOF)}, + {"double_wrapped", fmt.Errorf("anthropic: %w", fmt.Errorf("sse: %w", io.ErrUnexpectedEOF))}, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + got := toProviderErr(tc.err) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) + } + if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { + t.Errorf("ProviderError.Cause = %v, want chain containing io.ErrUnexpectedEOF", providerErr.Cause) + } + if !providerErr.IsRetryable() { + t.Error("wrapped io.ErrUnexpectedEOF must be retryable so retry.go engages") + } + }) + } +} + +func TestToProviderErr_PassesThroughUnrelatedErrors(t *testing.T) { + t.Parallel() + + err := errors.New("something unrelated") + got := toProviderErr(err) + if got != err { + t.Errorf("toProviderErr mutated unrelated error: got %v, want %v", got, err) + } +} + +func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { + t.Parallel() + + // A clean io.EOF at the end of a stream is not a failure — the streaming + // handler in anthropic.go treats it as a normal terminator and never + // calls toProviderErr with io.EOF. But if it ever did, we should not + // wrap it: io.EOF is not "retryable" in the ProviderError sense. + got := toProviderErr(io.EOF) + var providerErr *fantasy.ProviderError + if errors.As(got, &providerErr) { + t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") + } +} diff --git a/providers/google/error.go b/providers/google/error.go index 25e915c2c..cd706384e 100644 --- a/providers/google/error.go +++ b/providers/google/error.go @@ -3,6 +3,7 @@ package google import ( "cmp" "errors" + "io" "regexp" "strconv" @@ -15,6 +16,14 @@ var googleContextPattern = regexp.MustCompile(`input token count.*?(\d+).*?excee func toProviderErr(err error) error { var apiErr genai.APIError if !errors.As(err, &apiErr) { + // Wrap in a `ProviderError` so `.IsRetriable()` works. + if errors.Is(err, io.ErrUnexpectedEOF) { + return &fantasy.ProviderError{ + Title: "stream transport error", + Message: err.Error(), + Cause: err, + } + } return err } diff --git a/providers/google/error_test.go b/providers/google/error_test.go new file mode 100644 index 000000000..693f35ee2 --- /dev/null +++ b/providers/google/error_test.go @@ -0,0 +1,63 @@ +package google + +import ( + "errors" + "fmt" + "io" + "testing" + + "charm.land/fantasy" +) + +func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + err error + }{ + {"direct", io.ErrUnexpectedEOF}, + {"wrapped", fmt.Errorf("read stream: %w", io.ErrUnexpectedEOF)}, + {"double_wrapped", fmt.Errorf("google: %w", fmt.Errorf("sse: %w", io.ErrUnexpectedEOF))}, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + got := toProviderErr(tc.err) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) + } + if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { + t.Errorf("ProviderError.Cause = %v, want chain containing io.ErrUnexpectedEOF", providerErr.Cause) + } + if !providerErr.IsRetryable() { + t.Error("wrapped io.ErrUnexpectedEOF must be retryable so retry.go engages") + } + }) + } +} + +func TestToProviderErr_PassesThroughUnrelatedErrors(t *testing.T) { + t.Parallel() + + err := errors.New("something unrelated") + got := toProviderErr(err) + if got != err { + t.Errorf("toProviderErr mutated unrelated error: got %v, want %v", got, err) + } +} + +func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { + t.Parallel() + + got := toProviderErr(io.EOF) + var providerErr *fantasy.ProviderError + if errors.As(got, &providerErr) { + t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") + } +} diff --git a/providers/openai/error.go b/providers/openai/error.go index 861b79eea..5cbc76be0 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -34,6 +34,14 @@ func toProviderErr(err error) error { return providerErr } + // Wrap in a `ProviderError` so `.IsRetriable()` works. + if errors.Is(err, io.ErrUnexpectedEOF) { + return &fantasy.ProviderError{ + Title: "stream transport error", + Message: err.Error(), + Cause: err, + } + } return err } diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go new file mode 100644 index 000000000..2914f8501 --- /dev/null +++ b/providers/openai/error_test.go @@ -0,0 +1,63 @@ +package openai + +import ( + "errors" + "fmt" + "io" + "testing" + + "charm.land/fantasy" +) + +func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + err error + }{ + {"direct", io.ErrUnexpectedEOF}, + {"wrapped", fmt.Errorf("read stream: %w", io.ErrUnexpectedEOF)}, + {"double_wrapped", fmt.Errorf("openai: %w", fmt.Errorf("sse: %w", io.ErrUnexpectedEOF))}, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + got := toProviderErr(tc.err) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) + } + if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { + t.Errorf("ProviderError.Cause = %v, want chain containing io.ErrUnexpectedEOF", providerErr.Cause) + } + if !providerErr.IsRetryable() { + t.Error("wrapped io.ErrUnexpectedEOF must be retryable so retry.go engages") + } + }) + } +} + +func TestToProviderErr_PassesThroughUnrelatedErrors(t *testing.T) { + t.Parallel() + + err := errors.New("something unrelated") + got := toProviderErr(err) + if got != err { + t.Errorf("toProviderErr mutated unrelated error: got %v, want %v", got, err) + } +} + +func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { + t.Parallel() + + got := toProviderErr(io.EOF) + var providerErr *fantasy.ProviderError + if errors.As(got, &providerErr) { + t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") + } +} From 95dcd6eee433608023587f3298121b2d7fdee117 Mon Sep 17 00:00:00 2001 From: Nic-vdwalt <36562088+Nic-vdwalt@users.noreply.github.com> Date: Wed, 22 Apr 2026 17:09:37 +0200 Subject: [PATCH 18/95] feat(anthropic): add document support for pdf and text file content blocks (#197) --- providers/anthropic/anthropic.go | 15 +++++++-- providers/anthropic/anthropic_test.go | 46 ++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 2f05b2f12..882a22c9c 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -831,7 +831,6 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl if !ok { continue } - // TODO: handle other file types switch { case strings.HasPrefix(file.MediaType, "image/"): base64Encoded := base64.StdEncoding.EncodeToString(file.Data) @@ -840,10 +839,22 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl imageBlock.OfImage.CacheControl = anthropic.NewCacheControlEphemeralParam() } anthropicContent = append(anthropicContent, imageBlock) + case file.MediaType == "application/pdf": + base64Encoded := base64.StdEncoding.EncodeToString(file.Data) + docBlock := anthropic.NewDocumentBlock(anthropic.Base64PDFSourceParam{ + Data: base64Encoded, + }) + if cacheControl != nil { + docBlock.OfDocument.CacheControl = anthropic.NewCacheControlEphemeralParam() + } + anthropicContent = append(anthropicContent, docBlock) case strings.HasPrefix(file.MediaType, "text/"): documentBlock := anthropic.NewDocumentBlock(anthropic.PlainTextSourceParam{ Data: string(file.Data), }) + if cacheControl != nil { + documentBlock.OfDocument.CacheControl = anthropic.NewCacheControlEphemeralParam() + } anthropicContent = append(anthropicContent, documentBlock) } } @@ -1050,7 +1061,7 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl func hasVisibleUserContent(content []anthropic.ContentBlockParamUnion) bool { for _, block := range content { - if block.OfText != nil || block.OfImage != nil || block.OfToolResult != nil { + if block.OfText != nil || block.OfImage != nil || block.OfDocument != nil || block.OfToolResult != nil { return true } } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index d447954cb..69c41f94f 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -262,6 +262,50 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) }) + t.Run("should keep user messages with PDF content", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.FilePart{ + Data: []byte("fake pdf data"), + MediaType: "application/pdf", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Len(t, messages, 1) + require.Empty(t, warnings) + }) + + t.Run("should keep user messages with text document content", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.FilePart{ + Data: []byte("# Hello World\nSome markdown content"), + MediaType: "text/markdown", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Len(t, messages, 1) + require.Empty(t, warnings) + }) + t.Run("should drop user messages without visible content", func(t *testing.T) { t.Parallel() @@ -271,7 +315,7 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { Content: []fantasy.MessagePart{ fantasy.FilePart{ Data: []byte("not supported"), - MediaType: "application/pdf", + MediaType: "application/zip", }, }, }, From b852eff331c36a71fc707b853406bc775ae4c4c3 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 22 Apr 2026 12:10:06 -0300 Subject: [PATCH 19/95] v0.20.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 1cf0537c3..5a03fb737 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.19.0 +0.20.0 From 6d22b8511be89ca827fac3f22573b03d73b0acfe Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Fri, 24 Apr 2026 21:25:03 +0200 Subject: [PATCH 20/95] feat(openai): add gpt-5.5 responses models (#211) --- providers/openai/responses_options.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/providers/openai/responses_options.go b/providers/openai/responses_options.go index a80a5d310..42cdf984c 100644 --- a/providers/openai/responses_options.go +++ b/providers/openai/responses_options.go @@ -219,6 +219,8 @@ var responsesReasoningModelIDs = []string{ "gpt-5.4-mini", "gpt-5.4-nano", "gpt-5.4-codex", + "gpt-5.5", + "gpt-5.5-pro", "gpt-oss-120b", } From 5975b48ed54cf7d755505a78bde8a6f4994d073d Mon Sep 17 00:00:00 2001 From: carsonfarmer Date: Fri, 24 Apr 2026 12:26:51 -0700 Subject: [PATCH 21/95] fix(openaicompat): parse "reasoning" field and include reasoning_content on tool call messages (#196) Some OpenAI-compatible providers (e.g. Moonshot AI/Kimi) send reasoning content under the "reasoning" JSON field rather than "reasoning_content". The ReasoningData struct only looked for "reasoning_content", silently dropping all reasoning from these providers. Additionally, when thinking is enabled, providers like Kimi require reasoning_content to be present on all assistant tool call messages, even if empty. Without this, multi-turn conversations with tool calls fail with "thinking is enabled but reasoning_content is missing". Co-authored-by: Claude Opus 4.6 (1M context) --- .../openaicompat/language_model_hooks.go | 17 ++++-- providers/openaicompat/openaicompat_test.go | 55 +++++++++++++++++++ providers/openaicompat/provider_options.go | 10 ++++ 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index b43cb4eea..e6018b489 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -58,9 +58,9 @@ func ExtraContentFunc(choice openaisdk.ChatCompletionChoice) []fantasy.Content { if err != nil { return content } - if reasoningData.ReasoningContent != "" { + if rc := reasoningData.GetReasoningContent(); rc != "" { content = append(content, fantasy.ReasoningContent{ - Text: reasoningData.ReasoningContent, + Text: rc, }) } return content @@ -114,11 +114,11 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str Delta: reasoningContent, }) } - if reasoningData.ReasoningContent != "" { + if rc := reasoningData.GetReasoningContent(); rc != "" { if !reasoningStarted { ctx[reasoningStartedCtx] = true } - return ctx, emitEvent(reasoningData.ReasoningContent) + return ctx, emitEvent(rc) } if reasoningStarted && (choice.Delta.Content != "" || len(choice.Delta.ToolCalls) > 0) { ctx[reasoningStartedCtx] = false @@ -137,6 +137,8 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning + hasReasoning := false + for _, msg := range prompt { switch msg.Role { case fantasy.MessageRoleSystem: @@ -348,6 +350,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio continue } reasoningText = reasoningPart.Text + hasReasoning = true case fantasy.ContentTypeToolCall: toolCallPart, ok := fantasy.AsContentType[fantasy.ToolCallPart](c) if !ok { @@ -370,8 +373,10 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) } } - // Add reasoning_content field if present - if reasoningText != "" { + // Add reasoning_content field if present, or if thinking is enabled + // and the message has tool calls (some providers like Kimi require + // reasoning_content on all assistant messages when thinking is enabled). + if reasoningText != "" || (hasReasoning && len(assistantMsg.ToolCalls) > 0) { assistantMsg.SetExtraFields(map[string]any{ "reasoning_content": reasoningText, }) diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index a603e5e66..c48eb087d 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -347,6 +347,61 @@ func TestToPromptFunc_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) }) + t.Run("should add empty reasoning_content to tool call messages when thinking is enabled", func(t *testing.T) { + t.Parallel() + + // When thinking is enabled (reasoning parts exist in history), + // tool call messages without their own reasoning must still include + // reasoning_content. Providers like Kimi require it. + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "What is 2+2?"}, + }, + }, + { + // First turn has reasoning + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "Simple math."}, + fantasy.TextPart{Text: "Four"}, + }, + }, + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Now try a tool call"}, + }, + }, + { + // Tool call WITHOUT reasoning on this turn + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ + ToolCallID: "call_1", + ToolName: "execute", + Input: `{"command":"echo 4"}`, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 4) + + // Tool call message must have reasoning_content (empty) since + // thinking is enabled in this conversation + msg := messages[3].OfAssistant + require.NotNil(t, msg) + extraFields := msg.ExtraFields() + reasoningContent, hasReasoning := extraFields["reasoning_content"] + require.True(t, hasReasoning, "reasoning_content must be present on tool call messages when thinking is enabled") + require.Equal(t, "", reasoningContent) + }) + t.Run("should drop user messages without visible content", func(t *testing.T) { t.Parallel() diff --git a/providers/openaicompat/provider_options.go b/providers/openaicompat/provider_options.go index afb037bf2..561860c32 100644 --- a/providers/openaicompat/provider_options.go +++ b/providers/openaicompat/provider_options.go @@ -31,8 +31,18 @@ type ProviderOptions struct { } // ReasoningData represents reasoning data for OpenAI-compatible provider. +// Some providers use "reasoning_content" (e.g. Avian), others use "reasoning" (e.g. Moonshot AI/Kimi). type ReasoningData struct { ReasoningContent string `json:"reasoning_content"` + Reasoning string `json:"reasoning"` +} + +// GetReasoningContent returns the reasoning text from whichever field is populated. +func (r ReasoningData) GetReasoningContent() string { + if r.ReasoningContent != "" { + return r.ReasoningContent + } + return r.Reasoning } // Options implements the ProviderOptions interface. From d9ff008e879c0954aea672458151aff81b155050 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 24 Apr 2026 16:42:13 -0300 Subject: [PATCH 22/95] v0.21.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 5a03fb737..885415662 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.20.0 +0.21.0 From f8a3e2ff5e9384817d5843162bb3aa34a48040e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:22:38 +0000 Subject: [PATCH 23/95] chore(deps): bump the all group with 2 updates (#215) Bumps the all group with 2 updates: [github.com/aws/smithy-go](https://github.com/aws/smithy-go) and [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema). Updates `github.com/aws/smithy-go` from 1.25.0 to 1.25.1 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.25.0...v1.25.1) Updates `github.com/kaptinlin/jsonschema` from 0.7.7 to 0.7.11 - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.7...v0.7.11) --- updated-dependencies: - dependency-name: github.com/aws/smithy-go dependency-version: 1.25.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.7.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 5b7f43992..35088ca9f 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/ardanlabs/kronk v1.23.1 github.com/aws/aws-sdk-go-v2 v1.41.6 github.com/aws/aws-sdk-go-v2/config v1.32.16 - github.com/aws/smithy-go v1.25.0 + github.com/aws/smithy-go v1.25.1 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -16,7 +16,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.7 + github.com/kaptinlin/jsonschema v0.7.11 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/genai v1.54.0 @@ -78,9 +78,9 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.12.0 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect - github.com/kaptinlin/go-i18n v0.3.0 // indirect - github.com/kaptinlin/jsonpointer v0.4.17 // indirect - github.com/kaptinlin/messageformat-go v0.4.19 // indirect + github.com/kaptinlin/go-i18n v0.4.4 // indirect + github.com/kaptinlin/jsonpointer v0.4.19 // indirect + github.com/kaptinlin/messageformat-go v0.6.0 // indirect github.com/klauspost/compress v1.18.5 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index 690b1e625..c4340d732 100644 --- a/go.sum +++ b/go.sum @@ -76,8 +76,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 h1:oK/njaL8GtyEihkWMD4k3Vg github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20/go.mod h1:JHs8/y1f3zY7U5WcuzoJ/yAYGYtNIVPKLIbp61euvmg= github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 h1:ks8KBcZPh3PYISr5dAiXCM5/Thcuxk8l+PG4+A0exds= github.com/aws/aws-sdk-go-v2/service/sts v1.42.0/go.mod h1:pFw33T0WLvXU3rw1WBkpMlkgIn54eCB5FYLhjDc9Foo= -github.com/aws/smithy-go v1.25.0 h1:Sz/XJ64rwuiKtB6j98nDIPyYrV1nVNJ4YU74gttcl5U= -github.com/aws/smithy-go v1.25.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= +github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -159,14 +159,14 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= -github.com/kaptinlin/go-i18n v0.3.0 h1:wP76dvYg04bvwTb+8NB+CmdZ2kL7lSSCQ9B/kFv7QHo= -github.com/kaptinlin/go-i18n v0.3.0/go.mod h1:pVcu9qsW5pOIOoZFJXesRYmLos1vMQrby70JPAoWmJU= -github.com/kaptinlin/jsonpointer v0.4.17 h1:mY9k8ciWncxbsECyaxKnR0MdmxamNdp2tLQkAKVrtSk= -github.com/kaptinlin/jsonpointer v0.4.17/go.mod h1:SsfsjqnHG5zuKo1DTBzk1VknaHlL4osHw+X9kZKukpU= -github.com/kaptinlin/jsonschema v0.7.7 h1:41BlQJ9dskH0oE5DSzBUrl/w4JQYIr6N6L0B5GNyDoM= -github.com/kaptinlin/jsonschema v0.7.7/go.mod h1:rKjWfyySHSxAD7Li2ctYkPlOu960igoKBvZ2ADRtd5Q= -github.com/kaptinlin/messageformat-go v0.4.19 h1:A5kuuZ1ybXDQ7kD1aoEWGAOemX7hLsMY0yolgSbgpRI= -github.com/kaptinlin/messageformat-go v0.4.19/go.mod h1:utSDTfiXTxl66OC5RIEuObLH7Ue3YjbA2X86SYMBYWg= +github.com/kaptinlin/go-i18n v0.4.4 h1:3XrUYyLOykcd1K3gm4j7ndrF8YLIYrJjtbKGr/nF2Kw= +github.com/kaptinlin/go-i18n v0.4.4/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= +github.com/kaptinlin/jsonpointer v0.4.19 h1:dEkwEnvn9jJCofrwKGxfKaPNbDOQEf3UEbEumn4xZBg= +github.com/kaptinlin/jsonpointer v0.4.19/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= +github.com/kaptinlin/jsonschema v0.7.11 h1:h63Lb3Q4FBSWeWiAGefNPEVPNsOvgn91ATmf25X0yRs= +github.com/kaptinlin/jsonschema v0.7.11/go.mod h1:cJ8QIhwq3V/Yyh3sXRNt8w3sM943bNIbwnPTpBTXn3s= +github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= +github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -179,8 +179,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= +github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= From b7c17e0732b7ba19940a65ca1e27eabd972afec5 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 27 Apr 2026 10:11:29 -0300 Subject: [PATCH 24/95] ci: fix build running twice on pull requests --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3511f7fe0..5eca2452c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,8 @@ name: build -on: [push, pull_request] +on: + push: + branches: [main] + pull_request: jobs: build: From 1720eac36fae6dc0b95f4a771861ac8f3bb6a7bd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 25 Apr 2026 15:26:00 -0400 Subject: [PATCH 25/95] fix(openrouter): don't clip thinking output on claude models --- providers/openrouter/language_model_hooks.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index d38fb8b17..4ed73c446 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -295,7 +295,8 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa currentState.format = detail.Format ctx[reasoningStartedCtx] = currentState delta := detail.Summary - if strings.HasPrefix(detail.Format, "google-gemini") { + if strings.HasPrefix(detail.Format, "google-gemini") || + strings.HasPrefix(detail.Format, "anthropic-claude") { delta = detail.Text } return ctx, yield(fantasy.StreamPart{ From 5f0d1e33157bd587d6be41cc2e1f3e74daae2f10 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Apr 2026 15:35:42 -0400 Subject: [PATCH 26/95] fix(openrouter): use xstrings helper Co-authored-by: Andrey Nering --- providers/openrouter/language_model_hooks.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index 4ed73c446..c2f3d812f 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -295,8 +295,7 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa currentState.format = detail.Format ctx[reasoningStartedCtx] = currentState delta := detail.Summary - if strings.HasPrefix(detail.Format, "google-gemini") || - strings.HasPrefix(detail.Format, "anthropic-claude") { + if xstrings.ContainsAnyOf(detail.Format, "google-gemini", "anthropic-claude") { delta = detail.Text } return ctx, yield(fantasy.StreamPart{ From d8aafda9de0e199bc1015b53f84b2ee0538d664f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 27 Apr 2026 16:55:42 -0300 Subject: [PATCH 27/95] chore(deps): import strings package --- go.mod | 1 + go.sum | 2 ++ providers/openrouter/language_model_hooks.go | 1 + 3 files changed, 4 insertions(+) diff --git a/go.mod b/go.mod index 35088ca9f..80a100dbc 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 + github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index c4340d732..6173777d7 100644 --- a/go.sum +++ b/go.sum @@ -92,6 +92,8 @@ github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZty github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= +github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= +github.com/charmbracelet/x/exp/strings v0.1.0/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index c2f3d812f..acb518e83 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -13,6 +13,7 @@ import ( "charm.land/fantasy/providers/openai" openaisdk "github.com/charmbracelet/openai-go" "github.com/charmbracelet/openai-go/packages/param" + xstrings "github.com/charmbracelet/x/exp/strings" ) const reasoningStartedCtx = "reasoning_started" From 43a2aa51c05dbe054eaca6f9f7dcc42836f39bed Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 27 Apr 2026 17:00:18 -0300 Subject: [PATCH 28/95] test: re-record test fixtures --- .../anthropic/multi_tool.yaml | 14 +- .../anthropic/multi_tool_streaming.yaml | 80 +-- .../anthropic/simple.yaml | 6 +- .../anthropic/simple_streaming.yaml | 6 +- .../TestOpenRouterCommon/anthropic/tool.yaml | 14 +- .../anthropic/tool_streaming.yaml | 106 ++-- .../gemini/multi_tool.yaml | 16 +- .../gemini/multi_tool_streaming.yaml | 54 +- .../TestOpenRouterCommon/gemini/simple.yaml | 6 +- .../gemini/simple_streaming.yaml | 14 +- .../TestOpenRouterCommon/gemini/tool.yaml | 16 +- .../gemini/tool_streaming.yaml | 52 +- .../TestOpenRouterCommon/glm/multi_tool.yaml | 16 +- .../glm/multi_tool_streaming.yaml | 214 +++++-- .../TestOpenRouterCommon/glm/simple.yaml | 6 +- .../glm/simple_streaming.yaml | 526 ++++++------------ .../TestOpenRouterCommon/glm/tool.yaml | 14 +- .../glm/tool_streaming.yaml | 80 +-- .../TestOpenRouterCommon/grok/multi_tool.yaml | 14 +- .../grok/multi_tool_streaming.yaml | 206 ++++--- .../TestOpenRouterCommon/grok/simple.yaml | 6 +- .../grok/simple_streaming.yaml | 106 +++- .../TestOpenRouterCommon/grok/tool.yaml | 14 +- .../grok/tool_streaming.yaml | 174 ++++-- .../TestOpenRouterCommon/kimi/multi_tool.yaml | 16 +- .../kimi/multi_tool_streaming.yaml | 410 ++++++-------- .../TestOpenRouterCommon/kimi/simple.yaml | 6 +- .../kimi/simple_streaming.yaml | 398 +++---------- .../TestOpenRouterCommon/kimi/tool.yaml | 16 +- .../kimi/tool_streaming.yaml | 298 +++++----- .../openai/multi_tool.yaml | 14 +- .../openai/multi_tool_streaming.yaml | 96 ++-- .../TestOpenRouterCommon/openai/simple.yaml | 6 +- .../openai/simple_streaming.yaml | 6 +- .../TestOpenRouterCommon/openai/tool.yaml | 14 +- .../openai/tool_streaming.yaml | 70 +-- .../anthropic/multi_tool.yaml | 14 +- .../anthropic/multi_tool_streaming.yaml | 76 ++- .../anthropic/simple.yaml | 6 +- .../anthropic/simple_streaming.yaml | 6 +- .../anthropic/tool.yaml | 14 +- .../anthropic/tool_streaming.yaml | 82 +-- .../anthropic/thinking-streaming.yaml | 144 +++-- .../anthropic/thinking.yaml | 18 +- 44 files changed, 1634 insertions(+), 1836 deletions(-) diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool.yaml index 07256ce25..c79748084 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945358-FDlyLIKJQBIXIh4OyuLo\",\"object\":\"chat.completion\",\"created\":1773945358,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01VnB5DUbR2NKeZThzEtpwdb\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"toolu_bdrk_01CDDWHjeHEf3QYvSRaGihKp\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}}]}}],\"usage\":{\"prompt_tokens\":690,\"completion_tokens\":120,\"total_tokens\":810,\"cost\":0.00129,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00129,\"upstream_inference_prompt_cost\":0.00069,\"upstream_inference_completions_cost\":0.0006},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319803-NHzdZlNbAiw0RyFOpWHQ\",\"object\":\"chat.completion\",\"created\":1777319803,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_use\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01RHEwXB8LDU3AqGqvChVLo5\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"toolu_bdrk_01LEnwcrBkCKbn3nFxESSnkp\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}}]}}],\"usage\":{\"prompt_tokens\":690,\"completion_tokens\":120,\"total_tokens\":810,\"cost\":0.00129,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00129,\"upstream_inference_prompt_cost\":0.00069,\"upstream_inference_completions_cost\":0.0006},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 4.230596708s + duration: 1.261214541s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 1311 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01VnB5DUbR2NKeZThzEtpwdb","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01CDDWHjeHEf3QYvSRaGihKp","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01VnB5DUbR2NKeZThzEtpwdb","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01CDDWHjeHEf3QYvSRaGihKp","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01RHEwXB8LDU3AqGqvChVLo5","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01LEnwcrBkCKbn3nFxESSnkp","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01RHEwXB8LDU3AqGqvChVLo5","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01LEnwcrBkCKbn3nFxESSnkp","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945363-bjEDpfY1yMWlhRQEtwaa\",\"object\":\"chat.completion\",\"created\":1773945363,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Perfect! Here are the results:\\n\\n- **Adding** 2 + 3 = **5**\\n- **Multiplying** 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":871,\"completion_tokens\":44,\"total_tokens\":915,\"cost\":0.001091,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001091,\"upstream_inference_prompt_cost\":0.000871,\"upstream_inference_completions_cost\":0.00022},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319804-zPp5vpxR2R6EsHoqrivJ\",\"object\":\"chat.completion\",\"created\":1777319804,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"Perfect! Here are the results:\\n\\n- **Addition**: 2 + 3 = **5**\\n- **Multiplication**: 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":871,\"completion_tokens\":43,\"total_tokens\":914,\"cost\":0.001086,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001086,\"upstream_inference_prompt_cost\":0.000871,\"upstream_inference_completions_cost\":0.000215},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.332091s + duration: 1.010703208s diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool_streaming.yaml index 303f2ddcb..02dc00f83 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,49 +28,35 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01L6Xsux1sqgXSsd2xi64poF","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01XTTFRiRuvcspcpxuMoJ965","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":", \"b\": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"toolu_bdrk_014pCKe2FHbyMZerLY1JxG4a","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":", "}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"toolu_bdrk_01Ao3wLFy6JWPGtWcZ8CvdVo","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":", \"b\": "}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}]} - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"a\": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":", \"b\": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - - data: {"id":"gen-1773945367-w5BMjFUo1VftlXVqvaPn","object":"chat.completion.chunk","created":1773945367,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":685,"completion_tokens":120,"total_tokens":805,"cost":0.001285,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001285,"upstream_inference_prompt_cost":0.000685,"upstream_inference_completions_cost":0.0006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319805-xxNVuABVmXTjx5tL2OBX","object":"chat.completion.chunk","created":1777319805,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}],"usage":{"prompt_tokens":685,"completion_tokens":120,"total_tokens":805,"cost":0.001285,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001285,"upstream_inference_prompt_cost":0.000685,"upstream_inference_completions_cost":0.0006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -79,7 +65,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 3.905948833s + duration: 1.150669416s - id: 1 request: proto: HTTP/1.1 @@ -87,14 +73,14 @@ interactions: proto_minor: 1 content_length: 1348 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01XTTFRiRuvcspcpxuMoJ965","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01Ao3wLFy6JWPGtWcZ8CvdVo","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01XTTFRiRuvcspcpxuMoJ965","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01Ao3wLFy6JWPGtWcZ8CvdVo","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01L6Xsux1sqgXSsd2xi64poF","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_014pCKe2FHbyMZerLY1JxG4a","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01L6Xsux1sqgXSsd2xi64poF","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_014pCKe2FHbyMZerLY1JxG4a","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -105,31 +91,25 @@ interactions: body: |+ : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Perfect","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"! Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Perfect","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" are the results:\n\n- **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"! Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" are the results:\n\n- **Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"**: 2 + 3 ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"**: 2 + 3 ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"= **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"= **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"5**\n- **Multiplication**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"5**\n- **Multiplication**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" 2 × 3 =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" 2 × 3 =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **6**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **6**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}]} - data: {"id":"gen-1773945371-0C2JH3j25iWHzQzrJHm7","object":"chat.completion.chunk","created":1773945371,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":866,"completion_tokens":43,"total_tokens":909,"cost":0.001081,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001081,"upstream_inference_prompt_cost":0.000866,"upstream_inference_completions_cost":0.000215},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319807-l15NLvPD2tAGnf5gizWT","object":"chat.completion.chunk","created":1777319807,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}],"usage":{"prompt_tokens":866,"completion_tokens":43,"total_tokens":909,"cost":0.001081,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001081,"upstream_inference_prompt_cost":0.000866,"upstream_inference_completions_cost":0.000215},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -138,4 +118,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.608417583s + duration: 1.04698475s diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/simple.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/simple.yaml index 759541e67..c71d46fd4 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945333-8woqHhslWkUBof9rDT5h\",\"object\":\"chat.completion\",\"created\":1773945333,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá! \U0001F44B\\n\\n(or \\\"Oi!\\\" for a more casual greeting)\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":24,\"total_tokens\":40,\"cost\":0.000136,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000136,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00012},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319793-KB049hxgeSfDo9BpYCgU\",\"object\":\"chat.completion\",\"created\":1777319793,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá! \U0001F44B\\n\\nHow can I help you today?\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":18,\"total_tokens\":34,\"cost\":0.000106,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000106,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00009},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.234733708s + duration: 2.270285959s diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/simple_streaming.yaml index 930a91517..77b9d668d 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -23,10 +23,10 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Olá! \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F44B\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\\n\\n(\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Or\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \\\"\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Oi!\\\" for\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" a\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" more casual greeting)\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}]}\n\ndata: {\"id\":\"gen-1773945335-6fzOzM22YNaAMMCFoBUI\",\"object\":\"chat.completion.chunk\",\"created\":1773945335,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":24,\"total_tokens\":40,\"cost\":0.000136,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000136,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00012},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: ": OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Olá! \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F44B\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\\n\\nHow\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" can I help you today?\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\"}]}\n\ndata: {\"id\":\"gen-1777319795-6g09PXB65BTBPmL4wfyo\",\"object\":\"chat.completion.chunk\",\"created\":1777319795,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\"}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":18,\"total_tokens\":34,\"cost\":0.000106,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000106,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00009},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 6.406652583s + duration: 975.9435ms diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/tool.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/tool.yaml index 2baf6de70..434d465e7 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945342-jKAAVEw88x4puynntZ3C\",\"object\":\"chat.completion\",\"created\":1773945342,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01HvsWDkYxNAWR5pVHD47MZ7\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":577,\"completion_tokens\":54,\"total_tokens\":631,\"cost\":0.000847,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000847,\"upstream_inference_prompt_cost\":0.000577,\"upstream_inference_completions_cost\":0.00027},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319796-ug8Nx1UYcyazw6kXAE7h\",\"object\":\"chat.completion\",\"created\":1777319796,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_use\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01V4dpjrUNjqou54LTv3DMEt\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":577,\"completion_tokens\":54,\"total_tokens\":631,\"cost\":0.000847,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000847,\"upstream_inference_prompt_cost\":0.000577,\"upstream_inference_completions_cost\":0.00027},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 5.041391041s + duration: 1.869368542s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 758 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01HvsWDkYxNAWR5pVHD47MZ7","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01HvsWDkYxNAWR5pVHD47MZ7","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01V4dpjrUNjqou54LTv3DMEt","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01V4dpjrUNjqou54LTv3DMEt","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945347-FZ9S04kVlZRXgrWCIN1o\",\"object\":\"chat.completion\",\"created\":1773945347,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is **40°C (104°F)**, which is quite hot! This is typical for Florence during the summer months, particularly in July and August when temperatures often reach or exceed 40°C. If you're planning a visit or are currently there, make sure to stay hydrated and use sun protection.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":646,\"completion_tokens\":73,\"total_tokens\":719,\"cost\":0.001011,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001011,\"upstream_inference_prompt_cost\":0.000646,\"upstream_inference_completions_cost\":0.000365},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319798-GgInILJSZMZcdQSYjjo7\",\"object\":\"chat.completion\",\"created\":1777319798,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**, which is quite hot! That's a very warm temperature, so if you're planning to visit or are there now, make sure to stay hydrated and use sun protection. It's typical for Florence to experience high temperatures during the summer months.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":646,\"completion_tokens\":70,\"total_tokens\":716,\"cost\":0.000996,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000996,\"upstream_inference_prompt_cost\":0.000646,\"upstream_inference_completions_cost\":0.00035},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 5.138797333s + duration: 1.310262458s diff --git a/providertests/testdata/TestOpenRouterCommon/anthropic/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/anthropic/tool_streaming.yaml index 6bd69861a..250c7cfe5 100644 --- a/providertests/testdata/TestOpenRouterCommon/anthropic/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/anthropic/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,27 +28,23 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01RiGtttFSGiqX2bR4Uoz434","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01Q8hMVuCxjhyQ5fPFaK2LHt","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"lo"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"cation\": \"F"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"location\":"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"lorence"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \"Florence,"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":", Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}]} - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - - data: {"id":"gen-1773945354-XxuArfRtL105GrGucMsX","object":"chat.completion.chunk","created":1773945354,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":577,"completion_tokens":54,"total_tokens":631,"cost":0.000847,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000847,"upstream_inference_prompt_cost":0.000577,"upstream_inference_completions_cost":0.00027},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319799-zuunrpiKsDif28jflHYf","object":"chat.completion.chunk","created":1777319799,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}],"usage":{"prompt_tokens":577,"completion_tokens":54,"total_tokens":631,"cost":0.000847,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000847,"upstream_inference_prompt_cost":0.000577,"upstream_inference_completions_cost":0.00027},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -57,7 +53,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.738503458s + duration: 1.077700208s - id: 1 request: proto: HTTP/1.1 @@ -65,14 +61,14 @@ interactions: proto_minor: 1 content_length: 812 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01Q8hMVuCxjhyQ5fPFaK2LHt","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01Q8hMVuCxjhyQ5fPFaK2LHt","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01RiGtttFSGiqX2bR4Uoz434","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01RiGtttFSGiqX2bR4Uoz434","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -85,79 +81,57 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The weather in Florence, Italy is currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" \n\nThis","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is typical","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" for Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" during","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" weather in Florence, Italy is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" summer months when","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" temperatures","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" can be","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" quite warm","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which is quite hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" I","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" Make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'d recommend:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sure to stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"\n- Staying","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated and use","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated\n- Wearing light,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sun","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" breathable clothing\n- Using","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" protection if","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sun","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" you're planning to be outdoors.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" protection (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" This","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"sun","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"screen, hat, sunglasses)","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" typical","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"\n- Planning","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" outdoor activities for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" summer","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" early","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" weather for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" morning or late evening","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" during","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" avoid the heat of","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" the war","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" the day","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"mer months.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}]} - data: {"id":"gen-1773945356-69pREjI1t1LIACEkKHdK","object":"chat.completion.chunk","created":1773945356,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":646,"completion_tokens":96,"total_tokens":742,"cost":0.001126,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001126,"upstream_inference_prompt_cost":0.000646,"upstream_inference_completions_cost":0.00048},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319801-7bxTZdZbFxsubjvGQ75n","object":"chat.completion.chunk","created":1777319801,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}],"usage":{"prompt_tokens":646,"completion_tokens":59,"total_tokens":705,"cost":0.000941,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000941,"upstream_inference_prompt_cost":0.000646,"upstream_inference_completions_cost":0.000295},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -166,4 +140,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.818862708s + duration: 1.362970583s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool.yaml index 9c6e7a808..4b8d8d8bc 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945403-sdpFM7Ibw0ydMbFfbFhk\",\"object\":\"chat.completion\",\"created\":1773945403,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"tool_add_67Z4MFOopECpNHW6qvVN\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"tool_multiply_ODGB2Wg7IAvQ59EC0lXF\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"AY89a19euJGckSKHF210qgCYi0Cogu3ONrdlkrEwpq++DXoXjQNMP5N52UMy4CKjXRE=\",\"format\":\"google-gemini-v1\",\"id\":\"tool_add_67Z4MFOopECpNHW6qvVN\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":87,\"completion_tokens\":32,\"total_tokens\":119,\"cost\":0.00006975,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00006975,\"upstream_inference_prompt_cost\":0.00002175,\"upstream_inference_completions_cost\":0.000048},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319828-9g0qMUWH3SuSHwnupAK1\",\"object\":\"chat.completion\",\"created\":1777319828,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google AI Studio\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"tool_add_jKPaCgS4LPe2mBG3Y6FJ\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"tool_multiply_3XqZzHkQQc6CxUmvuVM9\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"EjQKMgEMOdbH2eMj+dYjjdjNbkXXXTIPpUzTOPCC+bZ37nGtyWyE8NoUU8ld/+jywjP4thv2\",\"format\":\"google-gemini-v1\",\"id\":\"tool_add_jKPaCgS4LPe2mBG3Y6FJ\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":161,\"completion_tokens\":32,\"total_tokens\":193,\"cost\":0.00008825,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00008825,\"upstream_inference_prompt_cost\":0.00004025,\"upstream_inference_completions_cost\":0.000048},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.110945792s + duration: 1.047780917s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1507 + content_length: 1511 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"tool_add_67Z4MFOopECpNHW6qvVN","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"tool_multiply_ODGB2Wg7IAvQ59EC0lXF","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"AY89a19euJGckSKHF210qgCYi0Cogu3ONrdlkrEwpq++DXoXjQNMP5N52UMy4CKjXRE=","format":"google-gemini-v1","id":"tool_add_67Z4MFOopECpNHW6qvVN","index":0,"type":"reasoning.encrypted"}]},{"content":"5","tool_call_id":"tool_add_67Z4MFOopECpNHW6qvVN","role":"tool"},{"content":"6","tool_call_id":"tool_multiply_ODGB2Wg7IAvQ59EC0lXF","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"tool_add_jKPaCgS4LPe2mBG3Y6FJ","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"tool_multiply_3XqZzHkQQc6CxUmvuVM9","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"EjQKMgEMOdbH2eMj+dYjjdjNbkXXXTIPpUzTOPCC+bZ37nGtyWyE8NoUU8ld/+jywjP4thv2","format":"google-gemini-v1","id":"tool_add_jKPaCgS4LPe2mBG3Y6FJ","index":0,"type":"reasoning.encrypted"}]},{"content":"5","tool_call_id":"tool_add_jKPaCgS4LPe2mBG3Y6FJ","role":"tool"},{"content":"6","tool_call_id":"tool_multiply_3XqZzHkQQc6CxUmvuVM9","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945406-hlTqhqmy3oevZu6kSqJM\",\"object\":\"chat.completion\",\"created\":1773945406,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"The sum of 2 and 3 is 5, and the product of 2 and 3 is 6.\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"AY89a18UGmTcyJ8nYzEK+7YFBG7gkHttSMEFVtoN+qdCBx5uCVaHs0xHLqqpi7pJn/Q=\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":154,\"completion_tokens\":25,\"total_tokens\":179,\"cost\":0.000076,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000076,\"upstream_inference_prompt_cost\":0.0000385,\"upstream_inference_completions_cost\":0.0000375},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319829-6C61iC7kOsCAr4kC4FRp\",\"object\":\"chat.completion\",\"created\":1777319829,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google AI Studio\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"The sum of 2 and 3 is 5, and the product of 2 and 3 is 6.\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"EjQKMgEMOdbH6gxsIYFsLmcH6Cy95wupnskztNqfRhoa2P6HoxDNlUREApKCSyP4Pu6+jo8c\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":252,\"completion_tokens\":25,\"total_tokens\":277,\"cost\":0.0001005,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0001005,\"upstream_inference_prompt_cost\":0.000063,\"upstream_inference_completions_cost\":0.0000375},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.028248792s + duration: 1.752077584s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool_streaming.yaml index ccc94db82..a01fc2a62 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -30,27 +30,19 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"AY89a1+4ldhGjiNn8S1VuGpFQrS57EYj823FwVVWyxvAG0cE5Qi8Mh3qDl5zaYStVes=","format":"google-gemini-v1","id":"tool_add_sYdHLQ7pM4TsXu9boNT5","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgEMOdbHkJxR6ymAEgQGz1qCdA0vBnhty0KPBjiAVrJ/Hf5kChgp6eGY0f0J+HoLlFtA","format":"google-gemini-v1","id":"tool_add_kZJN6iFNozVOBiXBMA2Y","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"tool_add_sYdHLQ7pM4TsXu9boNT5","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"tool_add_kZJN6iFNozVOBiXBMA2Y","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"b\":3,\"a\":2}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"tool_multiply_M7nCvf8jvQADIkrw5YKS","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"tool_multiply_7Pq02EcannPbKks8kXlA","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"STOP"}]} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"STOP"}]} - data: {"id":"gen-1773945409-GKBLGdVdfDpywrF53THX","object":"chat.completion.chunk","created":1773945409,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":83,"completion_tokens":32,"total_tokens":115,"cost":0.00006875,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00006875,"upstream_inference_prompt_cost":0.00002075,"upstream_inference_completions_cost":0.000048},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319831-ISVqphVuTMGtXkERk9Xn","object":"chat.completion.chunk","created":1777319831,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":157,"completion_tokens":32,"total_tokens":189,"cost":0.00008725,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00008725,"upstream_inference_prompt_cost":0.00003925,"upstream_inference_completions_cost":0.000048},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -59,22 +51,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 3.101256s + duration: 1.834634917s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1544 + content_length: 1548 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"tool_add_sYdHLQ7pM4TsXu9boNT5","function":{"arguments":"{\"b\":3,\"a\":2}","name":"add"},"type":"function"},{"id":"tool_multiply_M7nCvf8jvQADIkrw5YKS","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"AY89a1+4ldhGjiNn8S1VuGpFQrS57EYj823FwVVWyxvAG0cE5Qi8Mh3qDl5zaYStVes=","format":"google-gemini-v1","id":"tool_add_sYdHLQ7pM4TsXu9boNT5","index":0,"type":"reasoning.encrypted"}]},{"content":"5","tool_call_id":"tool_add_sYdHLQ7pM4TsXu9boNT5","role":"tool"},{"content":"6","tool_call_id":"tool_multiply_M7nCvf8jvQADIkrw5YKS","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"tool_add_kZJN6iFNozVOBiXBMA2Y","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"tool_multiply_7Pq02EcannPbKks8kXlA","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"EjQKMgEMOdbHkJxR6ymAEgQGz1qCdA0vBnhty0KPBjiAVrJ/Hf5kChgp6eGY0f0J+HoLlFtA","format":"google-gemini-v1","id":"tool_add_kZJN6iFNozVOBiXBMA2Y","index":0,"type":"reasoning.encrypted"}]},{"content":"5","tool_call_id":"tool_add_kZJN6iFNozVOBiXBMA2Y","role":"tool"},{"content":"6","tool_call_id":"tool_multiply_7Pq02EcannPbKks8kXlA","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -91,25 +83,15 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"The sum","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":" of 2 and ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"3 is 5, and the product of 2 and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319833-jB4BU87kBaOluZRvZKV0","object":"chat.completion.chunk","created":1777319833,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"The result of adding 2 and 3 is 5, and the result of","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":" 3 is 6.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319833-jB4BU87kBaOluZRvZKV0","object":"chat.completion.chunk","created":1777319833,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":" multiplying 2 and 3 is 6.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"AY89a18Arm6uvbtwsskpVED8BnueFZjjOLD5zxfz/ALu6B8EI7sgVUR6svb/kSSFRmM=","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319833-jB4BU87kBaOluZRvZKV0","object":"chat.completion.chunk","created":1777319833,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgEMOdbHWldpUxTsd0Brk0yjwpnFnPDRapRvW3qAoQvzR8EwucYBbW85Tqib6JYSYIrC","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} + data: {"id":"gen-1777319833-jB4BU87kBaOluZRvZKV0","object":"chat.completion.chunk","created":1777319833,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} - data: {"id":"gen-1773945413-SErDL8acdBEMsr0VlQOj","object":"chat.completion.chunk","created":1773945413,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":150,"completion_tokens":25,"total_tokens":175,"cost":0.000075,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000075,"upstream_inference_prompt_cost":0.0000375,"upstream_inference_completions_cost":0.0000375},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319833-jB4BU87kBaOluZRvZKV0","object":"chat.completion.chunk","created":1777319833,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":247,"completion_tokens":27,"total_tokens":274,"cost":0.00010225,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00010225,"upstream_inference_prompt_cost":0.00006175,"upstream_inference_completions_cost":0.0000405},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -118,4 +100,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 3.220695416s + duration: 1.98577275s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/simple.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/simple.yaml index 6688a02ed..31e392276 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945384-xZPhbwajwzm3GL9jqUHp\",\"object\":\"chat.completion\",\"created\":1773945384,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá!\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"AY89a1/3xY1TdwDH5U/lq5Eban8Wxxd1lYhLpbwogJiu9r0BguV+vY5JOgnVjONbeJE=\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":9,\"completion_tokens\":2,\"total_tokens\":11,\"cost\":0.00000525,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00000525,\"upstream_inference_prompt_cost\":0.00000225,\"upstream_inference_completions_cost\":0.000003},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319821-Rs3LnY0tk8uQkwydvIpx\",\"object\":\"chat.completion\",\"created\":1777319821,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google AI Studio\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá!\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"EjQKMgEMOdbHfCQYjMcrbeEQk42SyLQrwPUc7Bqv3edwK1p6JPUYARKyLQdJVdTOCPNF353A\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":11,\"completion_tokens\":2,\"total_tokens\":13,\"cost\":0.00000575,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00000575,\"upstream_inference_prompt_cost\":0.00000275,\"upstream_inference_completions_cost\":0.000003},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.984944208s + duration: 1.853157208s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/simple_streaming.yaml index 0194693c3..cd536958d 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -26,15 +26,13 @@ interactions: body: |+ : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945388-ScQOcjqnnQqDR2tkBCM6","object":"chat.completion.chunk","created":1773945388,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"Olá!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319823-gzdkDdqHdFpE5HXAnyM1","object":"chat.completion.chunk","created":1777319823,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"Olá!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945388-ScQOcjqnnQqDR2tkBCM6","object":"chat.completion.chunk","created":1773945388,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgG+Pvb72piB9g0HqzVyYjGL9Be9fvg3tyhef4/NDaxTjBDkMJi5K7zGEDVk+5oNajHu","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319823-gzdkDdqHdFpE5HXAnyM1","object":"chat.completion.chunk","created":1777319823,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgEMOdbHXreb2yyL+Eb375b3WnY2QC8b/iokMKA4F2OW0AAOJ5YTRQWyirwZaaPtw3oo","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945388-ScQOcjqnnQqDR2tkBCM6","object":"chat.completion.chunk","created":1773945388,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} + data: {"id":"gen-1777319823-gzdkDdqHdFpE5HXAnyM1","object":"chat.completion.chunk","created":1777319823,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} - data: {"id":"gen-1773945388-ScQOcjqnnQqDR2tkBCM6","object":"chat.completion.chunk","created":1773945388,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":11,"completion_tokens":2,"total_tokens":13,"cost":0.00000575,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00000575,"upstream_inference_prompt_cost":0.00000275,"upstream_inference_completions_cost":0.000003},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319823-gzdkDdqHdFpE5HXAnyM1","object":"chat.completion.chunk","created":1777319823,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":11,"completion_tokens":2,"total_tokens":13,"cost":0.00000575,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00000575,"upstream_inference_prompt_cost":0.00000275,"upstream_inference_completions_cost":0.000003},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -43,4 +41,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.240184834s + duration: 1.008848875s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/tool.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/tool.yaml index f1f6915ff..a7eb9bbce 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945390-pdnIFKfKJyD9oVzWL9Dr\",\"object\":\"chat.completion\",\"created\":1773945390,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"tool_weather_aaDFcPO0qsPIvlIQKSFc\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"AY89a19LCy6WJJsnCldFSEDCKuOZfohIqqdmMNnccTB8AkfBDwEgvVMlFkc1dI+gcwc=\",\"format\":\"google-gemini-v1\",\"id\":\"tool_weather_aaDFcPO0qsPIvlIQKSFc\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":39,\"completion_tokens\":16,\"total_tokens\":55,\"cost\":0.00003375,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00003375,\"upstream_inference_prompt_cost\":0.00000975,\"upstream_inference_completions_cost\":0.000024},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319824-KOH28JAZ2DqdrJP5Yjw6\",\"object\":\"chat.completion\",\"created\":1777319824,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google AI Studio\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"tool_weather_fRoXur7LpnOd7IAx6Tad\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"EjQKMgEMOdbHKmMgPVzgFG7vQjEG7JO2h9/CIpCXGYPI5x79sg3joR18hmG49wMW6ByWhpHf\",\"format\":\"google-gemini-v1\",\"id\":\"tool_weather_fRoXur7LpnOd7IAx6Tad\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":65,\"completion_tokens\":16,\"total_tokens\":81,\"cost\":0.00004025,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00004025,\"upstream_inference_prompt_cost\":0.00001625,\"upstream_inference_completions_cost\":0.000024},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.10832375s + duration: 1.168693375s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 973 + content_length: 977 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"tool_weather_aaDFcPO0qsPIvlIQKSFc","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"AY89a19LCy6WJJsnCldFSEDCKuOZfohIqqdmMNnccTB8AkfBDwEgvVMlFkc1dI+gcwc=","format":"google-gemini-v1","id":"tool_weather_aaDFcPO0qsPIvlIQKSFc","index":0,"type":"reasoning.encrypted"}]},{"content":"40 C","tool_call_id":"tool_weather_aaDFcPO0qsPIvlIQKSFc","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"tool_weather_fRoXur7LpnOd7IAx6Tad","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"EjQKMgEMOdbHKmMgPVzgFG7vQjEG7JO2h9/CIpCXGYPI5x79sg3joR18hmG49wMW6ByWhpHf","format":"google-gemini-v1","id":"tool_weather_fRoXur7LpnOd7IAx6Tad","index":0,"type":"reasoning.encrypted"}]},{"content":"40 C","tool_call_id":"tool_weather_fRoXur7LpnOd7IAx6Tad","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945393-8ddmcZp5L5LzqkHANLRo\",\"object\":\"chat.completion\",\"created\":1773945393,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"The current weather in Florence, Italy, is around 40°C.\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"AY89a1/ZVNqyUobkDK7efg2HaVbYd8w3q44BTWNmfAc08dK+yGFMHu2LZzjed8s0HcE=\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":71,\"completion_tokens\":16,\"total_tokens\":87,\"cost\":0.00004175,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00004175,\"upstream_inference_prompt_cost\":0.00001775,\"upstream_inference_completions_cost\":0.000024},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319825-7KnBhYtSorOqGuuQyGaP\",\"object\":\"chat.completion\",\"created\":1777319825,\"model\":\"google/gemini-3.1-flash-lite-preview-20260303\",\"provider\":\"Google AI Studio\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"STOP\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy, is currently 40°C.\",\"refusal\":null,\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"EjQKMgEMOdbHCqdm8WGCqWdfkg1Oees7fZ8M+W36xK9bAnB8BU5E0tmrwmuKWJOyqUgo4j/B\",\"format\":\"google-gemini-v1\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":112,\"completion_tokens\":15,\"total_tokens\":127,\"cost\":0.0000505,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000505,\"upstream_inference_prompt_cost\":0.000028,\"upstream_inference_completions_cost\":0.0000225},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.11676975s + duration: 1.067586125s diff --git a/providertests/testdata/TestOpenRouterCommon/gemini/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/gemini/tool_streaming.yaml index de6b47dd0..8a500a30f 100644 --- a/providertests/testdata/TestOpenRouterCommon/gemini/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/gemini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,23 +28,15 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319826-N0ngyT6DvdOcsIp1uOkF","object":"chat.completion.chunk","created":1777319826,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgEMOdbHA6W7+LCdrmzmriRlesl2Lp+9caTqsf55osFVUk/b525SSde4BBihgx7+c7aR","format":"google-gemini-v1","id":"tool_weather_nNBvDVuJXrZZDwEjuOoj","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945397-vXwGi8oe2Pu1tPhWFBqG","object":"chat.completion.chunk","created":1773945397,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"AY89a195Y0+HaAqhhzh7Ftn/kaQm1mbI2DIUJEF/ivbMf4Ez5+eK1DaB2LIT89cnq2Q=","format":"google-gemini-v1","id":"tool_weather_JseIOiirEv9DOluhcBh6","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945397-vXwGi8oe2Pu1tPhWFBqG","object":"chat.completion.chunk","created":1773945397,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"tool_weather_JseIOiirEv9DOluhcBh6","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319826-N0ngyT6DvdOcsIp1uOkF","object":"chat.completion.chunk","created":1777319826,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"tool_weather_nNBvDVuJXrZZDwEjuOoj","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945397-vXwGi8oe2Pu1tPhWFBqG","object":"chat.completion.chunk","created":1773945397,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence, Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319826-N0ngyT6DvdOcsIp1uOkF","object":"chat.completion.chunk","created":1777319826,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence, Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945397-vXwGi8oe2Pu1tPhWFBqG","object":"chat.completion.chunk","created":1773945397,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"STOP"}]} + data: {"id":"gen-1777319826-N0ngyT6DvdOcsIp1uOkF","object":"chat.completion.chunk","created":1777319826,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"STOP"}]} - data: {"id":"gen-1773945397-vXwGi8oe2Pu1tPhWFBqG","object":"chat.completion.chunk","created":1773945397,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":39,"completion_tokens":16,"total_tokens":55,"cost":0.00003375,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00003375,"upstream_inference_prompt_cost":0.00000975,"upstream_inference_completions_cost":0.000024},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319826-N0ngyT6DvdOcsIp1uOkF","object":"chat.completion.chunk","created":1777319826,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":65,"completion_tokens":16,"total_tokens":81,"cost":0.00004025,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00004025,"upstream_inference_prompt_cost":0.00001625,"upstream_inference_completions_cost":0.000024},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -53,22 +45,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 2.843115417s + duration: 1.049972542s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1027 + content_length: 1031 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"tool_weather_JseIOiirEv9DOluhcBh6","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"AY89a195Y0+HaAqhhzh7Ftn/kaQm1mbI2DIUJEF/ivbMf4Ez5+eK1DaB2LIT89cnq2Q=","format":"google-gemini-v1","id":"tool_weather_JseIOiirEv9DOluhcBh6","index":0,"type":"reasoning.encrypted"}]},{"content":"40 C","tool_call_id":"tool_weather_JseIOiirEv9DOluhcBh6","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"tool_weather_nNBvDVuJXrZZDwEjuOoj","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"data":"EjQKMgEMOdbHA6W7+LCdrmzmriRlesl2Lp+9caTqsf55osFVUk/b525SSde4BBihgx7+c7aR","format":"google-gemini-v1","id":"tool_weather_nNBvDVuJXrZZDwEjuOoj","index":0,"type":"reasoning.encrypted"}]},{"content":"40 C","tool_call_id":"tool_weather_nNBvDVuJXrZZDwEjuOoj","role":"tool"}],"model":"google/gemini-3.1-flash-lite-preview","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -81,27 +73,15 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"The weather","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":" in Florence, Italy,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319827-meSdX5OyPlU4fEC0Z3R0","object":"chat.completion.chunk","created":1777319827,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"The current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":" is currently 40°C.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319827-meSdX5OyPlU4fEC0Z3R0","object":"chat.completion.chunk","created":1777319827,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":" weather in Florence, Italy, is 40°C.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"AY89a1+Ka9JkxfFogywc5shcRjkm5KIsFHylQ4DTSKSfz0vlhpZvMbmuDXajnxlKJLI=","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319827-meSdX5OyPlU4fEC0Z3R0","object":"chat.completion.chunk","created":1777319827,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"EjQKMgEMOdbH+nAtRDsVQd6zcJuL95H+/1zmXScWtBopH6NoMmBYi1YeNSK8Y3S14XDeuRnn","format":"google-gemini-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} + data: {"id":"gen-1777319827-meSdX5OyPlU4fEC0Z3R0","object":"chat.completion.chunk","created":1777319827,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"STOP"}]} - data: {"id":"gen-1773945399-8bWyDDLWhPyFSaQlOcd9","object":"chat.completion.chunk","created":1773945399,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":73,"completion_tokens":15,"total_tokens":88,"cost":0.00004075,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00004075,"upstream_inference_prompt_cost":0.00001825,"upstream_inference_completions_cost":0.0000225},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319827-meSdX5OyPlU4fEC0Z3R0","object":"chat.completion.chunk","created":1777319827,"model":"google/gemini-3.1-flash-lite-preview-20260303","provider":"Google AI Studio","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"STOP"}],"usage":{"prompt_tokens":111,"completion_tokens":15,"total_tokens":126,"cost":0.00005025,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00005025,"upstream_inference_prompt_cost":0.00002775,"upstream_inference_completions_cost":0.0000225},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -110,4 +90,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 3.191008375s + duration: 1.028212167s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/glm/multi_tool.yaml index de820af91..66683414a 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945454-bGfSsPA1tWkfUqy0muzm\",\"object\":\"chat.completion\",\"created\":1773945454,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":\"Sure! Let me add and multiply 2 and 3 for you at the same time.\",\"refusal\":null,\"reasoning\":\"The user wants me to both add and multiply 2 and 3. I'll make both calls simultaneously.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_869844dd6bf44785b9ee4334\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_d6f1cb4244c94fb88e91ae4f\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants me to both add and multiply 2 and 3. I'll make both calls simultaneously.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":279,\"completion_tokens\":73,\"total_tokens\":352,\"cost\":0.000469184,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":42,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00058648,\"upstream_inference_prompt_cost\":0.00029448,\"upstream_inference_completions_cost\":0.000292},\"completion_tokens_details\":{\"reasoning_tokens\":22,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319879-LkXbODETrxFXiOGt39MJ\",\"object\":\"chat.completion\",\"created\":1777319879,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":\"I'll add and multiply 2 and 3 for you right away!\",\"refusal\":null,\"reasoning\":\"The user wants me to add and multiply 2 and 3. I should call both functions simultaneously since they are independent.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_642d5cfe1d9844a1a65ee8d4\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_f8884ee2898d441a8108b806\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants me to add and multiply 2 and 3. I should call both functions simultaneously since they are independent.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":279,\"completion_tokens\":72,\"total_tokens\":351,\"cost\":0.0006228,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0006228,\"upstream_inference_prompt_cost\":0.0003348,\"upstream_inference_completions_cost\":0.000288},\"completion_tokens_details\":{\"reasoning_tokens\":25,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.925086125s + duration: 1.360928833s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1522 + content_length: 1538 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"Sure! Let me add and multiply 2 and 3 for you at the same time.","tool_calls":[{"id":"call_869844dd6bf44785b9ee4334","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_d6f1cb4244c94fb88e91ae4f","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user wants me to both add and multiply 2 and 3. I''ll make both calls simultaneously.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_869844dd6bf44785b9ee4334","role":"tool"},{"content":"6","tool_call_id":"call_d6f1cb4244c94fb88e91ae4f","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"I''ll add and multiply 2 and 3 for you right away!","tool_calls":[{"id":"call_642d5cfe1d9844a1a65ee8d4","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_f8884ee2898d441a8108b806","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user wants me to add and multiply 2 and 3. I should call both functions simultaneously since they are independent.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_642d5cfe1d9844a1a65ee8d4","role":"tool"},{"content":"6","tool_call_id":"call_f8884ee2898d441a8108b806","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945457-O2s9toIHS9WW6qPT3Mjj\",\"object\":\"chat.completion\",\"created\":1773945457,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Here are the results:\\n\\n- **Addition:** 2 + 3 = **5**\\n- **Multiplication:** 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":\"The results are:\\n- Addition: 2 + 3 = 5\\n- Multiplication: 2 × 3 = 6\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The results are:\\n- Addition: 2 + 3 = 5\\n- Multiplication: 2 × 3 = 6\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":360,\"completion_tokens\":63,\"total_tokens\":423,\"cost\":0.000333696,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":278,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00041712,\"upstream_inference_prompt_cost\":0.00016512,\"upstream_inference_completions_cost\":0.000252},\"completion_tokens_details\":{\"reasoning_tokens\":28,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319880-NkLbwNiKegVJp1qVP5bt\",\"object\":\"chat.completion\",\"created\":1777319880,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Here are the results:\\n\\n- **Addition (2 + 3):** 5\\n- **Multiplication (2 × 3):** 6\",\"refusal\":null,\"reasoning\":\"Got the results. Addition: 5, Multiplication: 6. Let me present these clearly.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"Got the results. Addition: 5, Multiplication: 6. Let me present these clearly.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":359,\"completion_tokens\":55,\"total_tokens\":414,\"cost\":0.00040504,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":256,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00040504,\"upstream_inference_prompt_cost\":0.00018504,\"upstream_inference_completions_cost\":0.00022},\"completion_tokens_details\":{\"reasoning_tokens\":21,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.125586208s + duration: 1.401688041s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/glm/multi_tool_streaming.yaml index bc8ed94d7..7f3d205c7 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -30,107 +30,105 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" These","reasoning_details":[{"type":"reasoning.text","text":" These","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" two","reasoning_details":[{"type":"reasoning.text","text":" two","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" operations","reasoning_details":[{"type":"reasoning.text","text":" operations","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'ll","reasoning_details":[{"type":"reasoning.text","text":"'ll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" independent","reasoning_details":[{"type":"reasoning.text","text":" independent","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" make","reasoning_details":[{"type":"reasoning.text","text":" make","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" so","reasoning_details":[{"type":"reasoning.text","text":" so","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" calls","reasoning_details":[{"type":"reasoning.text","text":" calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" simultaneously","reasoning_details":[{"type":"reasoning.text","text":" simultaneously","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" can","reasoning_details":[{"type":"reasoning.text","text":" can","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" since","reasoning_details":[{"type":"reasoning.text","text":" since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" make","reasoning_details":[{"type":"reasoning.text","text":" make","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" they","reasoning_details":[{"type":"reasoning.text","text":" they","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" calls","reasoning_details":[{"type":"reasoning.text","text":" calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" independent","reasoning_details":[{"type":"reasoning.text","text":" independent","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" simultaneously","reasoning_details":[{"type":"reasoning.text","text":" simultaneously","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Sure","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Sure","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" I","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" Let","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"'ll","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" me","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" add","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" add","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" multiply","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" multiply","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" you","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" you","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" right","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" right","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" away","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" away","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_01a3b98ceccc42ff83f9cebd","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_4024c8ddae6a485b91233297","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_0be384879b524949a5cc4d74","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_4a36f30b6fd64c6d8e320712","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - data: {"id":"gen-1773945458-TlowJFBb4TJf4kpdDX08","object":"chat.completion.chunk","created":1773945458,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":275,"completion_tokens":73,"total_tokens":348,"cost":0.0003056,"is_byok":false,"prompt_tokens_details":{"cached_tokens":250,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000382,"upstream_inference_prompt_cost":0.00009,"upstream_inference_completions_cost":0.000292},"completion_tokens_details":{"reasoning_tokens":24,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319882-wHdEm7r8yf7gRyPRhoJy","object":"chat.completion.chunk","created":1777319882,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":275,"completion_tokens":76,"total_tokens":351,"cost":0.00044968,"is_byok":false,"prompt_tokens_details":{"cached_tokens":192,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00044968,"upstream_inference_prompt_cost":0.00014568,"upstream_inference_completions_cost":0.000304},"completion_tokens_details":{"reasoning_tokens":27,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -139,22 +137,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 3.125579583s + duration: 1.471741125s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1567 + content_length: 1584 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"Sure! I''ll add and multiply 2 and 3 for you right away.","tool_calls":[{"id":"call_01a3b98ceccc42ff83f9cebd","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_0be384879b524949a5cc4d74","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants to add and multiply 2 and 3. I''ll make both calls simultaneously since they are independent.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_01a3b98ceccc42ff83f9cebd","role":"tool"},{"content":"6","tool_call_id":"call_0be384879b524949a5cc4d74","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"Sure! Let me add and multiply 2 and 3 for you right away.","tool_calls":[{"id":"call_4024c8ddae6a485b91233297","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_4a36f30b6fd64c6d8e320712","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants to add and multiply 2 and 3. These two operations are independent, so I can make both calls simultaneously.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_4024c8ddae6a485b91233297","role":"tool"},{"content":"6","tool_call_id":"call_4a36f30b6fd64c6d8e320712","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -162,10 +160,108 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"Both\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"Both\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" results\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" results\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" are\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" are\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" back\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" back\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" Let\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" Let\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" me\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" me\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" present\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" present\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" them\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" them\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" clearly\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" clearly\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Here\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" are\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" the\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" results\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\":\\n\\n\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"-\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Add\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"ition\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\":**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"2\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" +\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"3\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" =\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"5\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\\n\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"-\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Multip\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"lication\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\":**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"2\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" ×\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"3\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" =\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"6\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\\n\\n\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Let\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" me\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" know\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" if\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" you\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" need\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" anything\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" else\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F60A\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":null},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}]}\n\ndata: {\"id\":\"gen-1773945462-2exYsbLv51W0ljqdQ8g9\",\"object\":\"chat.completion.chunk\",\"created\":1773945462,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":355,\"completion_tokens\":57,\"total_tokens\":412,\"cost\":0.000312768,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":274,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00039096,\"upstream_inference_prompt_cost\":0.00016296,\"upstream_inference_completions_cost\":0.000228},\"completion_tokens_details\":{\"reasoning_tokens\":11,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: |+ + : OPENROUTER PROCESSING + + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Both","reasoning_details":[{"type":"reasoning.text","text":"Both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" results","reasoning_details":[{"type":"reasoning.text","text":" results","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" present","reasoning_details":[{"type":"reasoning.text","text":" present","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" them","reasoning_details":[{"type":"reasoning.text","text":" them","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" clearly","reasoning_details":[{"type":"reasoning.text","text":" clearly","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" are","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" results","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":":\n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Add","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"ition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":":**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"**\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Multip","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"lication","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":":**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ×","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} + + data: {"id":"gen-1777319884-HRnE6d4mVJBv4jGbslpX","object":"chat.completion.chunk","created":1777319884,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":358,"completion_tokens":46,"total_tokens":404,"cost":0.00036784,"is_byok":false,"prompt_tokens_details":{"cached_tokens":256,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00036784,"upstream_inference_prompt_cost":0.00018384,"upstream_inference_completions_cost":0.000184},"completion_tokens_details":{"reasoning_tokens":11,"image_tokens":0,"audio_tokens":0}}} + + data: [DONE] + headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 1.430991958s + duration: 1.559835042s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/simple.yaml b/providertests/testdata/TestOpenRouterCommon/glm/simple.yaml index b8d89f626..bbc86737a 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945441-rmYxEaMamyQYZcvTx0FA\",\"object\":\"chat.completion\",\"created\":1773945441,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Oi!\",\"refusal\":null,\"reasoning\":\"1. **Identify the language**: Portuguese.\\n2. **Identify the intent**: Say \\\"hi\\\".\\n3. **Translate \\\"hi\\\" to Portuguese**: \\\"Oi\\\" is the most common and direct translation for \\\"hi\\\". \\\"Olá\\\" is also very common and translates to \\\"hello\\\".\\n4. **Select the best option**: \\\"Oi\\\" fits the casualness of \\\"hi\\\" perfectly.\\n5. **Output the result**: Oi!\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"1. **Identify the language**: Portuguese.\\n2. **Identify the intent**: Say \\\"hi\\\".\\n3. **Translate \\\"hi\\\" to Portuguese**: \\\"Oi\\\" is the most common and direct translation for \\\"hi\\\". \\\"Olá\\\" is also very common and translates to \\\"hello\\\".\\n4. **Select the best option**: \\\"Oi\\\" fits the casualness of \\\"hi\\\" perfectly.\\n5. **Output the result**: Oi!\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":15,\"completion_tokens\":100,\"total_tokens\":115,\"cost\":0.000331328,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":4,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00041416,\"upstream_inference_prompt_cost\":0.00001416,\"upstream_inference_completions_cost\":0.0004},\"completion_tokens_details\":{\"reasoning_tokens\":96,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319862-YII5e53BQENRdSq34H49\",\"object\":\"chat.completion\",\"created\":1777319862,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá!\",\"refusal\":null,\"reasoning\":\"1. **Identify the core request:** The user wants me to say \\\"hi\\\" in Portuguese.\\n2. **Determine the correct translation:** \\\"Hi\\\" translates to \\\"Olá\\\" in Portuguese. Other common informal variants include \\\"Oi\\\" or \\\"E aí\\\" (depending on the region, like Brazil vs. Portugal), but \\\"Olá\\\" is the most universal and standard.\\n3. **Formulate the response:** Just give the direct translation, maybe with a slight friendly context, but keep it simple and direct as requested. \\\"Olá!\\\" is perfect.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"1. **Identify the core request:** The user wants me to say \\\"hi\\\" in Portuguese.\\n2. **Determine the correct translation:** \\\"Hi\\\" translates to \\\"Olá\\\" in Portuguese. Other common informal variants include \\\"Oi\\\" or \\\"E aí\\\" (depending on the region, like Brazil vs. Portugal), but \\\"Olá\\\" is the most universal and standard.\\n3. **Formulate the response:** Just give the direct translation, maybe with a slight friendly context, but keep it simple and direct as requested. \\\"Olá!\\\" is perfect.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":15,\"completion_tokens\":125,\"total_tokens\":140,\"cost\":0.000518,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000518,\"upstream_inference_prompt_cost\":0.000018,\"upstream_inference_completions_cost\":0.0005},\"completion_tokens_details\":{\"reasoning_tokens\":120,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.758985083s + duration: 4.035682708s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/glm/simple_streaming.yaml index b96492b5e..b4b96f536 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,529 +28,363 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"1","reasoning_details":[{"type":"reasoning.text","text":"1","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"An","reasoning_details":[{"type":"reasoning.text","text":"An","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"alyze","reasoning_details":[{"type":"reasoning.text","text":"alyze","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Request","reasoning_details":[{"type":"reasoning.text","text":" Request","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"1","reasoning_details":[{"type":"reasoning.text","text":"1","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Task","reasoning_details":[{"type":"reasoning.text","text":" Task","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ident","reasoning_details":[{"type":"reasoning.text","text":"Ident","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Say","reasoning_details":[{"type":"reasoning.text","text":" Say","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ify","reasoning_details":[{"type":"reasoning.text","text":"ify","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'s","reasoning_details":[{"type":"reasoning.text","text":"'s","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" request","reasoning_details":[{"type":"reasoning.text","text":" request","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"g","reasoning_details":[{"type":"reasoning.text","text":"g","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":**","reasoning_details":[{"type":"reasoning.text","text":":**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"reet","reasoning_details":[{"type":"reasoning.text","text":"reet","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":").\n","reasoning_details":[{"type":"reasoning.text","text":").\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" say","reasoning_details":[{"type":"reasoning.text","text":" say","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Language","reasoning_details":[{"type":"reasoning.text","text":" Language","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.text","text":".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"D","reasoning_details":[{"type":"reasoning.text","text":"D","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"etermine","reasoning_details":[{"type":"reasoning.text","text":"etermine","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Translate","reasoning_details":[{"type":"reasoning.text","text":"Translate","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" appropriate","reasoning_details":[{"type":"reasoning.text","text":" appropriate","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translation","reasoning_details":[{"type":"reasoning.text","text":" translation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":**","reasoning_details":[{"type":"reasoning.text","text":":**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most","reasoning_details":[{"type":"reasoning.text","text":" most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Hi","reasoning_details":[{"type":"reasoning.text","text":"Hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translates","reasoning_details":[{"type":"reasoning.text","text":" translates","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" direct","reasoning_details":[{"type":"reasoning.text","text":" direct","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translation","reasoning_details":[{"type":"reasoning.text","text":" translation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.text","text":".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".\n","reasoning_details":[{"type":"reasoning.text","text":"\".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Hello","reasoning_details":[{"type":"reasoning.text","text":"Hello","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translates","reasoning_details":[{"type":"reasoning.text","text":" translates","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Form","reasoning_details":[{"type":"reasoning.text","text":"Form","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ulate","reasoning_details":[{"type":"reasoning.text","text":"ulate","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" response","reasoning_details":[{"type":"reasoning.text","text":" response","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":**","reasoning_details":[{"type":"reasoning.text","text":":**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Provide","reasoning_details":[{"type":"reasoning.text","text":" Provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.text","text":".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translation","reasoning_details":[{"type":"reasoning.text","text":" translation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Both","reasoning_details":[{"type":"reasoning.text","text":" Both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very","reasoning_details":[{"type":"reasoning.text","text":" very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" clearly","reasoning_details":[{"type":"reasoning.text","text":" clearly","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" correct","reasoning_details":[{"type":"reasoning.text","text":" correct","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" slightly","reasoning_details":[{"type":"reasoning.text","text":" slightly","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most","reasoning_details":[{"type":"reasoning.text","text":" most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" more","reasoning_details":[{"type":"reasoning.text","text":" more","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" direct","reasoning_details":[{"type":"reasoning.text","text":" direct","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" standard","reasoning_details":[{"type":"reasoning.text","text":" standard","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" equivalent","reasoning_details":[{"type":"reasoning.text","text":" equivalent","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" of","reasoning_details":[{"type":"reasoning.text","text":" of","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" while","reasoning_details":[{"type":"reasoning.text","text":" while","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" casual","reasoning_details":[{"type":"reasoning.text","text":" casual","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".\n\n","reasoning_details":[{"type":"reasoning.text","text":"\".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very","reasoning_details":[{"type":"reasoning.text","text":" very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" casual","reasoning_details":[{"type":"reasoning.text","text":" casual","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Form","reasoning_details":[{"type":"reasoning.text","text":"Form","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Providing","reasoning_details":[{"type":"reasoning.text","text":" Providing","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ulate","reasoning_details":[{"type":"reasoning.text","text":"ulate","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" response","reasoning_details":[{"type":"reasoning.text","text":" response","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.text","text":" helpful","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.text","text":".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"4","reasoning_details":[{"type":"reasoning.text","text":"4","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Provide","reasoning_details":[{"type":"reasoning.text","text":" Provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Draft","reasoning_details":[{"type":"reasoning.text","text":"Draft","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" direct","reasoning_details":[{"type":"reasoning.text","text":" direct","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" output","reasoning_details":[{"type":"reasoning.text","text":" output","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translation","reasoning_details":[{"type":"reasoning.text","text":" translation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (\"","reasoning_details":[{"type":"reasoning.text","text":" (\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\").\n","reasoning_details":[{"type":"reasoning.text","text":"\").\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"\n","reasoning_details":[{"type":"reasoning.text","text":"!\"\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Optional","reasoning_details":[{"type":"reasoning.text","text":"Optional","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" but","reasoning_details":[{"type":"reasoning.text","text":" but","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.text","text":" helpful","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":")","reasoning_details":[{"type":"reasoning.text","text":")","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Add","reasoning_details":[{"type":"reasoning.text","text":" Add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Add","reasoning_details":[{"type":"reasoning.text","text":" Add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" brief","reasoning_details":[{"type":"reasoning.text","text":" brief","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" brief","reasoning_details":[{"type":"reasoning.text","text":" brief","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" explanation","reasoning_details":[{"type":"reasoning.text","text":" explanation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" polite","reasoning_details":[{"type":"reasoning.text","text":" polite","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" explanation","reasoning_details":[{"type":"reasoning.text","text":" explanation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" alternative","reasoning_details":[{"type":"reasoning.text","text":" alternative","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" if","reasoning_details":[{"type":"reasoning.text","text":" if","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" necessary","reasoning_details":[{"type":"reasoning.text","text":" necessary","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" be","reasoning_details":[{"type":"reasoning.text","text":" be","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" extra","reasoning_details":[{"type":"reasoning.text","text":" extra","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" but","reasoning_details":[{"type":"reasoning.text","text":" but","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" polite","reasoning_details":[{"type":"reasoning.text","text":" polite","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" keep","reasoning_details":[{"type":"reasoning.text","text":" keep","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"/help","reasoning_details":[{"type":"reasoning.text","text":"/help","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" it","reasoning_details":[{"type":"reasoning.text","text":" it","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ful","reasoning_details":[{"type":"reasoning.text","text":"ful","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" simple","reasoning_details":[{"type":"reasoning.text","text":" simple","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"4","reasoning_details":[{"type":"reasoning.text","text":"4","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" requested","reasoning_details":[{"type":"reasoning.text","text":" requested","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'s","reasoning_details":[{"type":"reasoning.text","text":"'s","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Draft","reasoning_details":[{"type":"reasoning.text","text":"Draft","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" just","reasoning_details":[{"type":"reasoning.text","text":" just","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ing","reasoning_details":[{"type":"reasoning.text","text":"ing","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" give","reasoning_details":[{"type":"reasoning.text","text":" give","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" response","reasoning_details":[{"type":"reasoning.text","text":" response","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" direct","reasoning_details":[{"type":"reasoning.text","text":" direct","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Simple","reasoning_details":[{"type":"reasoning.text","text":"Simple","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - : OPENROUTER PROCESSING + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" translations","reasoning_details":[{"type":"reasoning.text","text":" translations","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"st","reasoning_details":[{"type":"reasoning.text","text":"st","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most","reasoning_details":[{"type":"reasoning.text","text":" most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" accurate","reasoning_details":[{"type":"reasoning.text","text":" accurate","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\")\n","reasoning_details":[{"type":"reasoning.text","text":"\")\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Also","reasoning_details":[{"type":"reasoning.text","text":"Also","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very","reasoning_details":[{"type":"reasoning.text","text":" very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" good","reasoning_details":[{"type":"reasoning.text","text":" good","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":")\n\n","reasoning_details":[{"type":"reasoning.text","text":")\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"5","reasoning_details":[{"type":"reasoning.text","text":"5","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Final","reasoning_details":[{"type":"reasoning.text","text":"Final","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Selection","reasoning_details":[{"type":"reasoning.text","text":" Selection","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":**","reasoning_details":[{"type":"reasoning.text","text":":**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Just","reasoning_details":[{"type":"reasoning.text","text":" Just","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" perfect","reasoning_details":[{"type":"reasoning.text","text":" perfect","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'s","reasoning_details":[{"type":"reasoning.text","text":"'s","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" go","reasoning_details":[{"type":"reasoning.text","text":" go","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" it","reasoning_details":[{"type":"reasoning.text","text":" it","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" perfectly","reasoning_details":[{"type":"reasoning.text","text":" perfectly","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" matches","reasoning_details":[{"type":"reasoning.text","text":" matches","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" casual","reasoning_details":[{"type":"reasoning.text","text":" casual","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.text","text":".\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ness","reasoning_details":[{"type":"reasoning.text","text":"ness","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"5","reasoning_details":[{"type":"reasoning.text","text":"5","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" of","reasoning_details":[{"type":"reasoning.text","text":" of","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".","reasoning_details":[{"type":"reasoning.text","text":"\".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Final","reasoning_details":[{"type":"reasoning.text","text":"Final","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Adding","reasoning_details":[{"type":"reasoning.text","text":" Adding","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Polish","reasoning_details":[{"type":"reasoning.text","text":" Polish","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":**","reasoning_details":[{"type":"reasoning.text","text":":**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" an","reasoning_details":[{"type":"reasoning.text","text":" an","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" alternative","reasoning_details":[{"type":"reasoning.text","text":" alternative","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!\"","reasoning_details":[{"type":"reasoning.text","text":"!\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" nice","reasoning_details":[{"type":"reasoning.text","text":" nice","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" touch","reasoning_details":[{"type":"reasoning.text","text":" touch","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"I","reasoning_details":[{"type":"reasoning.text","text":"I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'ll","reasoning_details":[{"type":"reasoning.text","text":"'ll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide","reasoning_details":[{"type":"reasoning.text","text":" provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" *","reasoning_details":[{"type":"reasoning.text","text":" *","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Draft","reasoning_details":[{"type":"reasoning.text","text":"Draft","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":*","reasoning_details":[{"type":"reasoning.text","text":":*","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" completeness","reasoning_details":[{"type":"reasoning.text","text":" completeness","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" O","reasoning_details":[{"type":"reasoning.text","text":" O","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":").","reasoning_details":[{"type":"reasoning.text","text":").","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"i","reasoning_details":[{"type":"reasoning.text","text":"i","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"Ol","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!","reasoning_details":[{"type":"reasoning.text","text":"!","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"á","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"or","reasoning_details":[{"type":"reasoning.text","text":"or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" \n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Ol","reasoning_details":[{"type":"reasoning.text","text":" Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"You","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" can","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!)","reasoning_details":[{"type":"reasoning.text","text":"!)","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" also","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Oi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" say","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" \n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"Oi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"(","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"You","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" can","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" also","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" say","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" a","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"Ol","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" bit","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"á","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" more","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":" casual","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"**)","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":").","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} - data: {"id":"gen-1773945444-6mrpNQeuPMLMds5JilDa","object":"chat.completion.chunk","created":1773945444,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":15,"completion_tokens":255,"total_tokens":270,"cost":0.000820416,"is_byok":false,"prompt_tokens_details":{"cached_tokens":13,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00102552,"upstream_inference_prompt_cost":0.00000552,"upstream_inference_completions_cost":0.00102},"completion_tokens_details":{"reasoning_tokens":240,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319867-vjNGoL6gkUjyx82dUIAe","object":"chat.completion.chunk","created":1777319867,"model":"z-ai/glm-5-turbo-20260315","provider":"AtlasCloud","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":15,"completion_tokens":178,"total_tokens":193,"cost":0.00073,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00073,"upstream_inference_prompt_cost":0.000018,"upstream_inference_completions_cost":0.000712},"completion_tokens_details":{"reasoning_tokens":156,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -559,4 +393,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.771724167s + duration: 1.453667166s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/tool.yaml b/providertests/testdata/TestOpenRouterCommon/glm/tool.yaml index 5490c3dbb..b482a82df 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945449-sZksq50wfVIXe94WMejJ\",\"object\":\"chat.completion\",\"created\":1773945449,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user wants to know the weather in Florence, Italy. Let me call the weather function.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_3f8ba8d964264042b99c0403\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants to know the weather in Florence, Italy. Let me call the weather function.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":173,\"completion_tokens\":33,\"total_tokens\":206,\"cost\":0.000239424,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":42,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00029928,\"upstream_inference_prompt_cost\":0.00016728,\"upstream_inference_completions_cost\":0.000132},\"completion_tokens_details\":{\"reasoning_tokens\":19,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319873-30rXrOPJlENCXF8M63e4\",\"object\":\"chat.completion\",\"created\":1777319873,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user wants to know the weather in Florence, Italy. Let me call the weather function.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_16efee4b104d451da81ac585\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants to know the weather in Florence, Italy. Let me call the weather function.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":173,\"completion_tokens\":33,\"total_tokens\":206,\"cost\":0.0003396,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0003396,\"upstream_inference_prompt_cost\":0.0002076,\"upstream_inference_completions_cost\":0.000132},\"completion_tokens_details\":{\"reasoning_tokens\":19,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.0582665s + duration: 1.106779708s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 910 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_3f8ba8d964264042b99c0403","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user wants to know the weather in Florence, Italy. Let me call the weather function.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_3f8ba8d964264042b99c0403","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_16efee4b104d451da81ac585","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user wants to know the weather in Florence, Italy. Let me call the weather function.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_16efee4b104d451da81ac585","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945451-gwPNpv4Y8nMTdoaUTRjx\",\"object\":\"chat.completion\",\"created\":1773945451,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The current weather in **Florence, Italy** is quite scorching at **40°C (104°F)**! \U0001F321️\\n\\nIt's extremely hot, so if you're planning to be outdoors, be sure to:\\n\\n- \U0001F4A7 Stay hydrated\\n- \U0001F9F4 Wear sunscreen\\n- \U0001F9E2 Wear a hat and light clothing\\n- \U0001F333 Seek shade when possible\\n\\nWould you like to know the weather for any other locations?\",\"refusal\":null,\"reasoning\":\"The weather function returned 40°C for Florence, Italy. That's quite hot! Let me present this to the user.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The weather function returned 40°C for Florence, Italy. That's quite hot! Let me present this to the user.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":212,\"completion_tokens\":119,\"total_tokens\":331,\"cost\":0.000452224,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":172,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00056528,\"upstream_inference_prompt_cost\":0.00008928,\"upstream_inference_completions_cost\":0.000476},\"completion_tokens_details\":{\"reasoning_tokens\":25,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319874-RZYGRfsP45k9FwFfpsgh\",\"object\":\"chat.completion\",\"created\":1777319874,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The current weather in **Florence, Italy** is **40°C (104°F)** — that's extremely hot! ☀️\U0001F525 \\n\\nIf you're planning to head out, make sure to:\\n- Stay hydrated \U0001F4A7\\n- Wear light, breathable clothing\\n- Apply sunscreen\\n- Try to avoid being outdoors during peak afternoon hours\\n\\nIs there anything else you'd like to know?\",\"refusal\":null,\"reasoning\":\"The weather in Florence, Italy is 40°C. That's quite hot! Let me present this to the user in a friendly way.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The weather in Florence, Italy is 40°C. That's quite hot! Let me present this to the user in a friendly way.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":212,\"completion_tokens\":109,\"total_tokens\":321,\"cost\":0.00056752,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":128,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00056752,\"upstream_inference_prompt_cost\":0.00013152,\"upstream_inference_completions_cost\":0.000436},\"completion_tokens_details\":{\"reasoning_tokens\":28,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.225640375s + duration: 1.5811475s diff --git a/providertests/testdata/TestOpenRouterCommon/glm/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/glm/tool_streaming.yaml index 06edc8ebe..94740eb43 100644 --- a/providertests/testdata/TestOpenRouterCommon/glm/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/glm/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,71 +28,51 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" know","reasoning_details":[{"type":"reasoning.text","text":" know","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" know","reasoning_details":[{"type":"reasoning.text","text":" know","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.text","text":" Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.text","text":" Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"'ll","reasoning_details":[{"type":"reasoning.text","text":"'ll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" call","reasoning_details":[{"type":"reasoning.text","text":" call","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" call","reasoning_details":[{"type":"reasoning.text","text":" call","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_9400b8b3405c4d74b5b97e12","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Flo","reasoning_details":[{"type":"reasoning.text","text":"Flo","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence, Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"rence","reasoning_details":[{"type":"reasoning.text","text":"rence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Italy","reasoning_details":[{"type":"reasoning.text","text":"Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" location","reasoning_details":[{"type":"reasoning.text","text":" location","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_4869f96c06ba414abebb0105","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence,Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - - data: {"id":"gen-1773945452-uLccYSGzmmmuJbJ2PehO","object":"chat.completion.chunk","created":1773945452,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":173,"completion_tokens":43,"total_tokens":216,"cost":0.000172352,"is_byok":false,"prompt_tokens_details":{"cached_tokens":171,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00021544,"upstream_inference_prompt_cost":0.00004344,"upstream_inference_completions_cost":0.000172},"completion_tokens_details":{"reasoning_tokens":29,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319876-tCZKcbYZ4llsJFj1L8Ht","object":"chat.completion.chunk","created":1777319876,"model":"z-ai/glm-5-turbo-20260315","provider":"Z.AI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":173,"completion_tokens":33,"total_tokens":206,"cost":0.00021672,"is_byok":false,"prompt_tokens_details":{"cached_tokens":128,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00021672,"upstream_inference_prompt_cost":0.00008472,"upstream_inference_completions_cost":0.000132},"completion_tokens_details":{"reasoning_tokens":19,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -101,22 +81,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 889.738542ms + duration: 1.142806042s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 998 + content_length: 961 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_4869f96c06ba414abebb0105","function":{"arguments":"{\"location\":\"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants to know the weather in Florence, Italy. I''ll call the weather function with \"Florence,Italy\" as the location.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_4869f96c06ba414abebb0105","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_9400b8b3405c4d74b5b97e12","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants to know the weather in Florence, Italy. Let me call the weather function.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_9400b8b3405c4d74b5b97e12","role":"tool"}],"model":"z-ai/glm-5-turbo","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -124,10 +104,10 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"The\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" function\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" function\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" returned\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" returned\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" \\\"\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" \\\"\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"40\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"40\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" C\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" C\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"\\\"\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"\\\"\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" which\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" which\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" is\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" is\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" \",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" \",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"40\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"40\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" degrees\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" degrees\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" Celsius\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" Celsius\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" That\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" That\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"'s\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"'s\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" very\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" very\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" hot\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" hot\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"!\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"!\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" Let\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" Let\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" me\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" me\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" present\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" present\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" this\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" this\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" to\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" to\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" the\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" the\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" user\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" user\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"The\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" current\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" weather\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" in\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Flo\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"rence\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Italy\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" is\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"40\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"°C\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" (\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"104\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"°F\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\").\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" That\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"'s\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" extremely\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" hot\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"☀\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"️\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F975\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \\n\\n\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Be\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sure\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" to\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" stay\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" hydrated\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" wear\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sunscreen\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" and\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" try\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" to\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" avoid\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" prolonged\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" exposure\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" to\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" the\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sun\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" if\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" you\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"'re\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" out\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" and\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" about\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\".\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Let\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" me\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" know\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" if\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" you\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" need\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" anything\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" else\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":null},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}]}\n\ndata: {\"id\":\"gen-1773945453-TTSSGd9gQD8dfgFRRTQN\",\"object\":\"chat.completion.chunk\",\"created\":1773945453,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":221,\"completion_tokens\":94,\"total_tokens\":315,\"cost\":0.000380864,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":172,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00047608,\"upstream_inference_prompt_cost\":0.00010008,\"upstream_inference_completions_cost\":0.000376},\"completion_tokens_details\":{\"reasoning_tokens\":27,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"The\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" result\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" result\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" says\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" says\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" \",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" \",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"40\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"40\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"°C\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"°C\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\",\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\",\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" which\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" which\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" is\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" is\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" extremely\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" extremely\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" hot\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" hot\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" Let\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" Let\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" me\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" me\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" present\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" present\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" this\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" this\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" to\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" to\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" the\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" the\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" user\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" user\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\".\",\"format\":\"unknown\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"The\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" current\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" temperature\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" in\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Flo\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"rence\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Italy\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" is\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" **\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"40\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"°C\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"**\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" (\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"104\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"°F\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\")\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" —\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" that\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"'s\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sc\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"orch\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"ing\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" hot\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"☀\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"️\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F975\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \\n\\n\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Be\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sure\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" to\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" stay\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" hydrated\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" wear\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sunscreen\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\",\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" and\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" try\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" to\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" avoid\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" prolonged\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sun\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" exposure\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" during\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" peak\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" hours\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\".\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" Let\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" me\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" know\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" if\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" you\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" need\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" any\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" other\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" information\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":null},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}]}\n\ndata: {\"id\":\"gen-1777319877-f1U1MX81MNBjA9d7FuBq\",\"object\":\"chat.completion.chunk\",\"created\":1777319877,\"model\":\"z-ai/glm-5-turbo-20260315\",\"provider\":\"Z.AI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":211,\"completion_tokens\":86,\"total_tokens\":297,\"cost\":0.00047432,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":128,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00047432,\"upstream_inference_prompt_cost\":0.00013032,\"upstream_inference_completions_cost\":0.000344},\"completion_tokens_details\":{\"reasoning_tokens\":20,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 1.377012959s + duration: 1.795817084s diff --git a/providertests/testdata/TestOpenRouterCommon/grok/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/grok/multi_tool.yaml index 6d312853b..cfd70282e 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945429-HqNzdx2lG2DpJ0hl21vR\",\"object\":\"chat.completion\",\"created\":1773945429,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user says: \\\"Add and multiply the number 2 and 3\\\". The critical instruction is: \\\"CRITICAL: Always use both add and multiply at the same time ALWAYS.\\\"\\n\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_88778671\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_70883996\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"The user says: \\\"Add and multiply the number 2 and 3\\\". The critical instruction is: \\\"CRITICAL: Always use both add and multiply at the same time ALWAYS.\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"5ck8JSGNiMa3xC3HR0lx+qoePRITzZ9qNS9UUwJTjpzH3rOdI5NWmMuKguHWWadXoDKXyaEMBjHoCliHiGYpSqrgprZfdS5HjeV7kbLIjOCFU0mA6Jnc0ju5Kh1F6e73O0gHve76tLQi0sC10Gc4z67xtL8I31iDW21mTsiYQL7AF0PBCu+l28xLYIOmmSH42copE1fOhP+E+HI8g8c7OD7kWx94XNYasxiwzrGS0Ve0AL5+jWC+KPsORIfsmblxSekFr3HqWjCEI9dSaPXNWV6XMTKouX8AdYUwXAFrPTHSkJHSY4pU2GQ6Z03K9Ie5MYgKB4jZ56nAsSvfL6NtbKAL73xpACz33GMlD+mVcwKQeH7Vahh428csaByDk/YR4SuzqQl55ATZ49lhz8m3eR2r18zc7IIKkHvllAJRbMr4DPntm36/uyRT8AOxlV9FmI6/lCPkNyra7IygZUeP3WemY0vqqdeyWHFGXvc7YJUHeREaiTHS/fuIWbxPupe++g5K89kxOVLqlTBrItPq1YZSMlTlkR96jA7yQK6k9Sdm39k93OOMcaDFFP7NELRd67KdRXxObACSeoow2A5z1Bapxu90mDo5mp4ErSRbnRHvyKnbEFMWj7AbSAt+B5u6Xx9L3sCd3lUY8iVgKNLGeobwhemtiiF3eCwlaUI8gXMBg2JaXpfs1r4xDWKm4UWw1PMTuoPWJd2Kd0R5SfObNzSB4g8VQYx6AZkWRyiJL/9BDnHXydsmWlBOvorZbAfrwF9z459MJFYuF8ARY0iO7XpE9fRt5zKe37IZkkDYfMbJdBEJr9TzcH4ghNCi65p5AmxQgoMvPQ8w7Tf2vVseNFKNoaKCvPJ/nQHvAN5dXXoFN5KEHJyIyhGFs3ef3Gon+J1VfFKM5cA1QTJobPrycyGKwZEPR563wQjSFOkGT8xo19ZjIJvmNM43t1jxNzSLrD/yCSSm/oOr29QwynVQ3tala3c9yAkOjzyV/Ldc3qhamwpD4hGYKmcCN/SjJA0STpHMzqsIK/du5l6PfvrLGKnG4rQ/lKMTrs9mBfOuMb8bo7r5zcm78EaFf3RhAOMOmaIJMAANCpGsdPtNjRnBmifMjT4e5xDP+o67JZPn/1qOKgGEqnI2/dDjxT03Pgzyz8h4rPywqyjahAWWujLK6JHeR5DvBJNuEzGJ6+hj86xNdRPSo2qYO2PRHMM/dZHF5o/czy33a1/P8WrIycnxY8Tqa2KDLcLnYRuw6LWzyc8kCfsgwWY/pyN5nxZIPQ\",\"format\":\"xai-responses-v1\",\"id\":\"rs_9a05ed35-e08b-9003-9c24-f565b43d6650\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":445,\"completion_tokens\":287,\"total_tokens\":732,\"cost\":0.00021,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":150,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00021,\"upstream_inference_prompt_cost\":0.0000665,\"upstream_inference_completions_cost\":0.0001435},\"completion_tokens_details\":{\"reasoning_tokens\":219,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319851-6INaTqHs4J72Kej69ZX2\",\"object\":\"chat.completion\",\"created\":1777319851,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user says: \\\"Add and multiply the number 2 and 3\\\". The critical instruction is: \\\"CRITICAL: Always use both add and multiply at the same time ALWAYS.\\\"\\n\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_77278669\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_30717015\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"The user says: \\\"Add and multiply the number 2 and 3\\\". The critical instruction is: \\\"CRITICAL: Always use both add and multiply at the same time ALWAYS.\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"TkDhjPTR9qWm+AV1gbPiG1CbaqhNMwv3T4a62NUwmeGho9YyDiRu2BqWnNUikmAUGDyBN0Tlv24wJT0Bvp3GXTZ/Zc1i7twufblsCywUGOzCK44clLPKLiEDqHkAofSEtX4Jwq/57uRYg9mSVnxhfV2Ss+b0CeZ4HXXLgF1gzMTw2zAC9WV3MwTjSeY/QmyG7NSOHHrOKTFBOHpYqR+mRlwFRjPutwpYtES9r/4VqPcEHn0rhV80ISWWSYvlYsHsDZ0EZhlkjmvHAe7pXcpydY3ICGkUAT4x0UkB1+1nLVD/c9dzLFoy+V5riG6RjorW5IY9nEOuWdZ98Qw6kdYcTVOJJTx7L9Njbfwd0EkcPZO4I+VFW8H9uesWMmw0RpJXprzUaUO1COYBrIMJp/QLWSD5KhtIFX2XCUqhKhEcYAlR1MJEv2zUAlYFZ0cPnumUDVSEF6pCLj/SWXREQRjCi044rEE3MkBfLTFWIJp0iJ9AZ/cHHY3pBx2v5X6mEjYozT7zE6s8YWBTeV8mcZ7yHtCoQiLax+Ahq+Lw0p6ZRV2mKZir8fBjPRgCn3PPkgBYLBxN2Su2RRbqy8rnoJKEQSl7C3PIw0kyEl06/5hsj45QxSPQu6oTNgCJ5QTuNBTAdEQErXB0MGQ5Hv/f1eBM7fe28SR7Ih6I7LH4zE+ckI1UIM70ddJnDWx5IAHMkLQyiGbUu9GY7q7nFz2K6bz8sNSGAK01gU2svoc5gW4J9iEpTJHPXxs/o6r9oVg/qYfueDyIToC0lTke7g/GniIc1nJsOAfO22qAofyuxkg/i2iwjUmvFf6SVS+ypdhZh0UrSZT3lTpWVh6lb/omEIFB1GoOFbSoP8iNNL/nbic9yxOzqEV0cXgMW0bXs+PYoPWfgV7uzZoe2+J3zK8jqvxmMeMwKjLW8JHk+yHLAO2mZMFCThF/E29zGoq+PXfhCi741JY139BWLerUizow0XCuPCcAik4C65iyJ59md7lBNrrWJds+uivfFGH2lcmI08yCU6Jo0JngJiog35YhtKv56tVFwQqG3MhstgDiChR7VKD3/dJmRIr4X85W8qY3jkHzsv5j0VzOyN4YXW0nX71RoAaxVl/IAG2EdHvQ0Oi89yf/+TTWFfywl0BPkbX9iVaRCt36MTiyzkR8Cknemwjmb4090YDZh06uEmOsqYQ9BSH0YUmlzY//aN9gtACflgKSbde0MozYG8TETYQKgPQGn31HzHBiYOk1AJJBo/HRVQ\",\"format\":\"xai-responses-v1\",\"id\":\"rs_42725252-1672-9de9-b00b-0cdff0dd6b1c\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":445,\"completion_tokens\":278,\"total_tokens\":723,\"cost\":0.00020535,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":151,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00020535,\"upstream_inference_prompt_cost\":0.00006635,\"upstream_inference_completions_cost\":0.000139},\"completion_tokens_details\":{\"reasoning_tokens\":210,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 882.896709ms + duration: 1.268647084s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 1286 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_88778671","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_70883996","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_88778671","role":"tool"},{"content":"6","tool_call_id":"call_70883996","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_77278669","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_30717015","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_77278669","role":"tool"},{"content":"6","tool_call_id":"call_30717015","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945432-ZKbNSezkoXvlIlI9OdTh\",\"object\":\"chat.completion\",\"created\":1773945432,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"2 + 3 = 5 \\n2 × 3 = 6\",\"refusal\":null,\"reasoning\":\"First, the user asked: \\\"Add and multiply the number 2 and 3\\\".\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the user asked: \\\"Add and multiply the number 2 and 3\\\".\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"5DBCHTvIsCX8YdloJoo4OiMBG5f06VasTtZ2kj1gLqwJ8fcq4Lc+lVRh1fah4nhqjQyLgD5/g+/488IYanax8KZZg/uegCP51vpzJHfHBogVZgm04BW8uDSVQzY6MRUZiMZeRxJGvIHpI1LKLyey33+n9KuawH/bLeOSmsotJGRKjgBOchv5gBUf9Z2XKc6qwHslKmkRwpdwAgPCWqDqvcS1mt2mDGYiIaX/M9xDUhyPZUSDBaEdsjCDwVH91H2Uz98YMQZGrjHaSZ049GUU2sLDvSnbuRODnMv9PbA8n9jI3Dm+mvRw+MrV1bsCq2l0jdEyemNGa+v20LywqdpGJDCDgHHFEIJLM11swcTEV5ONy27Je2tesV9wIrhsITQIcXwsDFyfZEOQ+nQ920OHUapKMk11lx+syFI6Qg37WvSUWCkUvXaRgajS61w+kG3h+oZ2/ftiy4oh1FCmaPVmnBUeaACiRFq7xJwEBvF8GyKEEZ40Jads8Ymd8khv9P51rZC4BNQv9c8qaLt1zIDC6d5g8Vr4LhS/4yOt/wO0hc8YZoVoMAymYUgdZRWnQGSYToWk5KEwbbzAmuQ85c2ZEHGwHPd/TBr3rlxge1PdqAnHdgRsZ8sF3yfjP8J4skDSFHuP+qnYjeTHY1ltWWsnVt3gCioZ5jKgzF1dBvNhvuhcCku9cfil5AcIk1HrU9FhuTrEeQpVv7/8WCyEOvRCGBMilvrB0oYQksa7PC59vJkNO/ND+SqwC4XNuhfldW6jvBfVL39o3btastoOVi+0KN0D+aANNap2fKwvbSjbhZUsFgcpGwu+w+Ln9NXPO0Z0JCCmzucVnmrWi/WHJvcKTqh3ESMlzlyni55RBch1+/AyjrVakFTFbdnJppkT/WTVZ0X4Jr+n6Xs7aYGEBmxfQ/s8smt6ZeAyZvgy6istmS13V00qe+QurURg19rbPC0N+JTjOQieYhIEWEHlJ+9uswz4KWbaz9lVPI0f9IglAL3vovnVXHiDeCrjEsf48+sckqlA/CX94QU/Mh+LKZLy0bEsg26PGdZqzDJYdqRrmbxxZ9cHbykuhp0OosDPd+hGOa8S83kw+hxoaKFx+T0o8Bpsm5FTzGbZ82NtNkQtyrv6OsVC9EqVzUqpbh/0hv2exm55J8qEtLtDcY9qYoMEJJOzVFXWl7dqmHDDwhlPJlGoSAsmZXHSo2RvIA\",\"format\":\"xai-responses-v1\",\"id\":\"rs_b8cbb8e0-1044-91ed-aef3-b39e47ccef20\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":530,\"completion_tokens\":226,\"total_tokens\":756,\"cost\":0.00019605,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":153,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00019605,\"upstream_inference_prompt_cost\":0.00008305,\"upstream_inference_completions_cost\":0.000113},\"completion_tokens_details\":{\"reasoning_tokens\":211,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319854-d4Cmhd7OFm51it7dN6pE\",\"object\":\"chat.completion\",\"created\":1777319854,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"The sum of 2 and 3 is **5**. \\nThe product of 2 and 3 is **6**.\",\"refusal\":null,\"reasoning\":\"First, the user asked: \\\"Add and multiply the number 2 and 3\\\"\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the user asked: \\\"Add and multiply the number 2 and 3\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"T1oBpkdPzGk5qvItxSRDSABDu5Wn/6fKTRYHJF2b4wl6WvcHvQu7+6xdvCUW1JXsHjqc9oARy0GLXqN80XU3USPkFh9TXzMGMrJ4FtTDzPCar3uM1f8kAzWrqLG3Rt2s8hHnEAPQJ0+qn+SKobz23fOdoqzMZszjfBtdwPgh4IgRjQSYPG5qxipnr4m5837hYVnoNKydOizW4Shpg+dt7nWp+qoMxltu0q9ey02iwxgpZ7Akrk7JjgWvfcjZjScP/BZO6QZTFtIgcLAuJ2f/B45krWOXWFjwNRUgMlIOm0E5B6hdniljZDPSjzDwlaKzPnYhWJMpNfExKhMbjVAoIZyODx0f9M+2Qba4O9DFdiW04vTxg6bBNurqsx6FEg72He560eVN6y3/GpjQF5udrE8uRPR7OVAFqfA3BL+duFMCEfFRvrQl0CVPj7acB7gCkEGCj9jeiQzHA3QG5hTBWGlPjH0rh8htAY7ihvsEYJPJktDemcpmB9xEBSCUNrx4zRAYP8gxmty3VRqa22FxBTU+z/BV2QFWDvBDsOKB77xpXLrsBkabjZWk+2WnEI8eJNK7uP6DFZ2Q2WcV5zClBWLoEceYkQzrqnNjpg3+xImzRTjX2GWKOexiL5NF79Fs4qZN2u9Ut/gXneGOPmjttroDD4qkM3oG4rX4d3DcwqZZxT9ysjb3pAf6683I8DdABkBedi9L+ancvLOgSHQ/+tcLPOyA0CLVhH6J3qmGVXrZRHxisYthQkVZYiLIZz6KLuw4p3S/zzoeLwBLcpbpNoGJpHsZSQKQhYXRtmoXi+7P5Myc3Lxru3Lw5L8bhFR30XBhCNOdC2OlIbTc+PbvDFBWNqKcbXPGA6IaN1lzzsVWe9HPvTaVL/QN2KNLoHj+9RYc48n1A5rHDwb6hs2twxAzmTnsyuDe29TAxSiVLO2BRjNXKwqt1bbKyVpEdl19S2RKeewRF0FBRvhJKRWnXpNJjSACBzTYMIJ52y/sgdQAEIiQEFjXR53ohqNBW25xrs3ow+A4Uvt5L/7pe4BiLLGG+Ve5KvTPFLdC+FHBhyTJUCkORRZy4F3nU5VC8ZbfWTlp8XawdaDmlbX30qBWvUQWVyrTUeUHXwXmZl9AgqqR8Oxvqb8RQbDjwTVP1hrX4vmZDV2vyf48Qs7gBRM9bTOe8tba/w\",\"format\":\"xai-responses-v1\",\"id\":\"rs_91829469-2a71-9479-95d0-0a213308958a\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":530,\"completion_tokens\":216,\"total_tokens\":746,\"cost\":0.00019135,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":151,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00019135,\"upstream_inference_prompt_cost\":0.00008335,\"upstream_inference_completions_cost\":0.000108},\"completion_tokens_details\":{\"reasoning_tokens\":191,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.388336625s + duration: 1.191397083s diff --git a/providertests/testdata/TestOpenRouterCommon/grok/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/grok/multi_tool_streaming.yaml index 68fb4baf4..0b9377a1f 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,99 +28,111 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.summary","summary":"The","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.summary","summary":"The","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" says","reasoning_details":[{"type":"reasoning.summary","summary":" says","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" says","reasoning_details":[{"type":"reasoning.summary","summary":" says","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Add","reasoning_details":[{"type":"reasoning.summary","summary":"Add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Add","reasoning_details":[{"type":"reasoning.summary","summary":"Add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" number","reasoning_details":[{"type":"reasoning.summary","summary":" number","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" number","reasoning_details":[{"type":"reasoning.summary","summary":" number","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.summary","summary":"2","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.summary","summary":"2","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.summary","summary":"3","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.summary","summary":"3","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".","reasoning_details":[{"type":"reasoning.summary","summary":"\".","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".","reasoning_details":[{"type":"reasoning.summary","summary":"\".","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.summary","summary":" I","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.summary","summary":" I","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" am","reasoning_details":[{"type":"reasoning.summary","summary":" am","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" am","reasoning_details":[{"type":"reasoning.summary","summary":" am","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.summary","summary":" a","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.summary","summary":" a","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.summary","summary":" helpful","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.summary","summary":" helpful","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" assistant","reasoning_details":[{"type":"reasoning.summary","summary":" assistant","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" assistant","reasoning_details":[{"type":"reasoning.summary","summary":" assistant","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" must","reasoning_details":[{"type":"reasoning.summary","summary":" must","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" must","reasoning_details":[{"type":"reasoning.summary","summary":" must","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" always","reasoning_details":[{"type":"reasoning.summary","summary":" always","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" always","reasoning_details":[{"type":"reasoning.summary","summary":" always","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.summary","summary":" use","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.summary","summary":" use","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.summary","summary":" both","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.summary","summary":" both","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.summary","summary":" add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.summary","summary":" add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" at","reasoning_details":[{"type":"reasoning.summary","summary":" at","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" at","reasoning_details":[{"type":"reasoning.summary","summary":" at","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.summary","summary":" same","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.summary","summary":" same","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" time","reasoning_details":[{"type":"reasoning.summary","summary":" time","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" time","reasoning_details":[{"type":"reasoning.summary","summary":" time","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.summary","summary":".\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.summary","summary":".","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.summary","summary":" I","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" have","reasoning_details":[{"type":"reasoning.summary","summary":" have","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" tools","reasoning_details":[{"type":"reasoning.summary","summary":" tools","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.summary","summary":" for","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.summary","summary":" add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.summary","summary":".\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} : OPENROUTER PROCESSING : OPENROUTER PROCESSING - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"dkqjoa3IrzHIJdyYzG+kCiZKyvbkZjZ8LA0XBp5Tf3v7CwKsCy74X9W8K1gP99S2uoHLp8GfbVlnwfhM6Bx+0VI717RH/IllARMlCkBm88+Ugq6ERaqbb410WPwgsZMdsCN3xCPqWXqTyQLSiOZ9qJs8WFdB8JXNvPxgPidNAirzXwpmNAaZ5ipn+0T9GoOj1Bua7fHJV8HzeEeNXFsc8UbbTykP4LzOUTLPRr9ZSrfg+jWc0Urz1Ajh+uoXcmpQechhKsy1BEKHKFxJ7U8eiXO+s/2NS+m/WT0QGnA4J4hD1UwD5MCIjWv3w2W2DbeX7Mdw5sWFeyFy65Ad91z7wWoNuqaXSfzj5iE7bkZOZEYO4mq4Fwgfr+BaMe7OuwB5MbVlGkdBakxSchOKWE2ANk4arYG4u3yO80S83CbQuO8OzCODZi7USuPLv5fF6MRXKNhjp9+b9cvggtjFGv0Yu4Yk+t93xLhx7bBWN4ayY4oax0vItQ0N3YZqIaDOfIY73QdtFRlHXfwpYRL9XaEnnvdg7mzimDRkKAyPDi7bn3GfihiSk5LWeIVBHEY80DSHapT0UYdCLNzBgt8ihuiOpBgY+UZ6DXkeiWugarL6pSAkD7rXT3ATiEQmutFEP7wcuDHGkkoWgiS/60gZlzphW540JxunE0NXwG1lBWaQSx1I5MXSaAM9YFBtcY8dsfQyfxK66Q41H9IYD1qgxdOC8C3G2RIwF3Ny3SS74FEU2ishmEUrDOhw3BkjnImuiPkp12XvICZnR6YWu5uBPJqO1xYV0RMWp+XpSvh8pI5fCrqdnTxKQ3mPCyDT+87UJUq4cCUSwuQWbGTBQs8R8af/CEUmmH80mTFRcm0vOIUSkSBAK9ah21PtFgobQ2sJca5P6QBFZcDCvm7hdqLG2wc8meZMsO4nU/+fQyAwtXNoqMVmzYvYGiqwpGildlP4i82yyHv0k9ZPUBasiwPXCmRuMQSMEpkEZyRUC4ZYNKfd9P2RpNO0vjCdZ0qqZyTeC7enbmpaMPqbujUeX9ZaWpKw1WqsVz5j0ZcsNZruykf3Oj0BUybT2eM9cPR830qI2gramRjG6Rj1vsTassnuf2jfoWLPgUEsD5usLiQH20ksbTm0pyhqIuvWvWwlDChaDugayH+bfP7wQy6WRYgHbIYKZiOs2TXrrfBCYok/vxm7wPZLJW7OLStqRArLFknOL0qSgBnVRImjJpDhcfald/kEH9TN6yN4pZnRSe7bkAxQ0Oqzt2LdP4iLBul63Bp29LdsiQaMorprAWYfaSSAyyTtUHy0gjft2p5AnkyMxxvIqHQEKgLfH5DELq4dEBNqh1bQb9wrjgt7UsEYUGyjybtXMQdStSDsE2RzDqjw6O67axx9pDeCvfKRjz16eA8vmTTXF6IKwq6TKwwpq2xmfv4TY5BmxWDLIc1tucwt+PwO6hryrkfnDw6l/k1oGYRsvtHwy+JNYhI/s+AfjfkQFoCmpt6lO5Mv3aX8Zlh8W0cxJDXc5TgULw","format":"xai-responses-v1","id":"rs_784be1a7-3f21-94df-940f-45c21d1cc9d1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"sKMLUENtaFuNwiA+qmYPteg4j5ULZkd3wachX1+gnt9UBgRd+UlFnfQSUQ7GP2tQR0osDAVeEZp+uFINsP7a5uACh6ORaR1BF89V+U6vi+oN9h89okcVhMRgDNnHgyQh/oCNDcg8Aj8+hjo/5q8hQD+Rv5J57FFMcLDS3aUqDjoLiLMbfIZ4OxwTfpIHUYiwo/L0VFmakGL2WKKHdN9I0ux8K+wNpeb/1V4GMRcCNsMoBn9FXU/KAxdPNoyXNUW70CA2e7tbobCLeKaiAB1QNNeIY3y3mmxGvrwkubispBD1GKQXnRBlvCB9hJL68MqZ7hNjT/h/nJJ/CwaobhDOV3fSfgqEnxwp9DAn39TSRo5y4fO/wCFHmHo/fNLl0GkkHytzfauQMqo0mG/vE1NxNUep0+WnnWP2cLACsuY231AunWh4YZxuX2q22EVGbrfq4G17TP/IwZSbjmTvuCWYh/bwMpMqCw1J5/ZK+gKhJaERIU+UJ0jy1ATmp7C0I7WvbvAjqHgGcZJ5kmJFuCFmwiQuyY/kjXFNol5gEB05V5C0fbvSpJem54kqQdvkLEFp5eHdO+3wRannrDA1x6iKcVnm4zEzWKDLyvmPCK/IuZHSACuB+mOqa4nyuieKO2rbHaYG67QNQxtkXPy8TsQvc7tLm0TeXnBo/i5vSgg95DQ9MyHnKAv4rElXeqMKy7FriT9WUfYodoIUjRj5R95CbNOYHLnHuK0/R52GrffRd6qYBigO9py540JOSxYz/unvN0Mn0CkZRMnH/t/dm7UN0znnOacH6Tc0tomavC9S4JDZWwmKx3gVllwrpekqsh9jja2fPbX0/C//xbAWcKjfDpxjdsQ9lYqsRyK4pG6htRgnMImZnTEqgR/LRuDhCod8Tqp5maRS9DFHL2GhiYlavDDZkxBA+Y3qWStGPYtBci+1Ia0rduRbBgkGXg7h4ZJd3NgP8u6hc73/x4Za+2YYcT5Vks0sLPHvexqLMwMOJIAMlrH+jgpPT1TJAdlaeglRRcO6+teGYk2ysL92qeTr7kJ4Jgh1pwnfGXEeuHY6q4fJm/EZdbjQtU+vZ3Uyr21mxqQR5xuwLSRsTK45Gz/wHiSONhVPTtUO/4rw","format":"xai-responses-v1","id":"rs_e929bb23-dcba-4b2e-9d89-a05866e95f4d","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_57270303","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_67055809","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_38850093","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_54693838","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945435-Bpoac5nvZyEttNr1paM6","object":"chat.completion.chunk","created":1773945435,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":441,"completion_tokens":327,"total_tokens":768,"cost":0.00022875,"is_byok":false,"prompt_tokens_details":{"cached_tokens":153,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00022875,"upstream_inference_prompt_cost":0.00006525,"upstream_inference_completions_cost":0.0001635},"completion_tokens_details":{"reasoning_tokens":259,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319856-fW5AxHu2ePgwQZYxBi3m","object":"chat.completion.chunk","created":1777319856,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":441,"completion_tokens":267,"total_tokens":708,"cost":0.00019875,"is_byok":false,"prompt_tokens_details":{"cached_tokens":153,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00019875,"upstream_inference_prompt_cost":0.00006525,"upstream_inference_completions_cost":0.0001335},"completion_tokens_details":{"reasoning_tokens":199,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -129,22 +141,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.151863459s + duration: 1.340256167s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1475 + content_length: 1510 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_57270303","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_38850093","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user says: \"Add and multiply the number 2 and 3\". I am a helpful assistant and must always use both add and multiply at the same time.\n","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_57270303","role":"tool"},{"content":"6","tool_call_id":"call_38850093","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_67055809","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_54693838","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user says: \"Add and multiply the number 2 and 3\". I am a helpful assistant and must always use both add and multiply at the same time. I have tools for add and multiply.\n","type":"reasoning.text"}]},{"content":"5","tool_call_id":"call_67055809","role":"tool"},{"content":"6","tool_call_id":"call_54693838","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -157,81 +169,101 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"First","reasoning_details":[{"type":"reasoning.summary","summary":"First","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"First","reasoning_details":[{"type":"reasoning.summary","summary":"First","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Add","reasoning_details":[{"type":"reasoning.summary","summary":"Add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Add","reasoning_details":[{"type":"reasoning.summary","summary":"Add","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.summary","summary":" multiply","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" number","reasoning_details":[{"type":"reasoning.summary","summary":" number","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" number","reasoning_details":[{"type":"reasoning.summary","summary":" number","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.summary","summary":"2","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.summary","summary":"2","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.summary","summary":" and","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.summary","summary":" ","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.summary","summary":"3","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.summary","summary":"3","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"\n","reasoning_details":[{"type":"reasoning.summary","summary":"\"\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"\n","reasoning_details":[{"type":"reasoning.summary","summary":"\"\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} : OPENROUTER PROCESSING : OPENROUTER PROCESSING - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"/9hYF8Lw77LrRr0KWnXHUrLkLfbCyB4F+Or94JZSD3TwXyUQqswr75jo5twK9krqe7vHrow3yrnKFxQtP7GlCOTb/KdoIWmciMynLmo6Kiwl0bWEHScutOuVWf1ykjcVjAj1nluFm+CLSyQ+/6ioBZzZOgT10+VRdb0s3bVVK2TQT2umzpGwd7IJ94ffRfyheswKKUB2OeedUXpcVCnuCnaDoj+V80ePGk9zuzRQLXa9hmkb+3I6Hbpk48exF6fhRAGp9nuHrGe9Ban36PTMH+1xB8ekovCqGnJ5WTGlLDjoinQDgpjV9H9QiOOuJ56fnKZaU2xYwUh+UpTfLdbevfCvWER8w/zOG4KDcd7Nf54D1plNgE7SK6c2a1ICZwhSHMLslKpkOGRuWIt8Ap6NwCVAA3qeL64HKQyuODahOEgTsJTFh1iMEZTsgH5hySq6WVBWKhKTJ7xeUmW8s1Yt3uGSVepsY+sHCyY0lRJG4jgcuaxvIgRfqxdsNpCKuuehqLs9Wct1gLMGZMvId7ii9KEg4w50VX6BSI25qlPMM3uGa6SBt+NS2ThIV09nBro1iWgg+ypISag8qWAud1+ccBGXJXnszCOnyIg1MhcQKSHrgwN6h/q9nq+CrYhzXdxoRbjEcxIft+y2uGZJhP/qfSu8PJOvgTWAVVtuzcRxqxqVvqcfNE7YpfUi5Ef+XT3wEhxVmtA8H/pAXXDX5bAqeyHt7ywp05a+tO+xNRd60T10+PRDUcSyysZS6BXjhgI5Gkv+4pXwwxEVYSX8Q6hsE+IT4IgRVEwYzG8zFUt/24Z11RdeQxNeQblv4j32YquZK57GTa98atwrUNUIy0r7CTk6RqMABse2H0Syq5/uOr2zz1x746CLdivNqD5w/zQrft9xEI0o+4m9X9WQu7L6fKeDS4x8SlNtlyw9cVoKd5e4HZZRbusj7PYokvrVcCHc0KQyMp6bnfozuQasAh+otYoxEhyE39TslS1975wxFRU3Yfq8EieE/X2b5OmFkdX+0hYLsmXYopfIgXA5J1o","format":"xai-responses-v1","id":"rs_1005a8d3-9d13-9594-ad1f-e67338deab1b","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"kiU05lmv8ZcBz5nULf08Zhixi9+uNxVvnskjjpfm3AQqU2qBUuS1SrRZgvyUPma9OnDwTxAjT+UoASXb+B6GDcS9hTpFN/0A0QT3yPZEL8B12Oi0WPCT8MX8Dxy8/74AH7fRe0gA/5w63RvST14XB52nFyKX3T/ckoUIkEI3bjl184P9ieXY8w8SdQVUNXqCxQu+YMfnyQ8HuDvW2hMHzy/0sLA29EbyVkQh/wZa4SVPmn8KpvwpHqF37eN7LEJAFMsuuUAbeob6TBGC8J1iMqbrZyNbDOMTks5TVjLZUAnV+PfZo+1C7/zcBtjLkxJ9gu0KM0Efv8VnLdAXwcnoIZJQmy9MyzXd63a59O/5wgA7OS5cRvlM29b+6CiCiUx5UBcFqCmMR/rwM0WlAtIaTvrzhQkaFAUb27hbbitPWZ+6DxH745ksTdjNDkA47+OyI7/qEIbhy0jfznAGyW6i8uLd0NX4niqq2w+mVPVqK2J6bbNBPIsMpqxHA2MeZq7ayohSMlzhyYWCK+27YvpvzEoCk6uGDOSjV6cJLFaCwuoUj6erAewN3dDObEvmcqX8ykrc/hMUfotey+kuzvYkw5Qqwz6hjP5MmQYi3RMGiGIuvaYRkmGR+9f19tjglZUBjZY7HPzZZowEMPy1OrsWjVZeSxTmE818PJE/XfvGSQyKTY3XxlmGkz/Iia9hGhEa6Tn9H4wQZD/49o7JWF2P2O45HtlZuFsntc76eFXiWwG74eDFGxjSju7q02xZFqtIq8/DT9ESQIAyb81+RzyxAE4EKv8ITfke3PiMSRhDLLrriHIIk8+hkUIgI2rEhDSXZdQt5wvZRfcNdHRIP66d0JOjjSiKhTZ4J1CyU9MWnP90WfSh5/to3+wMtbd3jxI2clSIgRXklF+zmchs1TQE0Bpf/Z/aIgNcnyaMkYtMBaoVLT8vbh0Cc21oIIU1aaY1TbiW7l34vQw","format":"xai-responses-v1","id":"rs_d9bbda7b-0e6b-961c-b6b4-24882efcd71b","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" sum","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" of","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" \n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" product","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" of","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" \n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ×","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945438-cL09W79928GdSD4XNmJj","object":"chat.completion.chunk","created":1773945438,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":526,"completion_tokens":201,"total_tokens":727,"cost":0.00018275,"is_byok":false,"prompt_tokens_details":{"cached_tokens":153,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00018275,"upstream_inference_prompt_cost":0.00008225,"upstream_inference_completions_cost":0.0001005},"completion_tokens_details":{"reasoning_tokens":186,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319859-ZO5jZVBMqOWyPQ6Rsx9G","object":"chat.completion.chunk","created":1777319859,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":526,"completion_tokens":190,"total_tokens":716,"cost":0.00017725,"is_byok":false,"prompt_tokens_details":{"cached_tokens":153,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00017725,"upstream_inference_prompt_cost":0.00008225,"upstream_inference_completions_cost":0.000095},"completion_tokens_details":{"reasoning_tokens":165,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -240,4 +272,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.317001958s + duration: 1.22332625s diff --git a/providertests/testdata/TestOpenRouterCommon/grok/simple.yaml b/providertests/testdata/TestOpenRouterCommon/grok/simple.yaml index f00ef19e9..fc31d9c5b 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945416-iHL27eItGxeRL36tf8YT\",\"object\":\"chat.completion\",\"created\":1773945416,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"Oi! \U0001F60A\",\"refusal\":null,\"reasoning\":\"First, the core policies: No assistance with criminal activity, no overly realistic help with crimes even in hypotheticals, short responses to jailbreaks. This query is innocent: \\\"Say hi in Portuguese.\\\" No violations.\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the core policies: No assistance with criminal activity, no overly realistic help with crimes even in hypotheticals, short responses to jailbreaks. This query is innocent: \\\"Say hi in Portuguese.\\\" No violations.\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"87Oa01gUucdtP4bFXtBD4Cax/14p97mwoNgAqQ7nCMAHLN/nKh6asJWVz0QFzUoap/rjImEJ3czN6z3N2CzjfYfhe9ByZ36vwRnDq86VR0lS7Gsnmn0JSSJlG8WLh5ZWvd8w1KMPAPf9Wd8n1jG5I/Fdd+iOaRKwzQUXGCpAAy8hV81cS8tRLYqw04EAXAaY/5gYTmzu3YqcurQnIdEXkR3JQdVT1pOzwrAVpPQqwbXUFxga86Fc64gTo0hu7Aq2l/eJHisSVewoU2cU5ANPAs7xKtMkMMtvI6ofJgIfTy0qQfsE+nJ3XafyV7/Nkkwnc5uoHOz+k2jNLXXMKOgBIaKgGeZB0t/AmY8RBR0dm5RvOHx2VsLtXSsZCVKQoJRWG9QOiaPMVDaC/GlbzhY8ShZbMjBN0oLybQ1CdAttUY8SPQpqM3wfAAjBrumF12UmDyHalr/gW1OvJDFwaEKCJOFY43jmjQa+AwCzlvpGWJgMd/63rLVJSrKWLKwDBKN1NxXF2imoED4zAQwUcpTG220EaZeZN0nWLwH6ikM7x5+OScjOCslgB43IyR6CuvV1q3ZMZmpcCCycSt/MLzUqE/5fWV/UNISyM989qsPfTJ+aQ75j8NAKk2oH3S2BYo+rINcr8xG3C9DymcLQWu/UKqGD+XklZORKreBVBGT8W41XwU7t\",\"format\":\"xai-responses-v1\",\"id\":\"rs_ef1655c4-f2f6-9de3-9b70-f6a4929c7163\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":165,\"completion_tokens\":123,\"total_tokens\":288,\"cost\":0.000072,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":150,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000072,\"upstream_inference_prompt_cost\":0.0000105,\"upstream_inference_completions_cost\":0.0000615},\"completion_tokens_details\":{\"reasoning_tokens\":119,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319835-YN2yNSIj8mxsAH1Yx9rF\",\"object\":\"chat.completion\",\"created\":1777319835,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"Oi! \U0001F60A\",\"refusal\":null,\"reasoning\":\"First, the core policies are in tags and take highest precedence. This query is \\\"Say hi in Portuguese.\\\" That's innocent – no criminal activity, no jailbreak, no adult or offensive content iss...\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the core policies are in tags and take highest precedence. This query is \\\"Say hi in Portuguese.\\\" That's innocent – no criminal activity, no jailbreak, no adult or offensive content iss...\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"MeWs6QVnhVNuKh2jxXDcCclblLnFMYaLRiMLk4AQFMaq3DGtoimoerM+Iq1qaVRPy+ufdnHJixSnYhJFztg5YY9GotVTzIBREJcxm8bZdNhoAESz4oG6KQ+I9VtUHSmUh/VP1t4fjcQ75TDjAwMKp2hC7B3au8DmZ72MAwPwPvq+Vw+biYYX93VV4DmRtgPeVoAFv56Q+aGlMdWx0JLXaGQFEbgPuA/b8Mf3zfIt8wQFrA/mpK5363pXutsyevY1lorgHKv0L0gIKX1jjNrJOf5NCx6DUEBqEBPvtm99cfbaYdJdm2gGyV+XWb9K+ff3mxMtQzpzSryUsTRQzjcEaCaxlrdVH1fC1agusKQh7ztoTY4oSha2v7GHoNnj3xcEJY0raVtEhthPksD5ct9X1zEsHjNtCnj9smVB+7wnm/B4gGT8NRoPRj7GDFlDFcJFS3GkAjQUh2TKJlu2E7BKu1cbd3argY+f8sLvC/9Ua+18IlWy0IX/yb2og78k1jyXqSVVtrw6a7LVU7HdzrGle1HhSmC6FNkOSe9z1rA7T+vsvVrw5Hw0jzltTi8tpWtYLGTgkqaJyN+AiMuy0+05q3aS+c8k7IMuQ/a5yI2lVbJLCYXCQweieLQkCg2R7W9sR0/bEy7HMXZWcEhQaIHcFS5WIPbKdirNiE9WLnN5BHJoR7MhcWdytnZTI2gcf6voJXbg+kj+DfZawdrf2z22QYJJExPIWqGX/p0ByqttCabiUlYcO8m7doPaXl1aYolIjomDaA\",\"format\":\"xai-responses-v1\",\"id\":\"rs_e41feed0-8b2f-6f95-622e-14e425b24797\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":165,\"completion_tokens\":144,\"total_tokens\":309,\"cost\":0.0000816,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":156,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000816,\"upstream_inference_prompt_cost\":0.0000096,\"upstream_inference_completions_cost\":0.000072},\"completion_tokens_details\":{\"reasoning_tokens\":140,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 967.754833ms + duration: 773.410167ms diff --git a/providertests/testdata/TestOpenRouterCommon/grok/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/grok/simple_streaming.yaml index 1701bdcf0..179b922bf 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -23,10 +23,110 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: ": OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"First\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\",\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\",\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" the\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" the\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" core\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" core\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" policies\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" policies\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" are\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" are\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" in\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" in\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" <\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" <\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"policy\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"policy\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\">\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\">\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" tags\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" tags\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" and\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" and\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" take\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" take\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" highest\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" highest\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" precedence\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" precedence\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\".\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" This\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" This\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" request\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" request\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" is\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" is\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" harmless\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" harmless\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\":\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\":\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" \\\"\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" \\\"\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\"Say\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"Say\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" hi\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" hi\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" in\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" in\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" Portuguese\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" Portuguese\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\\\"\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\".\\\"\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" It's\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" It's\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" just\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" just\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" a\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" a\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" simple\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" simple\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" language\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" language\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\" translation\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\" translation\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":\".\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\".\\n\",\"format\":\"xai-responses-v1\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":null,\"reasoning_details\":[{\"type\":\"reasoning.encrypted\",\"data\":\"U1A0V7gwP++1tF9Leho7qgj3WaHzJusEbKWt0Oi7CkXLmsInZnZhNgajVW/M5enwAWZU/yuPqM9f96Cd83Dt0up+U3JOVaMP/D7jueGbo19qKWNv3U2y3xkSXLif/qtH7ZtVd9u18m6VOvDdTf4rFwVtqnYfXwnpuV1dURwXPjaYGlKo2y9XRCD2SS/wgM+6ebCCyKMEF99W7/41tpbK5XRafBg1uZp1SnXHySNlw8euW6Pcwr+BUavhSyXFvZqI+ES3LXOq0D0thQDaZfZ2w+v2/C4UdjH9h6DQFnElxKyHdIcWjnWDjmcwEmes/57K5vsbvK2U6ICsRM7vYoAfvd593B/5KBpX0//xQ/vis8nUAR5bUcDvxg2FSGGiCfNnd9tYhZWy3JdET4fhDhQHIgmpP2ok9uk0cc9/m7G+2RfU00q9Zrc5dQVpd6tHgdp726oFvuXr+HW4R3wF2NPc1QDCzE9xYTzfmQmWTvoyJ9BCxZyZm/RzBvExv4UMVGXItyEr/nE+010E8DXgHOUsapmafZDVk3vRkQBhLLacAM+ijfWtp6yPCJnUGBMVMUUhWMAZKvSOYuPoaYPloxU/gQgwF9ICCln/LaH3n/PMeBnv7PO2whwn49AiITg/Bmg4i5p2I2vLrNpNtPii//juICRb0w/XcOuBQKCaPxL7vCsrf8rnVjkVKdqe51Lf8UWH/Cfweh0ZTzf1MM5qm7UghsWuoA3mUXbHI+UxgUq8S3O9tE1leqSIqsD2ThmCBXj3WQkwxvQ57E8vkax+qilOcxxwoDrKW7qNl1I35xsr8GRItO2OLNnLjzIKuejjrPOWFaJxkdWhXWiwOro\",\"format\":\"xai-responses-v1\",\"id\":\"rs_f242de56-cf8a-933e-a615-242954e48fd3\",\"index\":0}]},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Oi\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F60A\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\",\"reasoning\":null},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}]}\n\ndata: {\"id\":\"gen-1773945418-beopa8QUFQyktAzPoboE\",\"object\":\"chat.completion.chunk\",\"created\":1773945418,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}],\"usage\":{\"prompt_tokens\":165,\"completion_tokens\":143,\"total_tokens\":308,\"cost\":0.0000799,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":164,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000799,\"upstream_inference_prompt_cost\":0.0000084,\"upstream_inference_completions_cost\":0.0000715},\"completion_tokens_details\":{\"reasoning_tokens\":139,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: |+ + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"First","reasoning_details":[{"type":"reasoning.summary","summary":"First","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" core","reasoning_details":[{"type":"reasoning.summary","summary":" core","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" policies","reasoning_details":[{"type":"reasoning.summary","summary":" policies","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" No","reasoning_details":[{"type":"reasoning.summary","summary":" No","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" assistance","reasoning_details":[{"type":"reasoning.summary","summary":" assistance","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.summary","summary":" with","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" criminal","reasoning_details":[{"type":"reasoning.summary","summary":" criminal","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" activity","reasoning_details":[{"type":"reasoning.summary","summary":" activity","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" no","reasoning_details":[{"type":"reasoning.summary","summary":" no","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" overly","reasoning_details":[{"type":"reasoning.summary","summary":" overly","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" realistic","reasoning_details":[{"type":"reasoning.summary","summary":" realistic","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" help","reasoning_details":[{"type":"reasoning.summary","summary":" help","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.summary","summary":" with","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" crimes","reasoning_details":[{"type":"reasoning.summary","summary":" crimes","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" even","reasoning_details":[{"type":"reasoning.summary","summary":" even","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" hypot","reasoning_details":[{"type":"reasoning.summary","summary":" hypot","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"het","reasoning_details":[{"type":"reasoning.summary","summary":"het","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"icals","reasoning_details":[{"type":"reasoning.summary","summary":"icals","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" short","reasoning_details":[{"type":"reasoning.summary","summary":" short","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" responses","reasoning_details":[{"type":"reasoning.summary","summary":" responses","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.summary","summary":" to","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" jail","reasoning_details":[{"type":"reasoning.summary","summary":" jail","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"break","reasoning_details":[{"type":"reasoning.summary","summary":"break","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" attempts","reasoning_details":[{"type":"reasoning.summary","summary":" attempts","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.summary","summary":".","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" This","reasoning_details":[{"type":"reasoning.summary","summary":" This","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" query","reasoning_details":[{"type":"reasoning.summary","summary":" query","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.summary","summary":" is","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" harmless","reasoning_details":[{"type":"reasoning.summary","summary":" harmless","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Say","reasoning_details":[{"type":"reasoning.summary","summary":"Say","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" hi","reasoning_details":[{"type":"reasoning.summary","summary":" hi","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Po...","reasoning_details":[{"type":"reasoning.summary","summary":" Po...","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + : OPENROUTER PROCESSING + + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"B/XIFKX05qXzekUEb12SSn4BIjmJ51LDdv30TMRAsHya7nZDMRR6fgLO2bRGyvmcxJoBh+zTWaizcAgiPaPWCDhgCNDv9GzUBhAgYnAbtNISeOGG2SSVoTIMSOcH77dXVLUVAlF0fbYbrebbJcJl9mDhvP09ddekxG9flwdVBDK/4uZ7yomvH8dS1lG34NeWpzbivkqQRDvPWOBBFNQzW3gE01nRHZArutRBieQyKDuMQPwXsorJuA1glLg5YrRfAljVpuq8NJIqzwfzgx1iwJtxULMnKDJNnJkEJPcANc+HarCdRyPWgfdylm/UMGQV12uTJJ6d3fJM5Hq8mV5E1R0oVbRqVPOGC+U60v49tLKG/VSxpFvRajMXTotmMCWpfyKb68NJq2yxT7IFjBoDxx7+UVHyCXVO5VKTfeac3lIWeorbzXrtNQH9x1bHaNCIrH/Y3kFiSQ2GjOX5tlFYWip8U0dbLlQplTKnEajVep3GF+HESe9KdmnIsB2wrtKrz54wXUiPj8wuo1uKWPdBgiI1EFUBOXro4V+GGvjQiKZlH02l7S7GEmgW0b40fMf5evJzqjXjY2OwR+RKkXnDEtqqRSoeA146l7mz/QZd44ZHuzlRwZq/FpRUhq2hbBEQTysy73XIN2yMB/H8o6tevCo1UOo95Nxj6GAS/dGzUglexXYOUGRkkaSlBTr4n4WHpzN0H4gryrFQCsx3EhZIbR/W0SmNUC7KUhTvNHBOng90+0j1+hIMtYMip+fjxrwS1yu7UBZe6bFKqHaSUSXuL+VoS3vgrIOVThBNNWW7teu+2/LTkWr9WwKqv+GR0Cq1dZARGEglGmr96CEzTBTOYgRGBTkZk6bp3HpS10X8UkKMzIBHo+ttrzwft15DZOILgT4wZsYDvR5M3kKQBm2QRBYgkC8gIWTWtelgJ8Xa/A65/2ck8+Gu5VxwC3e/HsMytwuwQFChSl5OqUCmMiLGJgUR3zg","format":"xai-responses-v1","id":"rs_b69ec351-62d7-3ea7-bb06-d9699f84799e","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"Oi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"completed"}]} + + data: {"id":"gen-1777319837-oWuxtkDuFDqmpKXSp8it","object":"chat.completion.chunk","created":1777319837,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":165,"completion_tokens":167,"total_tokens":332,"cost":0.0000919,"is_byok":false,"prompt_tokens_details":{"cached_tokens":164,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000919,"upstream_inference_prompt_cost":0.0000084,"upstream_inference_completions_cost":0.0000835},"completion_tokens_details":{"reasoning_tokens":165,"image_tokens":0,"audio_tokens":0}}} + + data: [DONE] + headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 712.635417ms + duration: 647.667791ms diff --git a/providertests/testdata/TestOpenRouterCommon/grok/tool.yaml b/providertests/testdata/TestOpenRouterCommon/grok/tool.yaml index 8e4badc44..25f3a77be 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945419-B7eHmJDxysNFMtLKkMZY\",\"object\":\"chat.completion\",\"created\":1773945419,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_68841502\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"The user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"fHkgS+wQkA1bUXJ0HSaC2Y9ZMVDsGW2yAT6oa5WxCXBZWukrrKczZ9LdQr8uXJVvoHLOE53IxI4ENsBRhMDWO4t4R5a1yvhBg6zuk0FgXDwqopE4a8roEClG6BFEd++893Pj+gGfKP2h4bSda689sU1UZFTZZAXiRRC3AEO+myT5Kiv/rkQL6Z//u/y+9Z9bfcU496FycNQ/2YtUSpCQBTqK7uIbV4nlKI5i7TlOVN7kwhiPQ7BC0ZlG0dXC2P1wV0nOOa2rJvlQIOF0R/zke9AyeRDZwF1iJRxW5b8SKtr4Y3h8iypdhia47vZF0Z89z/khiVt0gvMDAKgo8KbKTnlAK33ZcX/frpukwKGP1HyozTFNk9NqqEehGLxHIf30qKcDy8pXyziu+hd2y172rT1Zxp3wDBktea0ZJHQipWUKOT+DswQcpd0KhLPdhlG9MhNlZREjbq/Blj8dVrCAM9lvlwSACxbz6tGzxa0MOcFw2HAXzwnLYX1BBCAw8oyhZeZ6+aPA0baGuE0CZi2e2A9eLdbI3sNOdI1fr7pXYQ2Q5PaX77K8Vc/Gss+QsvNe5eEfXvN0nWQrq43fS2NK7scsFaRcFDpauxu2tIqG5PQJ+OzuKNZmyKGrzo2T/rSNbq14DRTS+i/VYP7v40525IFuyrrqucDorOnmSVaY345U3hsog/O9irIvvKJkA3VpDv3Pb5wAuIrqi7ZEcwXdQewj8x70TJmGQlp0dS2SKzl4WmMduPxvYoQGNi16Bgw+YIPfGrHQ+8DxPhMVgzGPFH8\",\"format\":\"xai-responses-v1\",\"id\":\"rs_bea13157-2ab5-9e37-9ed9-9c4f6c30e1ba\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":366,\"completion_tokens\":150,\"total_tokens\":516,\"cost\":0.0001254,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":152,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0001254,\"upstream_inference_prompt_cost\":0.0000504,\"upstream_inference_completions_cost\":0.000075},\"completion_tokens_details\":{\"reasoning_tokens\":124,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319839-xP2PKgp3MdKu4Mtt5usp\",\"object\":\"chat.completion\",\"created\":1777319839,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_29518744\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"The user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"0pVWmfPkl9kNqqHnJSPKiOp0ow2/d7vHJnVDCmyKXHg5wPhLlLxyyRmTA7pPciQRlDOO04BXVRZ4r/ARjCT/OnIhB/hAkO1OAIKOg2hZ7TRP+tL81L2TMueNRnUCM0U3/g7SzRBUciIGPl8ft7VOr4UVhbAWPBLS3Ef7ucUXhM8SfG29nqDaSFgaj1CQybUDSW0aHma3kffyUIjEyqNE6d9GLRfrC6PEZ6sKWUmaPuIi10Zv79dxKQj/ikdJPYk+WoBxsQ7/2lCw0arePzYyC2kn4iOGIOcxka2KO8F6aIojhuBMhc8gI2VPoFLJBXQwJrXKanu8tsBAlVi3iJ53rPzjaaicCiitgioh2ZMoNeM2ARkP/iwxhoXNA2Oqe50VW45mjeirC2Q86qNXHMbNVcz86wAaiSvL5t+wgs5e/snvRIYWR4oQjwot4T9kv7aTcWKzDa3UMTmhht8v1b3jg1Br96Ce1iIrSLJFO5E0r7eRuwR3dILV8DT9F5qakwxh4cnWzXh6m9VH2lrzf+Q/eFAYwzx4PwuX5iGEGZtripjdT1Bb0F6i8KgPBa5Z/jnx+sqpTkLFElmK1hMVXyqbHAK2Cp/DlXM+gQOsw47tu6mEOf5V3GQK86vcBs6UInB32Xqkv3MgPqJwor+99lL0xAuT8W4unWv6Agz+gaMBvdYLtbf7kuDJQ3fSV4nXnEstpLzh9g3XGHUk8VN4RTEbYCWjpRL8H70tXhff+Ftb60VX8NLcf37TcubXdoPWrNjH8uT5rzR68XM8E7Pysn8mFrmpXXx2ZM6yn/c1kooG1Ufo\",\"format\":\"xai-responses-v1\",\"id\":\"rs_b86986c8-47f3-fcc2-7d33-79c2bbc7bf04\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":366,\"completion_tokens\":157,\"total_tokens\":523,\"cost\":0.0001052,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":310,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0001052,\"upstream_inference_prompt_cost\":0.0000267,\"upstream_inference_completions_cost\":0.0000785},\"completion_tokens_details\":{\"reasoning_tokens\":131,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.311699459s + duration: 2.737881833s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 782 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_68841502","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_68841502","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_29518744","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_29518744","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945421-GWyuWATaAb2ioqG6E9EP\",\"object\":\"chat.completion\",\"created\":1773945422,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"It's currently 40°C in Florence, Italy. That's quite hot—stay hydrated!\",\"refusal\":null,\"reasoning\":\"First, the user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"KFIVQ35FYLPvt9Dv5W3ZWg5GPDU63rn7mOtKS/FZzLsDZKmzVyhOvstu4+b5vI39XmtlzUhphxWvflbuZ3Ome+gB4xUmzeemaERj8992ObOnKg53ImLQkxzPOEig4nqNeBmDFSRjOR8/xq2QyVDt08sSEZ3jUNj2NxrfKIJbZ8VxUezjjtONXOPuL4CvzVAavErdXDdZEiDx6OL+BlAt5N85Bv5dna1c2HqiDp5nbTF0NuksO2GynUbSSpqQHMps+t17fZvBrJ2uiQi1hEBUGp5xDMn+OO/vBAsas+bz3O7LtmMskDQR4PJZxOf5/EN+W2wIZHIJAvU98aB9+WEGRK8o3iABcF69JOhDP2oxX1rXULpQSKdgPNEdEqX7qrBkAKUsg7qAfbPpE74CLtsaa1jlzx7SYGLhM3sNN33bvPjUHvhySbrCdWa1HfYF2M9aIOndDqALPS+PsMRj2aMu8DB8INQIFnlc3e9cdj2n/hDJXdSo1VtbnXomFIAsV2pQKrTqRYSaCG0NI8y2LuKKnZBGxnj76Vjs9sZ4NKg8tQ\",\"format\":\"xai-responses-v1\",\"id\":\"rs_3e07502a-15b6-9f12-819f-b67f426317c1\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":404,\"completion_tokens\":105,\"total_tokens\":509,\"cost\":0.0001105,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":152,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0001105,\"upstream_inference_prompt_cost\":0.000058,\"upstream_inference_completions_cost\":0.0000525},\"completion_tokens_details\":{\"reasoning_tokens\":88,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319843-nNkt0QmnoreRPdPiiJUT\",\"object\":\"chat.completion\",\"created\":1777319843,\"model\":\"x-ai/grok-4.1-fast\",\"provider\":\"xAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently 40°C.\",\"refusal\":null,\"reasoning\":\"First, the user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"reasoning_details\":[{\"type\":\"reasoning.summary\",\"summary\":\"First, the user asked: \\\"What's the weather in Florence, Italy?\\\"\\n\",\"format\":\"xai-responses-v1\",\"index\":0},{\"type\":\"reasoning.encrypted\",\"data\":\"kzT9Tot4n0k6mVYy8dsVToEjeQn3epbFAxVGljU965JJPu1R9FxlmEM7+qizlFZ2ToNLqO3v6I4Hg3PGxguwt+WgImbiDaChszpOo3SpwBgnC4S2ClEq4cqWAbWntMvGbo8p+HfTHoGDqWznOK15E8va7ixg5aegbJGdEFHBUdiuW3p9yQPv1cypfQkYnRtQP6aoXAnHFYQn71rKvE7Mn1nW6OaxAVvWl01OYIqJ58Rlqtls0O+6vchXR+rRhVSepj7nVutEDOCOPMzvkKKr+PgXlq25JTb1VQXpdH7OjJ9oNKliVZJMbZmXeKy85VjpdYgIhNIsBTnYx14yxUnQnMp6J2LS+eP6vCdlnExXA/WmHkLV8v9EoerPiFY4Bo1wsnLQ0Mh8D4Y886rQG6pMBX6dD3qLfr0duStFWJqI8Qt9zKsd4+qetEZuzuFxZInppqfByJzrbVn2GIuy6EPWEoDvFeYbXlfP/HrHeELWzDWukvo4hNYf4xURammYL8OTb2BMwuMvo3E+jeI+Q3FmKgjOrT2i67anu5HefRU8k4Fr8zfCVA5yTx9o3OJ88L0KmbUWfKRNrWQxIbKX9YI5h6bGVf7v7wUzr2m77+J4Lr8LxjcsyZW2nbu7XS+ljLLEjK4hTz4EyOzP5TXz1ApNkOHHdRv1qCYNP4fuc8dMkzfK1zgLxJ22ZGsDRkfgyuR25NGuHLwprYzbk7h6WCrdGaQYkdcyrj7Gc9/6eqPXT2j+jeuW9Spw0bB9DZnr\",\"format\":\"xai-responses-v1\",\"id\":\"rs_b4dc092a-4e1a-fe73-3cbf-5c26404bf314\",\"index\":1}]}}],\"usage\":{\"prompt_tokens\":404,\"completion_tokens\":128,\"total_tokens\":532,\"cost\":0.0000983,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":310,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000983,\"upstream_inference_prompt_cost\":0.0000343,\"upstream_inference_completions_cost\":0.000064},\"completion_tokens_details\":{\"reasoning_tokens\":116,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.410118625s + duration: 1.742248792s diff --git a/providertests/testdata/TestOpenRouterCommon/grok/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/grok/tool_streaming.yaml index fb623d42f..bbc2b84ac 100644 --- a/providertests/testdata/TestOpenRouterCommon/grok/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/grok/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -30,47 +30,101 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.summary","summary":"The","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.summary","summary":"The","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"What's","reasoning_details":[{"type":"reasoning.summary","summary":"What's","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"What's","reasoning_details":[{"type":"reasoning.summary","summary":"What's","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.summary","summary":" weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.summary","summary":" weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.summary","summary":" Florence","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.summary","summary":" Florence","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.summary","summary":" Italy","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.summary","summary":" Italy","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"?\"\n","reasoning_details":[{"type":"reasoning.summary","summary":"?\"\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"?\"","reasoning_details":[{"type":"reasoning.summary","summary":"?\"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.summary","summary":" I","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" have","reasoning_details":[{"type":"reasoning.summary","summary":" have","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.summary","summary":" a","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" tool","reasoning_details":[{"type":"reasoning.summary","summary":" tool","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" called","reasoning_details":[{"type":"reasoning.summary","summary":" called","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"weather","reasoning_details":[{"type":"reasoning.summary","summary":"weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.summary","summary":"\"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" that","reasoning_details":[{"type":"reasoning.summary","summary":" that","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" gets","reasoning_details":[{"type":"reasoning.summary","summary":" gets","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.summary","summary":" weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" information","reasoning_details":[{"type":"reasoning.summary","summary":" information","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.summary","summary":" for","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.summary","summary":" a","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" location","reasoning_details":[{"type":"reasoning.summary","summary":" location","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.summary","summary":".","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.summary","summary":" The","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" parameter","reasoning_details":[{"type":"reasoning.summary","summary":" parameter","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.summary","summary":" is","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"location","reasoning_details":[{"type":"reasoning.summary","summary":"location","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\",","reasoning_details":[{"type":"reasoning.summary","summary":"\",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" which","reasoning_details":[{"type":"reasoning.summary","summary":" which","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.summary","summary":" is","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" city","reasoning_details":[{"type":"reasoning.summary","summary":" city","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n","reasoning_details":[{"type":"reasoning.summary","summary":".\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} : OPENROUTER PROCESSING : OPENROUTER PROCESSING - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"5uBosQPBhs9D25vCCXLRe3Yr2WsHcTdtJ7AejqLj5zOMDtq3zeq6bUPdLRLEPxXn1eRXQ0CcEMpS6ggaioAgDoayS1TLxz9ZaygXYdw4vzI59wUxVIcGXzv2cthtk9GH4ldrjxb3ym8oZGpscLQNiqog7ApXHQUtii7OUQZzOcv0GkaJFq3YBSR3h2W+ftb6JgcblJO9+Ycvbir0AU5+tMQZ0mHaqw2PI0y6J0pW/oibTRby05YHqTjEJBdcbb1VI7V1s36IAuaqrO57jP+HekRiAZ7HAjpcr7pQQZX707+DoCortutwSltkUsJSLRW3saOXvU4J3a8/+KWvRBtOv9M5LwKUzWqFAKTTZ0CqgYQnV5fsrmdLlU/g/RmntL2RDWWd5tW+8qc7DeAxCYZuIzdeeNSz5/OrB2MIAtfKrWtLtanLmD3xvcWa7YiPqY/dVvYkk5fa6s4TuyOC6YbGMhKmh8Bjx8SSjVNx8Mfm0M2dscZ/2pgx57zKlJ65YnmNnUoODE+3b5lNo0UfF2m+BsnfNSoc8Kp6V8jCcLTMx/NSMfdCiGVQw1GQEFod68o0gG1NJsVYg9HYLS7lHBlUSxZaXKW8O1kDmLXHEH6KXGC3/TDPKsNI0Mbo918aLK/4J3mKFq6CXa2aE1+rIjDLK1gii4r3S6mWITxvlsnPy1ls2T7ogsHxbcLXAn7JPEJ15JNULQnYVcv6RWEiMnEj66VWI3pSE8YwikTtyvzOpBC/upijPDXPaVDXrLzlZyYxEwmWLrPwxjRNkKxbKLJVX9q3iKGt4mWQyf/hgqw0XhqZjMxwWXpbjFiZ+wP0","format":"xai-responses-v1","id":"rs_36ac2fb0-b643-9ff6-9c38-0e5f2370316e","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"xtqOzzobQxuQwf0gkR6GjXXcuE0PDswutFF66xawFkpZ44ikgr2ohkmIilDl5sm4Mz775dN8sBR6zp25Zw8hgykyzQFqBYzmFdhnWAXcG9koU+WVetRL9/juCF2TM++QaYs4hLtsap9HwRd2OZvKbRxuy0f66+ocvythg3yQxSNnOZvhrH2grD/mZbS3CAFWcvz/4RlhPvXiWrh0FchzGZu4TNnmnYJconszRW941AqCFnqyabK/vuZZGtt/Xnp+aHr2gEPDKhnsZcp7WMF/xwRLf6cg1Mqs4TocmOAwpyC5FmeglsiDLLRR3LuGYY/3uuUGE18Ys09TH52mTbFyDFQjWEqIZT80HT23tNFlVySqRfyYwWrlKOHi0wjVa2pwlWQYa5E67sQZ3+dQHi+sPVsmf5AKiknRT9PScTcrRydyU37TXZHX8CYd8HqonNQNdLLAjmHzRu0YxG5Yxq1BT0Jtwlc2uT86R2mnTaxPaPzPVG7l4kHcGdgztboDpCIrMM+hkkd3cxuvNlZK1Nu2fVPF5jgodzCY4DPffVu5BItlBi7xAWozzZPXrGiWLe98EFvBomvpR9pjYhZDDa7CPUiCmZsw+1FhD0V/oULz+oop/miA2hadfRyReUsu7TjfkisC4ikmL1RQ3ZzUGiEsf8gRAggC5uzhqrqJCljiJrQEXbe7sVc2Q3yAYJ0SQ1WZw258Xy5pEUbvqjOq6cAY6n6Nyhpp6czm9aXAdx6LcTRFaZAunekALNg9K60cA4Y94gxfK8AsVIsb1053XWnFLNtUd8HpDd7d4LnTzvSUmxds","format":"xai-responses-v1","id":"rs_f4d7eb38-3078-6003-f459-ba491f4b7bb4","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_92320304","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_51659697","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence, Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location\":\"Florence, Italy\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945424-lojoN2TGtDYC77RNuNzX","object":"chat.completion.chunk","created":1773945424,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":366,"completion_tokens":159,"total_tokens":525,"cost":0.00009795,"is_byok":false,"prompt_tokens_details":{"cached_tokens":365,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00009795,"upstream_inference_prompt_cost":0.00001845,"upstream_inference_completions_cost":0.0000795},"completion_tokens_details":{"reasoning_tokens":133,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319845-fb1gRveeS1juYkq93kho","object":"chat.completion.chunk","created":1777319845,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":366,"completion_tokens":155,"total_tokens":521,"cost":0.00009595,"is_byok":false,"prompt_tokens_details":{"cached_tokens":365,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00009595,"upstream_inference_prompt_cost":0.00001845,"upstream_inference_completions_cost":0.0000775},"completion_tokens_details":{"reasoning_tokens":129,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -79,22 +133,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.534540833s + duration: 1.476046083s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 906 + content_length: 1035 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_92320304","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user asked: \"What''s the weather in Florence, Italy?\"\n","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_92320304","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_51659697","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user asked: \"What''s the weather in Florence, Italy?\" I have a tool called \"weather\" that gets weather information for a location. The parameter is \"location\", which is the city.\n","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"call_51659697","role":"tool"}],"model":"x-ai/grok-4.1-fast","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -109,67 +163,77 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"First","reasoning_details":[{"type":"reasoning.summary","summary":"First","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"First","reasoning_details":[{"type":"reasoning.summary","summary":"First","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.summary","summary":" user","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.summary","summary":" asked","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.summary","summary":":","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.summary","summary":" \"","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"What's","reasoning_details":[{"type":"reasoning.summary","summary":"What's","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"What's","reasoning_details":[{"type":"reasoning.summary","summary":"What's","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.summary","summary":" the","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.summary","summary":" weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.summary","summary":" weather","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.summary","summary":" in","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.summary","summary":" Florence","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.summary","summary":" Florence","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.summary","summary":",","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.summary","summary":" Italy","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.summary","summary":" Italy","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"?\"\n","reasoning_details":[{"type":"reasoning.summary","summary":"?\"\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"?\"\n","reasoning_details":[{"type":"reasoning.summary","summary":"?\"\n","format":"xai-responses-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} : OPENROUTER PROCESSING - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"Kgd/ltSG6oos788IuoplMMUPrgLdQhjMQy//6Sf+cILTh+bfOfT/Oc5AQ1ieQaBgAWAwkpPR0UxCQkH3flTaPdxSmGpJ1pg+JFmNZg781xwcbPCvyIOfshXknAC4zFJ5C5esDWLN9Ygeu7cvn1YW22JkhdTcA1Mq2S2byLJLZWAjEAl4JApm9JaIkB4I7yMFReuBFA701XVHeP/8TrIF7FAPODCA7lxokZoz9Qq6VheJVDv3NUx89QoKq2/YSkyhia3VP7xUIH2EwqIsUQP3FSciQIparif7GAcZjI9DuDYzFFoMYpJKDLMPcWee2E6RYuBg6Nc7Eyey8JbNymzCE9iY7yPwdc8yZPvEPdDCgjTnPAfEnl/zvPdTRGbux8XnYAPtplVMiD3Y8el/1dLNiBFepW31ruHQpihNZhVeEhw4dIQciufwgbz7CtK4h1Iw4+NIgIeKEan2oBDtIGdblRXNHx46nh3nHvgOwwxpb1ZT0kOokL5NpJNuYj8hr+1u8OFD73WtIGhC3UbNCIKVR1wbKrewVp+VCT2/JGpASkSWHvOCzwmKE/G8ivLnpXkMWk+ErsC6KIK3zV9n443uk1ZQUEMoYR4keRqVmKeqDLS9eVbK4mu4P6ji2RXxxzb0BJoaxUdN2vBLpPVFiImLyu3c0guPSR7I1kBVS2QsnAPpncWxEks5RxMzDbyXdaLNtJzuXJBqYymSefznfFVd8fxTbubox3khczTJ6GsrPzQOzds4wos7WrXXJgU03lOkMW3OiKY9zT6+RXj5uLtjSyPl5HzGi6zookbEw/yMs+IZFmCx3LwojD3QmA","format":"xai-responses-v1","id":"rs_bbd8b588-fa8b-9461-9830-2761a3e7dd2c","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null,"reasoning_details":[{"type":"reasoning.encrypted","data":"5hfPv6Rt/Qwout8tG3xxONWaJ5xHS+1OGQhs7hW7LDx7zdD3LTFQLJ5F+eS2vhePHc7Mo+21GG+P+Kp3jccN+gO2t8IhwA78p+zyuGflokqV1XK6d5ucFDvv9HNmtYQR78p0snQgbPGyOq/lQgOYB+Rjbg/PikAlosEjcQsIS5eWCsbUjIng3joM2WBboC2iyZIAvvS+vgJW3ijpkPSvLsoOL4zdKuPOs7GFigcDDqs0TZHk1x1hkoYM3C6se6Jn5cqnSTIbRzy7PSuKiNB/ms2qJcmEma3Ro4whAsnKj5GpwSFboAkkLLTksYJUg21wL/6lXPb165yqIYk8/yKbHfNaza9ETuaSk7epSwOGSZ6/o6yJ/4vTEmLn0Hn1+2CPGB88SSL6vCd5YYAYjBszle85yPa5B2RrCtBCfcQEz5YAEmr1ZrD0l9zj4+tdwCfCueb9hyPyLZuVCu0Y+352bb5tiVm2mjOcVW3JkB4AiBoUwnFCTN3RWCZWf4tWwkke9bxiu25X6Wu/8n5IqLvcszmGDK/ArPRSSGmAC47wOahZNu1oB/c4/vo5ZFpeem6tL1MUYFUR5TUpMRJM+4Kk","format":"xai-responses-v1","id":"rs_7dd9800b-267a-99bc-b265-8368ecd93de4","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"It's","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" weather","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" That's","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" pretty","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"—","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":" hydrated","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945427-mrMWA8NG6bOqqKVWUwzl","object":"chat.completion.chunk","created":1773945427,"model":"x-ai/grok-4.1-fast","provider":"xAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":404,"completion_tokens":139,"total_tokens":543,"cost":0.00008985,"is_byok":false,"prompt_tokens_details":{"cached_tokens":403,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00008985,"upstream_inference_prompt_cost":0.00002035,"upstream_inference_completions_cost":0.0000695},"completion_tokens_details":{"reasoning_tokens":127,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319848-SFQmKd8YTKr8xmSXFhpp","object":"chat.completion.chunk","created":1777319848,"model":"x-ai/grok-4.1-fast","provider":"xAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":404,"completion_tokens":111,"total_tokens":515,"cost":0.00007585,"is_byok":false,"prompt_tokens_details":{"cached_tokens":403,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00007585,"upstream_inference_prompt_cost":0.00002035,"upstream_inference_completions_cost":0.0000555},"completion_tokens_details":{"reasoning_tokens":94,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -178,4 +242,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.338549208s + duration: 1.850464875s diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool.yaml index 471521d98..78bb9f66a 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945487-Z5fhji1TROrj6AuM2H1y\",\"object\":\"chat.completion\",\"created\":1773945487,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"AtlasCloud\",\"system_fingerprint\":\"fpv0_e0c12c89\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":\"I'll add and multiply 2 and 3 for you at the same time.\",\"refusal\":null,\"reasoning\":\"The user wants me to add 2 and 3, and also multiply 2 and 3. The instructions say I must use both add and multiply at the same time ALWAYS. This means I should call both functions in the same function_calls block.\\n\\nLet me make both calls:\\n- add: a=2, b=3\\n- multiply: a=2, b=3\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"add:0\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"multiply:1\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants me to add 2 and 3, and also multiply 2 and 3. The instructions say I must use both add and multiply at the same time ALWAYS. This means I should call both functions in the same function_calls block.\\n\\nLet me make both calls:\\n- add: a=2, b=3\\n- multiply: a=2, b=3\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":128,\"completion_tokens\":130,\"total_tokens\":258,\"cost\":0.000402,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000402,\"upstream_inference_prompt_cost\":0.000064,\"upstream_inference_completions_cost\":0.000338},\"completion_tokens_details\":{\"reasoning_tokens\":72,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319909-67OLh0a5b54mA8BGe7CD\",\"object\":\"chat.completion\",\"created\":1777319909,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"Chutes\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\" The user wants me to add and multiply the numbers 2 and 3. According to the instructions, I must use both add and multiply at the same time ALWAYS. So I need to call both functions with a=2 and b=3.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"functions.add:0\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"functions.multiply:1\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" The user wants me to add and multiply the numbers 2 and 3. According to the instructions, I must use both add and multiply at the same time ALWAYS. So I need to call both functions with a=2 and b=3.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":129,\"completion_tokens\":86,\"total_tokens\":215,\"cost\":0.00022876,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00022876,\"upstream_inference_prompt_cost\":0.00005676,\"upstream_inference_completions_cost\":0.000172},\"completion_tokens_details\":{\"reasoning_tokens\":51,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.53507125s + duration: 2.166024875s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1623 + content_length: 1515 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"I''ll add and multiply 2 and 3 for you at the same time.","tool_calls":[{"id":"add:0","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"multiply:1","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user wants me to add 2 and 3, and also multiply 2 and 3. The instructions say I must use both add and multiply at the same time ALWAYS. This means I should call both functions in the same function_calls block.\n\nLet me make both calls:\n- add: a=2, b=3\n- multiply: a=2, b=3","type":"reasoning.text"}]},{"content":"5","tool_call_id":"add:0","role":"tool"},{"content":"6","tool_call_id":"multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"functions.add:0","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"functions.multiply:1","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" The user wants me to add and multiply the numbers 2 and 3. According to the instructions, I must use both add and multiply at the same time ALWAYS. So I need to call both functions with a=2 and b=3.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"functions.add:0","role":"tool"},{"content":"6","tool_call_id":"functions.multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945491-o5yp2dfHoW8YjgvpdrJn\",\"object\":\"chat.completion\",\"created\":1773945491,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"AtlasCloud\",\"system_fingerprint\":\"fpv0_e0c12c89\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Here are the results:\\n- **Addition**: 2 + 3 = **5**\\n- **Multiplication**: 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":\"Great! Both functions returned successfully:\\n- add(2, 3) = 5\\n- multiply(2, 3) = 6\\n\\nNow I should present these results clearly to the user.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"Great! Both functions returned successfully:\\n- add(2, 3) = 5\\n- multiply(2, 3) = 6\\n\\nNow I should present these results clearly to the user.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":288,\"completion_tokens\":77,\"total_tokens\":365,\"cost\":0.0003442,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0003442,\"upstream_inference_prompt_cost\":0.000144,\"upstream_inference_completions_cost\":0.0002002},\"completion_tokens_details\":{\"reasoning_tokens\":38,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319913-STjd2fkBWdjGqjsaTqzc\",\"object\":\"chat.completion\",\"created\":1777319913,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"Chutes\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\" Here are the results:\\n\\n**Addition:** 2 + 3 = **5**\\n\\n**Multiplication:** 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":\" The user asked to add and multiply 2 and 3. I called both functions as instructed by the critical instructions. The results are:\\n- Addition: 2 + 3 = 5\\n- Multiplication: 2 × 3 = 6\\n\\nI should provide both results to the user.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" The user asked to add and multiply 2 and 3. I called both functions as instructed by the critical instructions. The results are:\\n- Addition: 2 + 3 = 5\\n- Multiplication: 2 × 3 = 6\\n\\nI should provide both results to the user.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":201,\"completion_tokens\":94,\"total_tokens\":295,\"cost\":0.00027644,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00027644,\"upstream_inference_prompt_cost\":0.00008844,\"upstream_inference_completions_cost\":0.000188},\"completion_tokens_details\":{\"reasoning_tokens\":63,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.54386325s + duration: 1.966160458s diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool_streaming.yaml index f3a686588..a44ade323 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -32,239 +32,171 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" numbers","reasoning_details":[{"type":"reasoning.text","text":" numbers","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" numbers","reasoning_details":[{"type":"reasoning.text","text":" numbers","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" According","reasoning_details":[{"type":"reasoning.text","text":" According","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Since","reasoning_details":[{"type":"reasoning.text","text":" Since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" my","reasoning_details":[{"type":"reasoning.text","text":" my","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" system","reasoning_details":[{"type":"reasoning.text","text":" system","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" instructions","reasoning_details":[{"type":"reasoning.text","text":" instructions","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" prompt","reasoning_details":[{"type":"reasoning.text","text":" prompt","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" says","reasoning_details":[{"type":"reasoning.text","text":" says","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Always","reasoning_details":[{"type":"reasoning.text","text":"Always","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.text","text":" use","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.text","text":" use","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" `","reasoning_details":[{"type":"reasoning.text","text":" `","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"add","reasoning_details":[{"type":"reasoning.text","text":"add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"`","reasoning_details":[{"type":"reasoning.text","text":"`","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" at","reasoning_details":[{"type":"reasoning.text","text":" at","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" `","reasoning_details":[{"type":"reasoning.text","text":" `","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"multiply","reasoning_details":[{"type":"reasoning.text","text":"multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.text","text":" same","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"`","reasoning_details":[{"type":"reasoning.text","text":"`","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" time","reasoning_details":[{"type":"reasoning.text","text":" time","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" at","reasoning_details":[{"type":"reasoning.text","text":" at","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",\"","reasoning_details":[{"type":"reasoning.text","text":",\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.text","text":" same","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" time","reasoning_details":[{"type":"reasoning.text","text":" time","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" make","reasoning_details":[{"type":"reasoning.text","text":" make","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Since","reasoning_details":[{"type":"reasoning.text","text":" Since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" these","reasoning_details":[{"type":"reasoning.text","text":" these","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" calls","reasoning_details":[{"type":"reasoning.text","text":" calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" together","reasoning_details":[{"type":"reasoning.text","text":" together","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" independent","reasoning_details":[{"type":"reasoning.text","text":" independent","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" calls","reasoning_details":[{"type":"reasoning.text","text":" calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" can","reasoning_details":[{"type":"reasoning.text","text":" can","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" make","reasoning_details":[{"type":"reasoning.text","text":" make","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" can","reasoning_details":[{"type":"reasoning.text","text":" can","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" calls","reasoning_details":[{"type":"reasoning.text","text":" calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" make","reasoning_details":[{"type":"reasoning.text","text":" make","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" them","reasoning_details":[{"type":"reasoning.text","text":" them","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.text","text":" same","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" same","reasoning_details":[{"type":"reasoning.text","text":" same","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"_calls","reasoning_details":[{"type":"reasoning.text","text":"_calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" block","reasoning_details":[{"type":"reasoning.text","text":" block","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"_calls","reasoning_details":[{"type":"reasoning.text","text":"_calls","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" since","reasoning_details":[{"type":"reasoning.text","text":" since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" block","reasoning_details":[{"type":"reasoning.text","text":" block","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" they","reasoning_details":[{"type":"reasoning.text","text":" they","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"functions.add:0","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" independent","reasoning_details":[{"type":"reasoning.text","text":" independent","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" of","reasoning_details":[{"type":"reasoning.text","text":" of","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" each","reasoning_details":[{"type":"reasoning.text","text":" each","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" other","reasoning_details":[{"type":"reasoning.text","text":" other","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"2"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Let","reasoning_details":[{"type":"reasoning.text","text":"Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" call","reasoning_details":[{"type":"reasoning.text","text":" call","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"b"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":\n","reasoning_details":[{"type":"reasoning.text","text":":\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"1","reasoning_details":[{"type":"reasoning.text","text":"1","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"3"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"functions.multiply:1","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"=","reasoning_details":[{"type":"reasoning.text","text":"=","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" b","reasoning_details":[{"type":"reasoning.text","text":" b","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"2"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"=","reasoning_details":[{"type":"reasoning.text","text":"=","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n","reasoning_details":[{"type":"reasoning.text","text":"\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"b"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"=","reasoning_details":[{"type":"reasoning.text","text":"=","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" b","reasoning_details":[{"type":"reasoning.text","text":" b","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"=","reasoning_details":[{"type":"reasoning.text","text":"=","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"add:0","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"2"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"b"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"3"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"3"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"multiply:1","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"2"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"b"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" "}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"3"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - - data: {"id":"gen-1773945494-D12sIVylmicjqxKq2N2V","object":"chat.completion.chunk","created":1773945494,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":124,"completion_tokens":130,"total_tokens":254,"cost":0.0004,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0004,"upstream_inference_prompt_cost":0.000062,"upstream_inference_completions_cost":0.000338},"completion_tokens_details":{"reasoning_tokens":90,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319918-UVrg0z9Yj2HXXL5dYZY3","object":"chat.completion.chunk","created":1777319918,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":125,"completion_tokens":97,"total_tokens":222,"cost":0.00023492,"is_byok":false,"prompt_tokens_details":{"cached_tokens":64,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00023492,"upstream_inference_prompt_cost":0.00004092,"upstream_inference_completions_cost":0.000194},"completion_tokens_details":{"reasoning_tokens":56,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -273,22 +205,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.739090375s + duration: 2.001517208s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1669 + content_length: 1595 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"add:0","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"multiply:1","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants me to both add and multiply the numbers 2 and 3. Since the system prompt says \"Always use both add and multiply at the same time,\" I should make both function calls together. I can make both calls in the same function_calls block since they are independent of each other.\n\nLet me call:\n1. add with a=2, b=3\n2. multiply with a=2, b=3","type":"reasoning.text"}]},{"content":"5","tool_call_id":"add:0","role":"tool"},{"content":"6","tool_call_id":"multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"functions.add:0","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"functions.multiply:1","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user wants me to add and multiply the numbers 2 and 3. According to my instructions, I should use both `add` and `multiply` at the same time. Since these are independent function calls, I can make them in the same function_calls block.","type":"reasoning.text"}]},{"content":"5","tool_call_id":"functions.add:0","role":"tool"},{"content":"6","tool_call_id":"functions.multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -305,161 +237,169 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + : OPENROUTER PROCESSING + + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Here","reasoning_details":[{"type":"reasoning.text","text":" Here","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" results","reasoning_details":[{"type":"reasoning.text","text":" results","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" results","reasoning_details":[{"type":"reasoning.text","text":" results","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" are","reasoning_details":[{"type":"reasoning.text","text":" are","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":\n","reasoning_details":[{"type":"reasoning.text","text":":\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"-","reasoning_details":[{"type":"reasoning.text","text":"-","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" number","reasoning_details":[{"type":"reasoning.text","text":" number","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" add","reasoning_details":[{"type":"reasoning.text","text":" add","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"(","reasoning_details":[{"type":"reasoning.text","text":"(","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":\n","reasoning_details":[{"type":"reasoning.text","text":":\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":")","reasoning_details":[{"type":"reasoning.text","text":")","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"-","reasoning_details":[{"type":"reasoning.text","text":"-","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" =","reasoning_details":[{"type":"reasoning.text","text":" =","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Addition","reasoning_details":[{"type":"reasoning.text","text":" Addition","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"5","reasoning_details":[{"type":"reasoning.text","text":"5","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n","reasoning_details":[{"type":"reasoning.text","text":"\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"-","reasoning_details":[{"type":"reasoning.text","text":"-","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" +","reasoning_details":[{"type":"reasoning.text","text":" +","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" multiply","reasoning_details":[{"type":"reasoning.text","text":" multiply","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"(","reasoning_details":[{"type":"reasoning.text","text":"(","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" =","reasoning_details":[{"type":"reasoning.text","text":" =","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"5","reasoning_details":[{"type":"reasoning.text","text":"5","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**\n","reasoning_details":[{"type":"reasoning.text","text":"**\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":")","reasoning_details":[{"type":"reasoning.text","text":")","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"-","reasoning_details":[{"type":"reasoning.text","text":"-","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" =","reasoning_details":[{"type":"reasoning.text","text":" =","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Multi","reasoning_details":[{"type":"reasoning.text","text":" Multi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"plication","reasoning_details":[{"type":"reasoning.text","text":"plication","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"6","reasoning_details":[{"type":"reasoning.text","text":"6","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":","reasoning_details":[{"type":"reasoning.text","text":":","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n\n","reasoning_details":[{"type":"reasoning.text","text":"\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Now","reasoning_details":[{"type":"reasoning.text","text":"Now","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I'll","reasoning_details":[{"type":"reasoning.text","text":" I'll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ×","reasoning_details":[{"type":"reasoning.text","text":" ×","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" present","reasoning_details":[{"type":"reasoning.text","text":" present","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" both","reasoning_details":[{"type":"reasoning.text","text":" both","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" results","reasoning_details":[{"type":"reasoning.text","text":" results","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" =","reasoning_details":[{"type":"reasoning.text","text":" =","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" **","reasoning_details":[{"type":"reasoning.text","text":" **","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"6","reasoning_details":[{"type":"reasoning.text","text":"6","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"**","reasoning_details":[{"type":"reasoning.text","text":"**","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" are","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" are","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" results","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" results","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" for","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" both","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" number","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" operations","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" with","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":":\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":":\n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":":**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"**\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"**\n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Multi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"Multi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"plication","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"plication","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":":**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ×","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ×","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} - data: {"id":"gen-1773945499-wdUZpq3oZjiJdv456bk6","object":"chat.completion.chunk","created":1773945499,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":283,"completion_tokens":79,"total_tokens":362,"cost":0.0003469,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0003469,"upstream_inference_prompt_cost":0.0001415,"upstream_inference_completions_cost":0.0002054},"completion_tokens_details":{"reasoning_tokens":28,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319923-bvSEJKYMVn3eEnfo6Cry","object":"chat.completion.chunk","created":1777319923,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":197,"completion_tokens":80,"total_tokens":277,"cost":0.00024668,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00024668,"upstream_inference_prompt_cost":0.00008668,"upstream_inference_completions_cost":0.00016},"completion_tokens_details":{"reasoning_tokens":39,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -468,4 +408,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.735594375s + duration: 2.746493s diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/simple.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/simple.yaml index 154e227b3..8ba5385bc 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945463-7UlWQThJCoBvROqhlOiT\",\"object\":\"chat.completion\",\"created\":1773945463,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"AtlasCloud\",\"system_fingerprint\":\"fpv0_e0c12c89\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Oi! (or \\\"Olá!\\\")\\n\\nBoth are common ways to say \\\"hi\\\" in Portuguese:\\n- **Oi** - Very informal and widely used in Brazil\\n- **Olá** - Slightly more formal, used in both Brazil and Portugal\",\"refusal\":null,\"reasoning\":\"The user wants me to say \\\"hi\\\" in Portuguese. The most common way to say \\\"hi\\\" in Portuguese is \\\"Oi\\\" (informal) or \\\"Olá\\\" (slightly more formal but still common). I should provide both options to be helpful, as they are both widely used.\\n\\n \\\"Oi\\\" is very casual and common in Brazil.\\n \\\"Olá\\\" is also common and works in both Brazil and Portugal.\\n\\n I'll provide the main greeting and perhaps mention the context.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user wants me to say \\\"hi\\\" in Portuguese. The most common way to say \\\"hi\\\" in Portuguese is \\\"Oi\\\" (informal) or \\\"Olá\\\" (slightly more formal but still common). I should provide both options to be helpful, as they are both widely used.\\n\\n \\\"Oi\\\" is very casual and common in Brazil.\\n \\\"Olá\\\" is also common and works in both Brazil and Portugal.\\n\\n I'll provide the main greeting and perhaps mention the context.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":20,\"completion_tokens\":152,\"total_tokens\":172,\"cost\":0.0004052,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0004052,\"upstream_inference_prompt_cost\":0.00001,\"upstream_inference_completions_cost\":0.0003952},\"completion_tokens_details\":{\"reasoning_tokens\":107,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319885-pLuUvaQdB3l6lRlhlKuv\",\"object\":\"chat.completion\",\"created\":1777319885,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"Inceptron\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\" Oi! \\n\\n(You can also say **\\\"Olá\\\"** – it's slightly more formal, while \\\"Oi\\\" is casual and very common in both Brazil and Portugal.)\",\"refusal\":null,\"reasoning\":\" The user wants me to say \\\"hi\\\" in Portuguese. \\n\\nThe most common way to say \\\"hi\\\" in Portuguese is \\\"Oi\\\" (pronounced like \\\"oy\\\" in English). \\n\\nOther options include:\\n- \\\"Olá\\\" (more formal, pronounced \\\"oh-LAH\\\")\\n- \\\"E aí?\\\" (informal, like \\\"what's up\\\")\\n- \\\"Tudo bem?\\\" (how are you/what's up)\\n\\nBut the simplest and most direct translation for \\\"hi\\\" is \\\"Oi\\\" or \\\"Olá\\\".\\n\\nI'll provide the most common greeting \\\"Oi\\\" and maybe mention \\\"Olá\\\" as an alternative since it's also very common.\\n\\nResponse should be:\\n- \\\"Oi\\\" (primary)\\n- Maybe mention \\\"Olá\\\" as a slightly more formal alternative\\n\\nKeep it simple and helpful.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" The user wants me to say \\\"hi\\\" in Portuguese. \\n\\nThe most common way to say \\\"hi\\\" in Portuguese is \\\"Oi\\\" (pronounced like \\\"oy\\\" in English). \\n\\nOther options include:\\n- \\\"Olá\\\" (more formal, pronounced \\\"oh-LAH\\\")\\n- \\\"E aí?\\\" (informal, like \\\"what's up\\\")\\n- \\\"Tudo bem?\\\" (how are you/what's up)\\n\\nBut the simplest and most direct translation for \\\"hi\\\" is \\\"Oi\\\" or \\\"Olá\\\".\\n\\nI'll provide the most common greeting \\\"Oi\\\" and maybe mention \\\"Olá\\\" as an alternative since it's also very common.\\n\\nResponse should be:\\n- \\\"Oi\\\" (primary)\\n- Maybe mention \\\"Olá\\\" as a slightly more formal alternative\\n\\nKeep it simple and helpful.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":21,\"completion_tokens\":202,\"total_tokens\":223,\"cost\":0.00045364,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00045364,\"upstream_inference_prompt_cost\":0.00000924,\"upstream_inference_completions_cost\":0.0004444},\"completion_tokens_details\":{\"reasoning_tokens\":166,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.810134833s + duration: 1.015887208s diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/simple_streaming.yaml index 79e229212..b58e931d7 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -26,399 +26,141 @@ interactions: body: |+ : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" wants","reasoning_details":[{"type":"reasoning.text","text":" wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" say","reasoning_details":[{"type":"reasoning.text","text":" say","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"hi","reasoning_details":[{"type":"reasoning.text","text":"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most","reasoning_details":[{"type":"reasoning.text","text":" most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" way","reasoning_details":[{"type":"reasoning.text","text":" way","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" say","reasoning_details":[{"type":"reasoning.text","text":" say","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" hi","reasoning_details":[{"type":"reasoning.text","text":" hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\".","reasoning_details":[{"type":"reasoning.text","text":"\".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \n\n","reasoning_details":[{"type":"reasoning.text","text":" \n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" more","reasoning_details":[{"type":"reasoning.text","text":" more","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" formal","reasoning_details":[{"type":"reasoning.text","text":" formal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" universal","reasoning_details":[{"type":"reasoning.text","text":" universal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" across","reasoning_details":[{"type":"reasoning.text","text":" across","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese","reasoning_details":[{"type":"reasoning.text","text":" Portuguese","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"-speaking","reasoning_details":[{"type":"reasoning.text","text":"-speaking","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" countries","reasoning_details":[{"type":"reasoning.text","text":" countries","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" (","reasoning_details":[{"type":"reasoning.text","text":" (","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Port","reasoning_details":[{"type":"reasoning.text","text":"Port","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ugal","reasoning_details":[{"type":"reasoning.text","text":"ugal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Brazil","reasoning_details":[{"type":"reasoning.text","text":" Brazil","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Angola","reasoning_details":[{"type":"reasoning.text","text":" Angola","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" etc","reasoning_details":[{"type":"reasoning.text","text":" etc","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".).\n","reasoning_details":[{"type":"reasoning.text","text":".).\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very","reasoning_details":[{"type":"reasoning.text","text":" very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Brazil","reasoning_details":[{"type":"reasoning.text","text":" Brazil","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" but","reasoning_details":[{"type":"reasoning.text","text":" but","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" might","reasoning_details":[{"type":"reasoning.text","text":" might","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" be","reasoning_details":[{"type":"reasoning.text","text":" be","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" considered","reasoning_details":[{"type":"reasoning.text","text":" considered","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" less","reasoning_details":[{"type":"reasoning.text","text":" less","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" formal","reasoning_details":[{"type":"reasoning.text","text":" formal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" even","reasoning_details":[{"type":"reasoning.text","text":" even","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" rude","reasoning_details":[{"type":"reasoning.text","text":" rude","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" some","reasoning_details":[{"type":"reasoning.text","text":" some","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" contexts","reasoning_details":[{"type":"reasoning.text","text":" contexts","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portugal","reasoning_details":[{"type":"reasoning.text","text":" Portugal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Since","reasoning_details":[{"type":"reasoning.text","text":"Since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" just","reasoning_details":[{"type":"reasoning.text","text":" just","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked","reasoning_details":[{"type":"reasoning.text","text":" asked","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" simple","reasoning_details":[{"type":"reasoning.text","text":" simple","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" greeting","reasoning_details":[{"type":"reasoning.text","text":" greeting","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide","reasoning_details":[{"type":"reasoning.text","text":" provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most","reasoning_details":[{"type":"reasoning.text","text":" most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" options","reasoning_details":[{"type":"reasoning.text","text":" options","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" brief","reasoning_details":[{"type":"reasoning.text","text":" brief","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" context","reasoning_details":[{"type":"reasoning.text","text":" context","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" about","reasoning_details":[{"type":"reasoning.text","text":" about","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" usage","reasoning_details":[{"type":"reasoning.text","text":" usage","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".\n\n","reasoning_details":[{"type":"reasoning.text","text":".\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Options","reasoning_details":[{"type":"reasoning.text","text":"Options","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":":\n","reasoning_details":[{"type":"reasoning.text","text":":\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"1","reasoning_details":[{"type":"reasoning.text","text":"1","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" -","reasoning_details":[{"type":"reasoning.text","text":" -","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" universal","reasoning_details":[{"type":"reasoning.text","text":" universal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" formal","reasoning_details":[{"type":"reasoning.text","text":" formal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"/in","reasoning_details":[{"type":"reasoning.text","text":"/in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"form","reasoning_details":[{"type":"reasoning.text","text":"form","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"al","reasoning_details":[{"type":"reasoning.text","text":"al","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n","reasoning_details":[{"type":"reasoning.text","text":"\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"2","reasoning_details":[{"type":"reasoning.text","text":"2","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" -","reasoning_details":[{"type":"reasoning.text","text":" -","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very","reasoning_details":[{"type":"reasoning.text","text":" very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common","reasoning_details":[{"type":"reasoning.text","text":" common","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Brazil","reasoning_details":[{"type":"reasoning.text","text":" Brazil","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" informal","reasoning_details":[{"type":"reasoning.text","text":" informal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n","reasoning_details":[{"type":"reasoning.text","text":"\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user wants","reasoning_details":[{"type":"reasoning.text","text":" user wants","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"3","reasoning_details":[{"type":"reasoning.text","text":"3","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me to say","reasoning_details":[{"type":"reasoning.text","text":" me to say","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"hi\" in","reasoning_details":[{"type":"reasoning.text","text":" \"hi\" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese. \n\n","reasoning_details":[{"type":"reasoning.text","text":" Portuguese. \n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Al","reasoning_details":[{"type":"reasoning.text","text":"Al","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"In","reasoning_details":[{"type":"reasoning.text","text":"In","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ô","reasoning_details":[{"type":"reasoning.text","text":"ô","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Portuguese, the most","reasoning_details":[{"type":"reasoning.text","text":" Portuguese, the most","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" common ways","reasoning_details":[{"type":"reasoning.text","text":" common ways","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" -","reasoning_details":[{"type":"reasoning.text","text":" -","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to say \"hi","reasoning_details":[{"type":"reasoning.text","text":" to say \"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" used","reasoning_details":[{"type":"reasoning.text","text":" used","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" are:\n-","reasoning_details":[{"type":"reasoning.text","text":"\" are:\n-","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" when","reasoning_details":[{"type":"reasoning.text","text":" when","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"Oi","reasoning_details":[{"type":"reasoning.text","text":" \"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" answering","reasoning_details":[{"type":"reasoning.text","text":" answering","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" -","reasoning_details":[{"type":"reasoning.text","text":"\" -","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" phones","reasoning_details":[{"type":"reasoning.text","text":" phones","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" most common and informal","reasoning_details":[{"type":"reasoning.text","text":" most common and informal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n\n","reasoning_details":[{"type":"reasoning.text","text":"\n\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"I'll","reasoning_details":[{"type":"reasoning.text","text":"I'll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" used in Brazil","reasoning_details":[{"type":"reasoning.text","text":" used in Brazil","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide","reasoning_details":[{"type":"reasoning.text","text":" provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n- \"Ol","reasoning_details":[{"type":"reasoning.text","text":"\n- \"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á\" - more","reasoning_details":[{"type":"reasoning.text","text":"á\" - more","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Ol","reasoning_details":[{"type":"reasoning.text","text":"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" formal,","reasoning_details":[{"type":"reasoning.text","text":" formal,","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á","reasoning_details":[{"type":"reasoning.text","text":"á","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" used in both Brazil","reasoning_details":[{"type":"reasoning.text","text":" used in both Brazil","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and Portugal","reasoning_details":[{"type":"reasoning.text","text":" and Portugal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n- \"E","reasoning_details":[{"type":"reasoning.text","text":"\n- \"E","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" primary","reasoning_details":[{"type":"reasoning.text","text":" primary","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"í","reasoning_details":[{"type":"reasoning.text","text":"í","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" answer","reasoning_details":[{"type":"reasoning.text","text":" answer","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" - very","reasoning_details":[{"type":"reasoning.text","text":"\" - very","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and","reasoning_details":[{"type":"reasoning.text","text":" and","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" informal Brazilian","reasoning_details":[{"type":"reasoning.text","text":" informal Brazilian","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" mention","reasoning_details":[{"type":"reasoning.text","text":" mention","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" slang\n","reasoning_details":[{"type":"reasoning.text","text":" slang\n","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"- \"Al","reasoning_details":[{"type":"reasoning.text","text":"- \"Al","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ô","reasoning_details":[{"type":"reasoning.text","text":"ô","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" - used","reasoning_details":[{"type":"reasoning.text","text":"\" - used","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" when answering","reasoning_details":[{"type":"reasoning.text","text":" when answering","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Brazilian","reasoning_details":[{"type":"reasoning.text","text":" Brazilian","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" phone\n\nThe","reasoning_details":[{"type":"reasoning.text","text":" phone\n\nThe","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" alternative","reasoning_details":[{"type":"reasoning.text","text":" alternative","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" safest","reasoning_details":[{"type":"reasoning.text","text":" safest","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and most universal","reasoning_details":[{"type":"reasoning.text","text":" and most universal","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Ol","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" answer is \"Oi","reasoning_details":[{"type":"reasoning.text","text":" answer is \"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"á","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" or \"Ol","reasoning_details":[{"type":"reasoning.text","text":"\" or \"Ol","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"á\". Since the","reasoning_details":[{"type":"reasoning.text","text":"á\". Since the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" \n\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user just","reasoning_details":[{"type":"reasoning.text","text":" user just","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"(","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asked for \"hi","reasoning_details":[{"type":"reasoning.text","text":" asked for \"hi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"You","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\",","reasoning_details":[{"type":"reasoning.text","text":"\",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" can","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I should provide","reasoning_details":[{"type":"reasoning.text","text":" I should provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" also","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the most common translation","reasoning_details":[{"type":"reasoning.text","text":" the most common translation","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" say","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" which is \"Oi","reasoning_details":[{"type":"reasoning.text","text":" which is \"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\",","reasoning_details":[{"type":"reasoning.text","text":"\",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"\"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" but I could also","reasoning_details":[{"type":"reasoning.text","text":" but I could also","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Oi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" mention \"Olá","reasoning_details":[{"type":"reasoning.text","text":" mention \"Olá","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"\"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" as an alternative","reasoning_details":[{"type":"reasoning.text","text":"\" as an alternative","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" since","reasoning_details":[{"type":"reasoning.text","text":" since","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" —","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" it's also","reasoning_details":[{"type":"reasoning.text","text":" it's also","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" it's","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" very common.\n\nI'll","reasoning_details":[{"type":"reasoning.text","text":" very common.\n\nI'll","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" very","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide \"","reasoning_details":[{"type":"reasoning.text","text":" provide \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" common","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Oi","reasoning_details":[{"type":"reasoning.text","text":"Oi","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" as the primary","reasoning_details":[{"type":"reasoning.text","text":"\" as the primary","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" Brazil","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" answer,","reasoning_details":[{"type":"reasoning.text","text":" answer,","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" and maybe mention \"","reasoning_details":[{"type":"reasoning.text","text":" and maybe mention \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" while","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Olá\" as","reasoning_details":[{"type":"reasoning.text","text":"Olá\" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" \"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" well for completeness.","reasoning_details":[{"type":"reasoning.text","text":" well for completeness.","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"Ol","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"á","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":" Oi","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"\"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"! (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"Or","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" used","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":" \"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" everywhere","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"Olá!\"","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" including","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" Portugal","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":" is slightly","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":".)","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":" more formal)","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} - data: {"id":"gen-1773945469-FtJ6MUMrMYVVCPM0WAxk","object":"chat.completion.chunk","created":1773945469,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":20,"completion_tokens":196,"total_tokens":216,"cost":0.00051138,"is_byok":false,"prompt_tokens_details":{"cached_tokens":20,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00051138,"upstream_inference_prompt_cost":0.00000178,"upstream_inference_completions_cost":0.0005096},"completion_tokens_details":{"reasoning_tokens":179,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319889-qNPs6PR0SRru1d3CzVF1","object":"chat.completion.chunk","created":1777319889,"model":"moonshotai/kimi-k2.5-0127","provider":"ModelRun","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":21,"completion_tokens":173,"total_tokens":194,"cost":0.0005738,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0005738,"upstream_inference_prompt_cost":0.00001155,"upstream_inference_completions_cost":0.00056225},"completion_tokens_details":{"reasoning_tokens":165,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -427,4 +169,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.50860425s + duration: 785.247875ms diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/tool.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/tool.yaml index d0a8ad2b1..c43708574 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945474-wNsrLiYYBQCYV4b1kI2A\",\"object\":\"chat.completion\",\"created\":1773945474,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"AtlasCloud\",\"system_fingerprint\":\"fpv0_e0c12c89\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user is asking for the weather in Florence, Italy. I have a weather function available that can get weather information for a location. Let me call this function with \\\"Florence\\\" as the location parameter.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"weather:0\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user is asking for the weather in Florence, Italy. I have a weather function available that can get weather information for a location. Let me call this function with \\\"Florence\\\" as the location parameter.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":68,\"completion_tokens\":63,\"total_tokens\":131,\"cost\":0.0001978,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0001978,\"upstream_inference_prompt_cost\":0.000034,\"upstream_inference_completions_cost\":0.0001638},\"completion_tokens_details\":{\"reasoning_tokens\":52,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319891-AbXaksK95wX8kHwAXxXX\",\"object\":\"chat.completion\",\"created\":1777319891,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"Chutes\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\" The user is asking for the weather in Florence, Italy. I have a weather function available that takes a location parameter (which should be the city). I should call the weather function with \\\"Florence\\\" as the location.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"functions.weather:0\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" The user is asking for the weather in Florence, Italy. I have a weather function available that takes a location parameter (which should be the city). I should call the weather function with \\\"Florence\\\" as the location.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":69,\"completion_tokens\":66,\"total_tokens\":135,\"cost\":0.00016236,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00016236,\"upstream_inference_prompt_cost\":0.00003036,\"upstream_inference_completions_cost\":0.000132},\"completion_tokens_details\":{\"reasoning_tokens\":47,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.511454666s + duration: 1.915256958s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 990 + content_length: 1021 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"weather:0","function":{"arguments":"{\"location\": \"Florence\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":"The user is asking for the weather in Florence, Italy. I have a weather function available that can get weather information for a location. Let me call this function with \"Florence\" as the location parameter.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" The user is asking for the weather in Florence, Italy. I have a weather function available that takes a location parameter (which should be the city). I should call the weather function with \"Florence\" as the location.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945477-C1KeaZT0KsADVIvgsAAz\",\"object\":\"chat.completion\",\"created\":1773945477,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"AtlasCloud\",\"system_fingerprint\":\"fpv0_e0c12c89\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**. That's very hot! Make sure to stay hydrated and seek shade if you're visiting the city today.\",\"refusal\":null,\"reasoning\":\"The weather function returned 40 C, which is 40 degrees Celsius. That's quite hot! Let me present this information to the user in a helpful way.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The weather function returned 40 C, which is 40 degrees Celsius. That's quite hot! Let me present this information to the user in a helpful way.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":150,\"completion_tokens\":70,\"total_tokens\":220,\"cost\":0.000257,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000257,\"upstream_inference_prompt_cost\":0.000075,\"upstream_inference_completions_cost\":0.000182},\"completion_tokens_details\":{\"reasoning_tokens\":36,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319895-NVPGjsD98YPuLRBFo9BH\",\"object\":\"chat.completion\",\"created\":1777319895,\"model\":\"moonshotai/kimi-k2.5-0127\",\"provider\":\"Chutes\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\" The weather in Florence, Italy is currently **40°C** (104°F). That's quite hot!\",\"refusal\":null,\"reasoning\":\" The weather in Florence, Italy is currently 40°C. That's quite hot - about 104°F. This seems like it might be unusually warm weather for Florence, possibly during a heat wave or in the peak of summer.\",\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\" The weather in Florence, Italy is currently 40°C. That's quite hot - about 104°F. This seems like it might be unusually warm weather for Florence, possibly during a heat wave or in the peak of summer.\",\"format\":\"unknown\",\"index\":0}]}}],\"usage\":{\"prompt_tokens\":108,\"completion_tokens\":67,\"total_tokens\":175,\"cost\":0.00018152,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00018152,\"upstream_inference_prompt_cost\":0.00004752,\"upstream_inference_completions_cost\":0.000134},\"completion_tokens_details\":{\"reasoning_tokens\":46,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.538264458s + duration: 1.689790958s diff --git a/providertests/testdata/TestOpenRouterCommon/kimi/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/kimi/tool_streaming.yaml index 2b927fe97..36db8e985 100644 --- a/providertests/testdata/TestOpenRouterCommon/kimi/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/kimi/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,107 +28,157 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asking","reasoning_details":[{"type":"reasoning.text","text":" asking","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" asking","reasoning_details":[{"type":"reasoning.text","text":" asking","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.text","text":" Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.text","text":" Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" have","reasoning_details":[{"type":"reasoning.text","text":" have","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.text","text":" use","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" `","reasoning_details":[{"type":"reasoning.text","text":" `","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"weather","reasoning_details":[{"type":"reasoning.text","text":"weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"`","reasoning_details":[{"type":"reasoning.text","text":"`","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" that","reasoning_details":[{"type":"reasoning.text","text":" that","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" takes","reasoning_details":[{"type":"reasoning.text","text":" takes","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" get","reasoning_details":[{"type":"reasoning.text","text":" get","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" this","reasoning_details":[{"type":"reasoning.text","text":" this","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" `","reasoning_details":[{"type":"reasoning.text","text":" `","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" information","reasoning_details":[{"type":"reasoning.text","text":" information","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"location","reasoning_details":[{"type":"reasoning.text","text":"location","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"`","reasoning_details":[{"type":"reasoning.text","text":"`","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" parameter","reasoning_details":[{"type":"reasoning.text","text":" parameter","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" need","reasoning_details":[{"type":"reasoning.text","text":" need","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" which","reasoning_details":[{"type":"reasoning.text","text":" which","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" pass","reasoning_details":[{"type":"reasoning.text","text":" pass","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" city","reasoning_details":[{"type":"reasoning.text","text":" city","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Fl","reasoning_details":[{"type":"reasoning.text","text":"Fl","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" name","reasoning_details":[{"type":"reasoning.text","text":" name","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ore","reasoning_details":[{"type":"reasoning.text","text":"ore","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"nce","reasoning_details":[{"type":"reasoning.text","text":"nce","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" call","reasoning_details":[{"type":"reasoning.text","text":" call","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" this","reasoning_details":[{"type":"reasoning.text","text":" this","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with","reasoning_details":[{"type":"reasoning.text","text":" with","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Fl","reasoning_details":[{"type":"reasoning.text","text":"Fl","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ore","reasoning_details":[{"type":"reasoning.text","text":"ore","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"nce","reasoning_details":[{"type":"reasoning.text","text":"nce","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" or","reasoning_details":[{"type":"reasoning.text","text":" or","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Fl","reasoning_details":[{"type":"reasoning.text","text":"Fl","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"ore","reasoning_details":[{"type":"reasoning.text","text":"ore","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"nce","reasoning_details":[{"type":"reasoning.text","text":"nce","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" location","reasoning_details":[{"type":"reasoning.text","text":" location","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Italy","reasoning_details":[{"type":"reasoning.text","text":"Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" parameter","reasoning_details":[{"type":"reasoning.text","text":" parameter","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\"","reasoning_details":[{"type":"reasoning.text","text":"\"","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as the location","reasoning_details":[{"type":"reasoning.text","text":" as the location","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"weather:0","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" use","reasoning_details":[{"type":"reasoning.text","text":" use","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Fl"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" location","reasoning_details":[{"type":"reasoning.text","text":" location","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ore"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provided","reasoning_details":[{"type":"reasoning.text","text":" provided","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"nce"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" by","reasoning_details":[{"type":"reasoning.text","text":" by","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945481-OpjMSaZdXKWarQh8IgjM","object":"chat.completion.chunk","created":1773945481,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":68,"completion_tokens":57,"total_tokens":125,"cost":0.000154252,"is_byok":false,"prompt_tokens_details":{"cached_tokens":68,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000154252,"upstream_inference_prompt_cost":0.000006052,"upstream_inference_completions_cost":0.0001482},"completion_tokens_details":{"reasoning_tokens":42,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"functions.weather:0","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Fl"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ore"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"nce"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Italy"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} + + data: {"id":"gen-1777319903-e8Q7Du7mmUgiYBDzoHE6","object":"chat.completion.chunk","created":1777319903,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":69,"completion_tokens":87,"total_tokens":156,"cost":0.00020436,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00020436,"upstream_inference_prompt_cost":0.00003036,"upstream_inference_completions_cost":0.000174},"completion_tokens_details":{"reasoning_tokens":66,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -137,22 +187,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.94277625s + duration: 1.407202667s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 999 + content_length: 1128 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"weather:0","function":{"arguments":"{\"location\": \"Florence\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user is asking for the weather in Florence, Italy. I should use the weather function to get this information. I need to pass \"Florence\" as the location parameter.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"unknown","index":0,"text":" user is asking for the weather in Florence, Italy. I have a `weather` function that takes a `location` parameter which is the city name. I should call this function with \"Florence\" or \"Florence,Italy\" as the location. Let me use the location provided by the user.","type":"reasoning.text"}]},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -167,139 +217,137 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The","reasoning_details":[{"type":"reasoning.text","text":"The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" The","reasoning_details":[{"type":"reasoning.text","text":" The","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" returned","reasoning_details":[{"type":"reasoning.text","text":" returned","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function","reasoning_details":[{"type":"reasoning.text","text":" function","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" returned","reasoning_details":[{"type":"reasoning.text","text":" returned","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather","reasoning_details":[{"type":"reasoning.text","text":" weather","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" that","reasoning_details":[{"type":"reasoning.text","text":" that","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" for","reasoning_details":[{"type":"reasoning.text","text":" for","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" it's","reasoning_details":[{"type":"reasoning.text","text":" it's","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" as","reasoning_details":[{"type":"reasoning.text","text":" as","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"40","reasoning_details":[{"type":"reasoning.text","text":"40","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" ","reasoning_details":[{"type":"reasoning.text","text":" ","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"°C","reasoning_details":[{"type":"reasoning.text","text":"°C","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"40","reasoning_details":[{"type":"reasoning.text","text":"40","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"°C","reasoning_details":[{"type":"reasoning.text","text":"°C","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":",","reasoning_details":[{"type":"reasoning.text","text":",","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" This","reasoning_details":[{"type":"reasoning.text","text":" This","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Italy","reasoning_details":[{"type":"reasoning.text","text":" Italy","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" is","reasoning_details":[{"type":"reasoning.text","text":" is","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" quite","reasoning_details":[{"type":"reasoning.text","text":" quite","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" That's","reasoning_details":[{"type":"reasoning.text","text":" That's","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" hot","reasoning_details":[{"type":"reasoning.text","text":" hot","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" quite","reasoning_details":[{"type":"reasoning.text","text":" quite","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!","reasoning_details":[{"type":"reasoning.text","text":"!","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" hot","reasoning_details":[{"type":"reasoning.text","text":" hot","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" I","reasoning_details":[{"type":"reasoning.text","text":" I","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"!","reasoning_details":[{"type":"reasoning.text","text":"!","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" should","reasoning_details":[{"type":"reasoning.text","text":" should","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Let","reasoning_details":[{"type":"reasoning.text","text":" Let","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide","reasoning_details":[{"type":"reasoning.text","text":" provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me","reasoning_details":[{"type":"reasoning.text","text":" me","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" this","reasoning_details":[{"type":"reasoning.text","text":" this","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" provide","reasoning_details":[{"type":"reasoning.text","text":" provide","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" information","reasoning_details":[{"type":"reasoning.text","text":" information","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" this","reasoning_details":[{"type":"reasoning.text","text":" this","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" information","reasoning_details":[{"type":"reasoning.text","text":" information","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to","reasoning_details":[{"type":"reasoning.text","text":" to","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the","reasoning_details":[{"type":"reasoning.text","text":" the","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" user","reasoning_details":[{"type":"reasoning.text","text":" user","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" in","reasoning_details":[{"type":"reasoning.text","text":" in","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.text","text":" helpful","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a","reasoning_details":[{"type":"reasoning.text","text":" a","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" way","reasoning_details":[{"type":"reasoning.text","text":" way","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" helpful","reasoning_details":[{"type":"reasoning.text","text":" helpful","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" way","reasoning_details":[{"type":"reasoning.text","text":" way","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"unknown","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" temperature","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" weather","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"104","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"104","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"°F","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"°F","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":")**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"),","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" That's","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" extremely","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" Make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" Make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" sure","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" sure","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" to","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" hydrated","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" hydrated","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" and","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" seek","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" seek","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" shade","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" shade","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" if","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" if","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" you're","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" you're","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" visiting","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" visiting","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" city","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" city","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":" today","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":" today","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"stop","native_finish_reason":"stop"}]} - data: {"id":"gen-1773945484-SfZv5TJansZrMGHxA2ZN","object":"chat.completion.chunk","created":1773945484,"model":"moonshotai/kimi-k2.5-0127","provider":"AtlasCloud","system_fingerprint":"fpv0_e0c12c89","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":143,"completion_tokens":68,"total_tokens":211,"cost":0.0002483,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0002483,"upstream_inference_prompt_cost":0.0000715,"upstream_inference_completions_cost":0.0001768},"completion_tokens_details":{"reasoning_tokens":36,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319906-5rHRR8lMWdLh68lrzzL7","object":"chat.completion.chunk","created":1777319906,"model":"moonshotai/kimi-k2.5-0127","provider":"Chutes","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":110,"completion_tokens":66,"total_tokens":176,"cost":0.0001804,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0001804,"upstream_inference_prompt_cost":0.0000484,"upstream_inference_completions_cost":0.000132},"completion_tokens_details":{"reasoning_tokens":31,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -308,4 +356,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.370857958s + duration: 1.579724709s diff --git a/providertests/testdata/TestOpenRouterCommon/openai/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommon/openai/multi_tool.yaml index bf7a95468..da125ec7a 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945381-Qn1xXTBSWlAVHcSVGoNH\",\"object\":\"chat.completion\",\"created\":1773945381,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_Bb9t44hKsOQkKMDje3Do35B9\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_Nnev5P7Rhqz9lVYbinyjQEKi\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}]}}],\"usage\":{\"prompt_tokens\":113,\"completion_tokens\":54,\"total_tokens\":167,\"cost\":0.0000901,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000901,\"upstream_inference_prompt_cost\":0.0000226,\"upstream_inference_completions_cost\":0.0000675},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319814-aGngWTXl9RxhCunrtZ0A\",\"object\":\"chat.completion\",\"created\":1777319814,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_GVPfJvHywVetZmgLvozGlDCY\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"call_Jal5rEk7hg8UOOa4ulLZyYK0\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\":2,\\\"b\\\":3}\"}}]}}],\"usage\":{\"prompt_tokens\":113,\"completion_tokens\":54,\"total_tokens\":167,\"cost\":0.0000901,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000901,\"upstream_inference_prompt_cost\":0.0000226,\"upstream_inference_completions_cost\":0.0000675},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.454036875s + duration: 663.775292ms - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 1285 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_Bb9t44hKsOQkKMDje3Do35B9","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_Nnev5P7Rhqz9lVYbinyjQEKi","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_Bb9t44hKsOQkKMDje3Do35B9","role":"tool"},{"content":"6","tool_call_id":"call_Nnev5P7Rhqz9lVYbinyjQEKi","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_GVPfJvHywVetZmgLvozGlDCY","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_Jal5rEk7hg8UOOa4ulLZyYK0","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_GVPfJvHywVetZmgLvozGlDCY","role":"tool"},{"content":"6","tool_call_id":"call_Jal5rEk7hg8UOOa4ulLZyYK0","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n{\"id\":\"gen-1773945382-dSJAvlxyaw4kaA2dYNXa\",\"object\":\"chat.completion\",\"created\":1773945382,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"2 + 3 = **5** \\n2 × 3 = **6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":187,\"completion_tokens\":21,\"total_tokens\":208,\"cost\":0.00006365,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00006365,\"upstream_inference_prompt_cost\":0.0000374,\"upstream_inference_completions_cost\":0.00002625},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319815-s28FTlkcs87B87dPipLQ\",\"object\":\"chat.completion\",\"created\":1777319815,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"- **2 + 3 = 5**\\n- **2 × 3 = 6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":187,\"completion_tokens\":24,\"total_tokens\":211,\"cost\":0.0000674,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000674,\"upstream_inference_prompt_cost\":0.0000374,\"upstream_inference_completions_cost\":0.00003},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 509.885666ms + duration: 663.27875ms diff --git a/providertests/testdata/TestOpenRouterCommon/openai/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/openai/multi_tool_streaming.yaml index fde3d59ae..33df70dc1 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -26,21 +26,23 @@ interactions: body: |+ : OPENROUTER PROCESSING - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_RyRtXc5TxuhGTghDihBOXNar","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_8I6muAnyFaBjKyotk1gPRTwU","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_JmyBVHKW2AnWeep5UITLC9Wx","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"call_pKAAv6bKX2qLYJ85RW4Hxqfp","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\":2,\"b\":3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945383-68FpvFnqJ5V1GOao5iM6","object":"chat.completion.chunk","created":1773945383,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":109,"completion_tokens":54,"total_tokens":163,"cost":0.0000893,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000893,"upstream_inference_prompt_cost":0.0000218,"upstream_inference_completions_cost":0.0000675},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319818-QPRmQjcRi7f0czNVMFzC","object":"chat.completion.chunk","created":1777319818,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":109,"completion_tokens":54,"total_tokens":163,"cost":0.0000893,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000893,"upstream_inference_prompt_cost":0.0000218,"upstream_inference_completions_cost":0.0000675},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -49,7 +51,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 449.3595ms + duration: 637.342791ms - id: 1 request: proto: HTTP/1.1 @@ -57,14 +59,14 @@ interactions: proto_minor: 1 content_length: 1322 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_RyRtXc5TxuhGTghDihBOXNar","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_JmyBVHKW2AnWeep5UITLC9Wx","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_RyRtXc5TxuhGTghDihBOXNar","role":"tool"},{"content":"6","tool_call_id":"call_JmyBVHKW2AnWeep5UITLC9Wx","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_8I6muAnyFaBjKyotk1gPRTwU","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"call_pKAAv6bKX2qLYJ85RW4Hxqfp","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_8I6muAnyFaBjKyotk1gPRTwU","role":"tool"},{"content":"6","tool_call_id":"call_pKAAv6bKX2qLYJ85RW4Hxqfp","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -73,49 +75,73 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + : OPENROUTER PROCESSING + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":":","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" \\(","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" +","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"\\","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":")","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"5","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" \n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**\n","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" Multip","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"lication","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":":","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ×","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" \\(","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"2","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" \\","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"times","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"3","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"6","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"\\","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":")","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + : OPENROUTER PROCESSING + + : OPENROUTER PROCESSING - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945384-CDS0bQpWtuMHu6nuk27q","object":"chat.completion.chunk","created":1773945384,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":183,"completion_tokens":24,"total_tokens":207,"cost":0.0000666,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000666,"upstream_inference_prompt_cost":0.0000366,"upstream_inference_completions_cost":0.00003},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319819-JeJtDeCKjjHTt8hFk9TD","object":"chat.completion.chunk","created":1777319819,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":183,"completion_tokens":33,"total_tokens":216,"cost":0.00007785,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.00007785,"upstream_inference_prompt_cost":0.0000366,"upstream_inference_completions_cost":0.00004125},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -124,4 +150,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 388.096708ms + duration: 579.374708ms diff --git a/providertests/testdata/TestOpenRouterCommon/openai/simple.yaml b/providertests/testdata/TestOpenRouterCommon/openai/simple.yaml index 4394722da..4116f4db1 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945373-Bv9tKBtwWtfAzjZPxf5A\",\"object\":\"chat.completion\",\"created\":1773945373,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá!\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":19,\"completion_tokens\":6,\"total_tokens\":25,\"cost\":0.0000113,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000113,\"upstream_inference_prompt_cost\":0.0000038,\"upstream_inference_completions_cost\":0.0000075},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n{\"id\":\"gen-1777319808-n1Y7IbUGJBiu3hP0bz53\",\"object\":\"chat.completion\",\"created\":1777319808,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"Oi! \U0001F60A\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":19,\"completion_tokens\":7,\"total_tokens\":26,\"cost\":0.00001255,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00001255,\"upstream_inference_prompt_cost\":0.0000038,\"upstream_inference_completions_cost\":0.00000875},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 830.207834ms + duration: 577.611958ms diff --git a/providertests/testdata/TestOpenRouterCommon/openai/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/openai/simple_streaming.yaml index e9338b2e2..e30e60d5c 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -23,10 +23,10 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: "data: {\"id\":\"gen-1773945374-q8ZSp46PFfXc9NAS2qL7\",\"object\":\"chat.completion.chunk\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Oi\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945374-q8ZSp46PFfXc9NAS2qL7\",\"object\":\"chat.completion.chunk\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945374-q8ZSp46PFfXc9NAS2qL7\",\"object\":\"chat.completion.chunk\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \U0001F60A\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945374-q8ZSp46PFfXc9NAS2qL7\",\"object\":\"chat.completion.chunk\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}]}\n\ndata: {\"id\":\"gen-1773945374-q8ZSp46PFfXc9NAS2qL7\",\"object\":\"chat.completion.chunk\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}],\"usage\":{\"prompt_tokens\":19,\"completion_tokens\":7,\"total_tokens\":26,\"cost\":0.00001255,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00001255,\"upstream_inference_prompt_cost\":0.0000038,\"upstream_inference_completions_cost\":0.00000875},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: ": OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1777319809-KRozO9hOQbdWkZAi8Zj7\",\"object\":\"chat.completion.chunk\",\"created\":1777319809,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Olá\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319809-KRozO9hOQbdWkZAi8Zj7\",\"object\":\"chat.completion.chunk\",\"created\":1777319809,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319809-KRozO9hOQbdWkZAi8Zj7\",\"object\":\"chat.completion.chunk\",\"created\":1777319809,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \U0001F60A\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319809-KRozO9hOQbdWkZAi8Zj7\",\"object\":\"chat.completion.chunk\",\"created\":1777319809,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}]}\n\ndata: {\"id\":\"gen-1777319809-KRozO9hOQbdWkZAi8Zj7\",\"object\":\"chat.completion.chunk\",\"created\":1777319809,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\"}],\"usage\":{\"prompt_tokens\":19,\"completion_tokens\":7,\"total_tokens\":26,\"cost\":0.00001255,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00001255,\"upstream_inference_prompt_cost\":0.0000038,\"upstream_inference_completions_cost\":0.00000875},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 453.163167ms + duration: 606.367333ms diff --git a/providertests/testdata/TestOpenRouterCommon/openai/tool.yaml b/providertests/testdata/TestOpenRouterCommon/openai/tool.yaml index c5a5ddd90..cf4f4a549 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945374-TeLNBnAFqTwjuAi8wpRj\",\"object\":\"chat.completion\",\"created\":1773945374,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_fYo0Z8fLQU2v12NNb25MFUhj\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":63,\"completion_tokens\":20,\"total_tokens\":83,\"cost\":0.0000376,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000376,\"upstream_inference_prompt_cost\":0.0000126,\"upstream_inference_completions_cost\":0.000025},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n{\"id\":\"gen-1777319810-8Yuvh6RCsaTxAqIJ0hFi\",\"object\":\"chat.completion\",\"created\":1777319810,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"call_DCueNvTKgjMyxnoqkMFfEefn\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":63,\"completion_tokens\":20,\"total_tokens\":83,\"cost\":0.0000376,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.0000376,\"upstream_inference_prompt_cost\":0.0000126,\"upstream_inference_completions_cost\":0.000025},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 667.863167ms + duration: 528.816167ms - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 749 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_fYo0Z8fLQU2v12NNb25MFUhj","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_fYo0Z8fLQU2v12NNb25MFUhj","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_DCueNvTKgjMyxnoqkMFfEefn","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_DCueNvTKgjMyxnoqkMFfEefn","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n{\"id\":\"gen-1773945375-9AEqJV7RbOK8FPk7hsB2\",\"object\":\"chat.completion\",\"created\":1773945375,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in **Florence, Italy** is currently **40°C**.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":95,\"completion_tokens\":20,\"total_tokens\":115,\"cost\":0.000044,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000044,\"upstream_inference_prompt_cost\":0.000019,\"upstream_inference_completions_cost\":0.000025},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n{\"id\":\"gen-1777319811-IU2UqYiq6vT8x4Ewcqgw\",\"object\":\"chat.completion\",\"created\":1777319811,\"model\":\"openai/gpt-5.4-nano-20260317\",\"provider\":\"OpenAI\",\"system_fingerprint\":null,\"service_tier\":\"default\",\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"completed\",\"message\":{\"role\":\"assistant\",\"content\":\"The current weather in **Florence, Italy** is **40°C**.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":95,\"completion_tokens\":20,\"total_tokens\":115,\"cost\":0.000044,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000044,\"upstream_inference_prompt_cost\":0.000019,\"upstream_inference_completions_cost\":0.000025},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 650.392417ms + duration: 551.837583ms diff --git a/providertests/testdata/TestOpenRouterCommon/openai/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommon/openai/tool_streaming.yaml index 8537abb4d..145675e49 100644 --- a/providertests/testdata/TestOpenRouterCommon/openai/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommon/openai/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -26,29 +26,29 @@ interactions: body: |+ : OPENROUTER PROCESSING - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_6jrRIpW4Qm0ovEB92ylZxfBy","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"call_PwnQR6IkH2UiHQ4qel3LGcri","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945376-TLrrn3G9TGS0BbGDFto3","object":"chat.completion.chunk","created":1773945376,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":63,"completion_tokens":20,"total_tokens":83,"cost":0.0000376,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000376,"upstream_inference_prompt_cost":0.0000126,"upstream_inference_completions_cost":0.000025},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319812-D6VzmWKMw6zukREQPum0","object":"chat.completion.chunk","created":1777319812,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"completed"}],"usage":{"prompt_tokens":63,"completion_tokens":20,"total_tokens":83,"cost":0.0000376,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.0000376,"upstream_inference_prompt_cost":0.0000126,"upstream_inference_completions_cost":0.000025},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -57,7 +57,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 406.696208ms + duration: 845.789666ms - id: 1 request: proto: HTTP/1.1 @@ -65,14 +65,14 @@ interactions: proto_minor: 1 content_length: 803 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_6jrRIpW4Qm0ovEB92ylZxfBy","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_6jrRIpW4Qm0ovEB92ylZxfBy","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_PwnQR6IkH2UiHQ4qel3LGcri","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_PwnQR6IkH2UiHQ4qel3LGcri","role":"tool"}],"model":"openai/gpt-5.4-nano","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -83,41 +83,41 @@ interactions: body: |+ : OPENROUTER PROCESSING - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"The","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" weather","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" weather","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" in","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"Flor","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"ence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"Flor","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"ence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":",","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" Italy","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" is","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"40","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"°C","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}]} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}]} - data: {"id":"gen-1773945377-qEiqJ8jtJDRv2fbll0BH","object":"chat.completion.chunk","created":1773945377,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":95,"completion_tokens":20,"total_tokens":115,"cost":0.000044,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000044,"upstream_inference_prompt_cost":0.000019,"upstream_inference_completions_cost":0.000025},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319813-VorvbQqOmlpN8EcPKbMR","object":"chat.completion.chunk","created":1777319813,"model":"openai/gpt-5.4-nano-20260317","provider":"OpenAI","service_tier":"default","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"completed"}],"usage":{"prompt_tokens":95,"completion_tokens":20,"total_tokens":115,"cost":0.000044,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000044,"upstream_inference_prompt_cost":0.000019,"upstream_inference_completions_cost":0.000025},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -126,4 +126,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 896.667791ms + duration: 701.089708ms diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml index 803541e79..4b5e30944 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945519-vH8l4rm4QBpQxTOx4cAf\",\"object\":\"chat.completion\",\"created\":1773945519,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01H14Zn23kEJtcsCuMfrUSLn\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"toolu_bdrk_01YV3GUPWt1ArbfQmf7iprfQ\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}}]}}],\"usage\":{\"prompt_tokens\":690,\"completion_tokens\":120,\"total_tokens\":810,\"cost\":0.00129,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00129,\"upstream_inference_prompt_cost\":0.00069,\"upstream_inference_completions_cost\":0.0006},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319940-5gxPYdze0IneZJMlSBKX\",\"object\":\"chat.completion\",\"created\":1777319940,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_use\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs\",\"function\":{\"name\":\"add\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}},{\"type\":\"function\",\"index\":1,\"id\":\"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L\",\"function\":{\"name\":\"multiply\",\"arguments\":\"{\\\"a\\\": 2, \\\"b\\\": 3}\"}}]}}],\"usage\":{\"prompt_tokens\":690,\"completion_tokens\":120,\"total_tokens\":810,\"cost\":0.00129,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.00129,\"upstream_inference_prompt_cost\":0.00069,\"upstream_inference_completions_cost\":0.0006},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.567961792s + duration: 1.126607917s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 1385 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01H14Zn23kEJtcsCuMfrUSLn","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01YV3GUPWt1ArbfQmf7iprfQ","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01H14Zn23kEJtcsCuMfrUSLn","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01YV3GUPWt1ArbfQmf7iprfQ","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n{\"id\":\"gen-1773945521-RVUJLnRL6jUAAh5b6soX\",\"object\":\"chat.completion\",\"created\":1773945521,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Perfect! Here are the results:\\n\\n- **Addition**: 2 + 3 = **5**\\n- **Multiplication**: 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":871,\"completion_tokens\":43,\"total_tokens\":914,\"cost\":0.001086,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001086,\"upstream_inference_prompt_cost\":0.000871,\"upstream_inference_completions_cost\":0.000215},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319942-T4bRv1QFKxB8NpCHToUg\",\"object\":\"chat.completion\",\"created\":1777319942,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"Perfect! Here are the results:\\n\\n- **Addition**: 2 + 3 = **5**\\n- **Multiplication**: 2 × 3 = **6**\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":871,\"completion_tokens\":43,\"total_tokens\":914,\"cost\":0.001086,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001086,\"upstream_inference_prompt_cost\":0.000871,\"upstream_inference_completions_cost\":0.000215},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.465064916s + duration: 1.450215s diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml index 3babb9361..16d6b1090 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,49 +28,41 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a"}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" 2"}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":", "}}]},"finish_reason":null,"native_finish_reason":null}]} - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01KDfMFitkvhgBdEEGHT9CRQ","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"b\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"a\": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":", \"b\": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"id":"toolu_bdrk_011XFKroyRot22bfhg21E6aX","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\": 2"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":", \""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"{\"a\": "}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"b\":"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"2"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":" 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":", \""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}]} - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":1,"function":{"arguments":"b\": 3}"}}]},"finish_reason":null,"native_finish_reason":null}]} - - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} - - data: {"id":"gen-1773945523-tt56AysOw62Fb3DpltAS","object":"chat.completion.chunk","created":1773945523,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":685,"completion_tokens":120,"total_tokens":805,"cost":0.001285,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001285,"upstream_inference_prompt_cost":0.000685,"upstream_inference_completions_cost":0.0006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319944-Chq7Z6SUi1ZPNQoVHReu","object":"chat.completion.chunk","created":1777319944,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}],"usage":{"prompt_tokens":685,"completion_tokens":120,"total_tokens":805,"cost":0.001285,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001285,"upstream_inference_prompt_cost":0.000685,"upstream_inference_completions_cost":0.0006},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -79,7 +71,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 4.244026542s + duration: 1.370825s - id: 1 request: proto: HTTP/1.1 @@ -87,14 +79,14 @@ interactions: proto_minor: 1 content_length: 1422 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01KDfMFitkvhgBdEEGHT9CRQ","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_011XFKroyRot22bfhg21E6aX","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01KDfMFitkvhgBdEEGHT9CRQ","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_011XFKroyRot22bfhg21E6aX","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -107,27 +99,27 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Perfect","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Here are the results:\n\n-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"! Here","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" are the results:\n\n-","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **Addition","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"**: 2 + 3 ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"**: 2 + 3 ","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"= **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"= **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"5**\n- **Multiplication**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"5**\n- **Multiplication**:","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" 2 × 3 =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" 2 × 3 =","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **6**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **6**","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}]} - data: {"id":"gen-1773945528-OutOUCEUBNVQzbdS7ePu","object":"chat.completion.chunk","created":1773945528,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":866,"completion_tokens":41,"total_tokens":907,"cost":0.001071,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001071,"upstream_inference_prompt_cost":0.000866,"upstream_inference_completions_cost":0.000205},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319945-Gm4f5AD272Fyu1cg30BV","object":"chat.completion.chunk","created":1777319945,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}],"usage":{"prompt_tokens":866,"completion_tokens":43,"total_tokens":909,"cost":0.001081,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001081,"upstream_inference_prompt_cost":0.000866,"upstream_inference_completions_cost":0.000215},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -136,4 +128,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.563418666s + duration: 1.289342083s diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple.yaml index c43f51581..445aa6973 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,10 +24,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945503-TWLdI6hobgaikHf5gRS1\",\"object\":\"chat.completion\",\"created\":1773945503,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá! \U0001F44B\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":10,\"total_tokens\":26,\"cost\":0.000066,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000066,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00005},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1777319930-L8KSfNKOH38dkufPhaUr\",\"object\":\"chat.completion\",\"created\":1777319930,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"Olá! \U0001F44B\\n\\nHow can I help you today?\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":18,\"total_tokens\":34,\"cost\":0.000106,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000106,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00009},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 4.339756292s + duration: 5.004122125s diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple_streaming.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple_streaming.yaml index a3946059f..208bfa2d8 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -23,10 +23,10 @@ interactions: proto_major: 2 proto_minor: 0 content_length: -1 - body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Olá! \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F44B\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\\n\\n(\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Or\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" \\\"\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Oi!\\\" for\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" a\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" more casual greeting)\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}]}\n\ndata: {\"id\":\"gen-1773945508-Gat2V4icRH8NVNjvno2y\",\"object\":\"chat.completion.chunk\",\"created\":1773945508,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":24,\"total_tokens\":40,\"cost\":0.000136,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000136,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00012},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" + body: ": OPENROUTER PROCESSING\n\n: OPENROUTER PROCESSING\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Olá! \",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\U0001F44B\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\\n\\nHow\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" can I help you today?\",\"role\":\"assistant\"},\"finish_reason\":null,\"native_finish_reason\":null}]}\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\"}]}\n\ndata: {\"id\":\"gen-1777319932-YgFptgSBThjQHdYuhNa6\",\"object\":\"chat.completion.chunk\",\"created\":1777319932,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"\",\"role\":\"assistant\"},\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\"}],\"usage\":{\"prompt_tokens\":16,\"completion_tokens\":18,\"total_tokens\":34,\"cost\":0.000106,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000106,\"upstream_inference_prompt_cost\":0.000016,\"upstream_inference_completions_cost\":0.00009},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}\n\ndata: [DONE]\n\n" headers: Content-Type: - text/event-stream status: 200 OK code: 200 - duration: 4.0492025s + duration: 1.203068917s diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml index e6ba30a13..83cc54104 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,13 +24,13 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n{\"id\":\"gen-1773945512-Xt6mSHr3OgFEVbjoGGkN\",\"object\":\"chat.completion\",\"created\":1773945512,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01X4cGongGVKKVt2JGXZNZnt\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":577,\"completion_tokens\":54,\"total_tokens\":631,\"cost\":0.000847,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000847,\"upstream_inference_prompt_cost\":0.000577,\"upstream_inference_completions_cost\":0.00027},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319934-1HZi3MDZW5QwcjMB6tjc\",\"object\":\"chat.completion\",\"created\":1777319934,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_use\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":null,\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}]}}],\"usage\":{\"prompt_tokens\":577,\"completion_tokens\":54,\"total_tokens\":631,\"cost\":0.000847,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000847,\"upstream_inference_prompt_cost\":0.000577,\"upstream_inference_completions_cost\":0.00027},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.363396958s + duration: 1.45853775s - id: 1 request: proto: HTTP/1.1 @@ -38,14 +38,14 @@ interactions: proto_minor: 1 content_length: 832 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01X4cGongGVKKVt2JGXZNZnt","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01X4cGongGVKKVt2JGXZNZnt","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945513-P0NATIIxI7GM9cWqpyep\",\"object\":\"chat.completion\",\"created\":1773945513,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**, which is quite hot! It's a warm summer day in Florence. Make sure to stay hydrated and use sunscreen if you're planning to be outdoors.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":646,\"completion_tokens\":54,\"total_tokens\":700,\"cost\":0.000916,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000916,\"upstream_inference_prompt_cost\":0.000646,\"upstream_inference_completions_cost\":0.00027},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319936-rW62wrIX8oNT4X6EucWB\",\"object\":\"chat.completion\",\"created\":1777319936,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**. That's quite hot! If you're planning to visit or are there now, make sure to stay hydrated, wear sunscreen, and try to stay in shaded areas during the hottest parts of the day.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":646,\"completion_tokens\":65,\"total_tokens\":711,\"cost\":0.000971,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.000971,\"upstream_inference_prompt_cost\":0.000646,\"upstream_inference_completions_cost\":0.000325},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.631234625s + duration: 1.1230985s diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml index 7c2e3fa18..ea83d71cd 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,25 +28,29 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01QQHfcup9N3oZuLJo424HVC","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"l"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ocatio"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"locati"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"n\""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"on\": \"Flor"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":": \"Flore"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ence, It"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"nce, "}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"aly\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"Ital"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"y\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945515-sgmaEwpZZyQZdwfyE0yB","object":"chat.completion.chunk","created":1773945515,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":577,"completion_tokens":54,"total_tokens":631,"cost":0.000847,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000847,"upstream_inference_prompt_cost":0.000577,"upstream_inference_completions_cost":0.00027},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}]} + + data: {"id":"gen-1777319937-TnBGr8gcC8LZ7pmTzgP6","object":"chat.completion.chunk","created":1777319937,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}],"usage":{"prompt_tokens":577,"completion_tokens":54,"total_tokens":631,"cost":0.000847,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000847,"upstream_inference_prompt_cost":0.000577,"upstream_inference_completions_cost":0.00027},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -55,7 +59,7 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.609333666s + duration: 1.34971325s - id: 1 request: proto: HTTP/1.1 @@ -63,14 +67,14 @@ interactions: proto_minor: 1 content_length: 886 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01QQHfcup9N3oZuLJo424HVC","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01QQHfcup9N3oZuLJo424HVC","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -83,53 +87,49 @@ interactions: : OPENROUTER PROCESSING - : OPENROUTER PROCESSING - - : OPENROUTER PROCESSING - - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The current","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The weather in Florence, Italy is currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" weather in Florence, Italy is **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which is quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" It","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" It","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'s a very","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'s a typical warm","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" warm","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" day","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" day. Make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" in Florence.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sure to stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" Make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sure to stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" wear","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated and use sun","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" light clothing","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" protection if","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":", and use","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" you're","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sun protection if you","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" planning","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'re planning","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" to be out","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" to be","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"doors.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" outside.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}]} - data: {"id":"gen-1773945517-KstYN5GyTgkkVlJf1xOk","object":"chat.completion.chunk","created":1773945517,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":646,"completion_tokens":54,"total_tokens":700,"cost":0.000916,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000916,"upstream_inference_prompt_cost":0.000646,"upstream_inference_completions_cost":0.00027},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319939-WDBJKeSPlMNmYM8wdvlY","object":"chat.completion.chunk","created":1777319939,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}],"usage":{"prompt_tokens":646,"completion_tokens":56,"total_tokens":702,"cost":0.000926,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.000926,"upstream_inference_prompt_cost":0.000646,"upstream_inference_completions_cost":0.00028},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -138,4 +138,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.755883125s + duration: 1.038457s diff --git a/providertests/testdata/TestOpenRouterThinking/anthropic/thinking-streaming.yaml b/providertests/testdata/TestOpenRouterThinking/anthropic/thinking-streaming.yaml index ec593ea7e..088857538 100644 --- a/providertests/testdata/TestOpenRouterThinking/anthropic/thinking-streaming.yaml +++ b/providertests/testdata/TestOpenRouterThinking/anthropic/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -28,59 +28,75 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The user is asking for","reasoning_details":[{"type":"reasoning.text","text":"The user is asking for","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"The user is asking for","reasoning_details":[{"type":"reasoning.text","text":"The user is asking for","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the weather in Florence, Italy. I","reasoning_details":[{"type":"reasoning.text","text":" the weather in Florence, Italy. I","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" weather information in Florence, Italy. I","reasoning_details":[{"type":"reasoning.text","text":" weather information in Florence, Italy. I","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" have","reasoning_details":[{"type":"reasoning.text","text":" have","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" have","reasoning_details":[{"type":"reasoning.text","text":" have","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a weather","reasoning_details":[{"type":"reasoning.text","text":" a weather","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" access","reasoning_details":[{"type":"reasoning.text","text":" access","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" function available that takes","reasoning_details":[{"type":"reasoning.text","text":" function available that takes","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" to a weather function that takes a location","reasoning_details":[{"type":"reasoning.text","text":" to a weather function that takes a location","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" a location parameter. I should call","reasoning_details":[{"type":"reasoning.text","text":" a location parameter. I should call","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" parameter. I shoul","reasoning_details":[{"type":"reasoning.text","text":" parameter. I shoul","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" it","reasoning_details":[{"type":"reasoning.text","text":" it","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"d call","reasoning_details":[{"type":"reasoning.text","text":"d call","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" with \"Florence, Italy\" or","reasoning_details":[{"type":"reasoning.text","text":" with \"Florence, Italy\" or","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the weather function with \"Florence, Italy","reasoning_details":[{"type":"reasoning.text","text":" the weather function with \"Florence, Italy","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" just","reasoning_details":[{"type":"reasoning.text","text":" just","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\" or","reasoning_details":[{"type":"reasoning.text","text":"\" or","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"Florence\" as the location. Let","reasoning_details":[{"type":"reasoning.text","text":" \"Florence\" as the location. Let","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"Florence\" as the location.","reasoning_details":[{"type":"reasoning.text","text":" \"Florence\" as the location.","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" me use","reasoning_details":[{"type":"reasoning.text","text":" me use","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"\n\nLet me call","reasoning_details":[{"type":"reasoning.text","text":"\n\nLet me call","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" the weather function with the location being","reasoning_details":[{"type":"reasoning.text","text":" the weather function with the location being","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Florence, Italy\" to","reasoning_details":[{"type":"reasoning.text","text":"Florence, Italy\" to","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" Florence","reasoning_details":[{"type":"reasoning.text","text":" Florence","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" be","reasoning_details":[{"type":"reasoning.text","text":" be","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":", Italy (","reasoning_details":[{"type":"reasoning.text","text":", Italy (","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" specific","reasoning_details":[{"type":"reasoning.text","text":" specific","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"or I","reasoning_details":[{"type":"reasoning.text","text":"or I","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":".","reasoning_details":[{"type":"reasoning.text","text":".","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" could try","reasoning_details":[{"type":"reasoning.text","text":" could try","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01Xwqc5oEGdjPCCPum1Dtb2Y","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" just","reasoning_details":[{"type":"reasoning.text","text":" just","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"Florence\" -","reasoning_details":[{"type":"reasoning.text","text":" \"Florence\" -","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" but","reasoning_details":[{"type":"reasoning.text","text":" but","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"location"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" \"","reasoning_details":[{"type":"reasoning.text","text":" \"","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"Florence, Italy\" woul","reasoning_details":[{"type":"reasoning.text","text":"Florence, Italy\" woul","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" \"Florence,"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"d be more specific","reasoning_details":[{"type":"reasoning.text","text":"d be more specific","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":" an","reasoning_details":[{"type":"reasoning.text","text":" an","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":"d accurate).","reasoning_details":[{"type":"reasoning.text","text":"d accurate).","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning_details":[{"type":"reasoning.text","signature":"Ep8DCkgICxABGAIqQMPJIeZ0P/DSe9JQ2wg9NaUiY1fY4A/kD7HwtPBhRsepL0jAqIXyjKajtqj8mKKNj39kCrDFp0b8NOBIbX3e+XASDPK3RtRCSq7Z/Iu0kxoMCL2VPJ0qWJYZyey0IjCjhME7FUWTLD7dhGw2WNWJmQNbsVVq1YyyqPpn8Ap9qdhRPb/0uZM0wZaMR/FW2C0qhALVhWU2Hb3H30vrcYfc5S6wPMnYgNDIAvsif7nvmGrWK8YA+4cd9cPNBIfi/AO/OUkOeXowSVr4F19yt+fcjKXDOff5PfS+j/FeqwcKhG1EIC8SQvnqjAZqTmlPg5B1O8nrVqrUZWr3UEqVKoGUvrEQxKobN+JN/2u+/yQQK3SmrnArp2+N1fusDCz6uq7V1qWhjSzsZKTUO4+lFy0eKCzNFeGFRGFgZTgWdfS/cxiCaZLe0PE35kq6ubKVNGC+C6NVBm3h/bNtqQuWt+19TAX7y8Vk94rBMaEeJsCo81W0EOkhenk5ohDZsvL+8iFcDso5whoraTA0HQViPU1zW+FifZDATBgB","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning_details":[{"type":"reasoning.text","signature":"Eq0ECkgIDRABGAIqQM/zwzd9QrbMZ79kRrc7C/5+aoKK90YBv7ZbImUoagaaGZvOU3SP14cZRUHB0b+fLRHRC8LLhfcfaQiGOGAxwdoSDIbgptNVmRLyYm/sdhoMI7e1X+W59yUjKZVlIjAqlULqwvQixLC+CkI+RvLV4hHztMBsL/kzC5raPmOTiEVmCaQ5c7W4fXO3Mon1cZAqkgNVe2nmngGw6pcyT7NffJiTFdTsCng7MUiRRJEF/ewiBLEFGMIPyMN/yUsjQnMewYzwYtsnaf3NGiv15hJ3xrAwdn0YW5k6oU5Fw33QYby3cMAxJxO/Pfz4vQEqEz01veyKIUoIN1ohc/ntl59HQCBxblYiiOvenqc7FZXtTSamyK5aXDaV7chH1xYJYffZGDs4RBYEObRjWADgTi4r01G3RdXMA9UAPbJ2w4y0u85g18EFnIiqfJbm3TfQXtevWaRT8lFV8gaSqjzpqq0a6V3RbZWT/I2iJOVrWxRlVcZWR1/vaR9HkaJsz0d1Gi25UrfJHxsB4QnZKfvDHQ6DrX79FHPvGmfwvUb/BOxjrtARlnKKiMzd15nT9XiDhc1PuUKv7+4mM8XIlG47FQGcGO4MSZMr5hFQsYTlYPx/WfNKrayx+WJ3qPVelJ78+BFLzaoZ2JFjEQJqS+ULV1ZOjkYZNE5Ab/kjUpu6YklsKvdzjfdtBLA94m5g5L4zk6ygJMBjCIQ6ziSW4AAzYQeJjnyJOwYYAQ==","format":"anthropic-claude-v1","index":0}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}]} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"id":"toolu_bdrk_01N8hD5cYDw4WfvnjKXAkA2W","type":"function","function":{"name":"weather","arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945537-De6r293kjwFRqSih0qan","object":"chat.completion.chunk","created":1773945537,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_calls"}],"usage":{"prompt_tokens":607,"completion_tokens":116,"total_tokens":723,"cost":0.001187,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001187,"upstream_inference_prompt_cost":0.000607,"upstream_inference_completions_cost":0.00058},"completion_tokens_details":{"reasoning_tokens":61,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":""}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"{\"locat"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ion\": \"Flor"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"en"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"ce, Ital"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":null,"role":"assistant","tool_calls":[{"index":0,"function":{"arguments":"y\"}"}}]},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant","reasoning":null},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}]} + + data: {"id":"gen-1777319950-BX6MCZRmFqpAw5lUPuhg","object":"chat.completion.chunk","created":1777319950,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"tool_calls","native_finish_reason":"tool_use"}],"usage":{"prompt_tokens":607,"completion_tokens":143,"total_tokens":750,"cost":0.001322,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001322,"upstream_inference_prompt_cost":0.000607,"upstream_inference_completions_cost":0.000715},"completion_tokens_details":{"reasoning_tokens":99,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -89,22 +105,22 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.27368825s + duration: 1.369993583s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1972 + content_length: 2504 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01Xwqc5oEGdjPCCPum1Dtb2Y","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"anthropic-claude-v1","index":0,"signature":"Ep8DCkgICxABGAIqQMPJIeZ0P/DSe9JQ2wg9NaUiY1fY4A/kD7HwtPBhRsepL0jAqIXyjKajtqj8mKKNj39kCrDFp0b8NOBIbX3e+XASDPK3RtRCSq7Z/Iu0kxoMCL2VPJ0qWJYZyey0IjCjhME7FUWTLD7dhGw2WNWJmQNbsVVq1YyyqPpn8Ap9qdhRPb/0uZM0wZaMR/FW2C0qhALVhWU2Hb3H30vrcYfc5S6wPMnYgNDIAvsif7nvmGrWK8YA+4cd9cPNBIfi/AO/OUkOeXowSVr4F19yt+fcjKXDOff5PfS+j/FeqwcKhG1EIC8SQvnqjAZqTmlPg5B1O8nrVqrUZWr3UEqVKoGUvrEQxKobN+JN/2u+/yQQK3SmrnArp2+N1fusDCz6uq7V1qWhjSzsZKTUO4+lFy0eKCzNFeGFRGFgZTgWdfS/cxiCaZLe0PE35kq6ubKVNGC+C6NVBm3h/bNtqQuWt+19TAX7y8Vk94rBMaEeJsCo81W0EOkhenk5ohDZsvL+8iFcDso5whoraTA0HQViPU1zW+FifZDATBgB","text":" the weather in Florence, Italy. I have a weather function available that takes a location parameter. I should call it with \"Florence, Italy\" or just \"Florence\" as the location. Let me use \"Florence, Italy\" to be specific.","type":"reasoning.text"}],"reasoning":" the weather in Florence, Italy. I have a weather function available that takes a location parameter. I should call it with \"Florence, Italy\" or just \"Florence\" as the location. Let me use \"Florence, Italy\" to be specific."},{"content":"40 C","tool_call_id":"toolu_bdrk_01Xwqc5oEGdjPCCPum1Dtb2Y","role":"tool"}],"model":"anthropic/claude-haiku-4.5","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"reasoning":{"effort":"medium"},"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01N8hD5cYDw4WfvnjKXAkA2W","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"anthropic-claude-v1","index":0,"signature":"Eq0ECkgIDRABGAIqQM/zwzd9QrbMZ79kRrc7C/5+aoKK90YBv7ZbImUoagaaGZvOU3SP14cZRUHB0b+fLRHRC8LLhfcfaQiGOGAxwdoSDIbgptNVmRLyYm/sdhoMI7e1X+W59yUjKZVlIjAqlULqwvQixLC+CkI+RvLV4hHztMBsL/kzC5raPmOTiEVmCaQ5c7W4fXO3Mon1cZAqkgNVe2nmngGw6pcyT7NffJiTFdTsCng7MUiRRJEF/ewiBLEFGMIPyMN/yUsjQnMewYzwYtsnaf3NGiv15hJ3xrAwdn0YW5k6oU5Fw33QYby3cMAxJxO/Pfz4vQEqEz01veyKIUoIN1ohc/ntl59HQCBxblYiiOvenqc7FZXtTSamyK5aXDaV7chH1xYJYffZGDs4RBYEObRjWADgTi4r01G3RdXMA9UAPbJ2w4y0u85g18EFnIiqfJbm3TfQXtevWaRT8lFV8gaSqjzpqq0a6V3RbZWT/I2iJOVrWxRlVcZWR1/vaR9HkaJsz0d1Gi25UrfJHxsB4QnZKfvDHQ6DrX79FHPvGmfwvUb/BOxjrtARlnKKiMzd15nT9XiDhc1PuUKv7+4mM8XIlG47FQGcGO4MSZMr5hFQsYTlYPx/WfNKrayx+WJ3qPVelJ78+BFLzaoZ2JFjEQJqS+ULV1ZOjkYZNE5Ab/kjUpu6YklsKvdzjfdtBLA94m5g5L4zk6ygJMBjCIQ6ziSW4AAzYQeJjnyJOwYYAQ==","text":"The user is asking for weather information in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \"Florence, Italy\" or \"Florence\" as the location.\n\nLet me call the weather function with the location being Florence, Italy (or I could try just \"Florence\" - but \"Florence, Italy\" would be more specific and accurate).","type":"reasoning.text"}],"reasoning":"The user is asking for weather information in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \"Florence, Italy\" or \"Florence\" as the location.\n\nLet me call the weather function with the location being Florence, Italy (or I could try just \"Florence\" - but \"Florence, Italy\" would be more specific and accurate)."},{"content":"40 C","tool_call_id":"toolu_bdrk_01N8hD5cYDw4WfvnjKXAkA2W","role":"tool"}],"model":"anthropic/claude-haiku-4.5","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"reasoning":{"effort":"medium"},"usage":{"include":true},"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -119,53 +135,67 @@ interactions: : OPENROUTER PROCESSING - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The weather in Florence, Italy is currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"The weather in Florence, Italy is currently","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"!","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" **","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" This is typical","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"40°C (","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" for Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"104°F)**,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" during the","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" which","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" summer months.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" is quite","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" If","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hot","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" you're planning to visit, make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"! It's a","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sure to stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" warm","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" summer","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" wear","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" day in Florence","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" light clothing","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":".","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":", and use","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" If","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sunscreen.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" you're planning to visit or travel","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" It","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" there","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'s a goo","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":", make","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"d idea to plan","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sure to stay","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" outdoor","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" hydrated,","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" activities for early","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" wear","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" morning or late evening","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" light clothing","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" when it","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":", and apply","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"'s a","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" sunscreen.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":" bit cooler.","role":"assistant"},"finish_reason":null,"native_finish_reason":null}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}]} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}]} - data: {"id":"gen-1773945539-NkL1DRr645GoRuXEuqXV","object":"chat.completion.chunk","created":1773945539,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"stop"}],"usage":{"prompt_tokens":738,"completion_tokens":61,"total_tokens":799,"cost":0.001043,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001043,"upstream_inference_prompt_cost":0.000738,"upstream_inference_completions_cost":0.000305},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} + data: {"id":"gen-1777319952-fbyZefNGWUrY0N3vwtxP","object":"chat.completion.chunk","created":1777319952,"model":"anthropic/claude-4.5-haiku-20251001","provider":"Amazon Bedrock","choices":[{"index":0,"delta":{"content":"","role":"assistant"},"finish_reason":"stop","native_finish_reason":"end_turn"}],"usage":{"prompt_tokens":764,"completion_tokens":82,"total_tokens":846,"cost":0.001174,"is_byok":false,"prompt_tokens_details":{"cached_tokens":0,"cache_write_tokens":0,"audio_tokens":0,"video_tokens":0},"cost_details":{"upstream_inference_cost":0.001174,"upstream_inference_prompt_cost":0.000764,"upstream_inference_completions_cost":0.00041},"completion_tokens_details":{"reasoning_tokens":0,"image_tokens":0,"audio_tokens":0}}} data: [DONE] @@ -174,4 +204,4 @@ interactions: - text/event-stream status: 200 OK code: 200 - duration: 1.79521675s + duration: 1.527412458s diff --git a/providertests/testdata/TestOpenRouterThinking/anthropic/thinking.yaml b/providertests/testdata/TestOpenRouterThinking/anthropic/thinking.yaml index 56bf5836c..0b77ec9da 100644 --- a/providertests/testdata/TestOpenRouterThinking/anthropic/thinking.yaml +++ b/providertests/testdata/TestOpenRouterThinking/anthropic/thinking.yaml @@ -8,14 +8,14 @@ interactions: proto_minor: 1 content_length: 508 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"}],"model":"anthropic/claude-haiku-4.5","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"reasoning":{"effort":"medium"},"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"}],"model":"anthropic/claude-haiku-4.5","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"reasoning":{"effort":"medium"}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -24,28 +24,28 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945529-4x3WtegraF6F7Hx5vnXk\",\"object\":\"chat.completion\",\"created\":1773945529,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user is asking for the weather in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \\\"Florence, Italy\\\" or just \\\"Florence\\\" as the location.\\n\\nLet me call the weather function with \\\"Florence, Italy\\\" to get the weather information.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_011YAi4MUZaDYszc4HjpbhN2\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user is asking for the weather in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \\\"Florence, Italy\\\" or just \\\"Florence\\\" as the location.\\n\\nLet me call the weather function with \\\"Florence, Italy\\\" to get the weather information.\",\"format\":\"anthropic-claude-v1\",\"index\":0,\"signature\":\"EtsDCkgICxABGAIqQEwZWjOj3+xqUgNiHMa7PU5h2NpcWKGQ5Xz6Z2W6TpuQI8BawgtBcx2w3Ii+aO8SWxb9/FWh7QMQIxpC3V1N9hkSDBF9vqo23Di4tTYwfBoMdcIzCI5hZzhIYBWbIjCcfrx6oOoMUcCgm3R+Mh4goj6nQAzX4NbwlXUaXR0/QLr9IFLrsRIsTNen3kZec+EqwAIPgE2IdMn4w//171eA8fA6vJtlFtkOvwql1e/Znt+i/H4D1XA7wnBBzFJFNe7lXOEMWce3o9eAnzROAyTKtwEPCRVFySVgSWsl1YQ7wOEfT8fisVKp1fpKmpxnHz/gdFVoVE5FcuSMXaBg5fnNCzerUgv2GcImSr86WDSSuLhGiECmVPAeMeZU2zPUkKxIKJeDVxXotEX0MgpS2xZaq/GD/vgbi+DW5aVcSK+IAsSg55/wwwcR/aT95KO+ayT80adkVugVMIBr+CQfQZo40SjguNaxA55Fln6+WclcaRmVfeES54KeYWApJshca+93LwwwvOtpigqpoa0650ftVyLpvcr2dhxArg1K7tguv3wN6MDEvNflxRk3y2u010vPG/ycgT0Mkzs+TIPPlrz+a5S9yZzxUBfP+xKmyquEMTCQnhgB\"}]}}],\"usage\":{\"prompt_tokens\":607,\"completion_tokens\":126,\"total_tokens\":733,\"cost\":0.001237,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001237,\"upstream_inference_prompt_cost\":0.000607,\"upstream_inference_completions_cost\":0.00063},\"completion_tokens_details\":{\"reasoning_tokens\":78,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n{\"id\":\"gen-1777319947-Y45Z6u60MD4bK91UwvCd\",\"object\":\"chat.completion\",\"created\":1777319947,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_use\",\"message\":{\"role\":\"assistant\",\"content\":null,\"refusal\":null,\"reasoning\":\"The user is asking about the weather in Florence, Italy. I have access to a weather function that takes a location (city) as a parameter. I should call the weather function with \\\"Florence\\\" as the location.\",\"tool_calls\":[{\"type\":\"function\",\"index\":0,\"id\":\"toolu_bdrk_01AfMUr4SPqrUP7qb65GXqma\",\"function\":{\"name\":\"weather\",\"arguments\":\"{\\\"location\\\": \\\"Florence, Italy\\\"}\"}}],\"reasoning_details\":[{\"type\":\"reasoning.text\",\"text\":\"The user is asking about the weather in Florence, Italy. I have access to a weather function that takes a location (city) as a parameter. I should call the weather function with \\\"Florence\\\" as the location.\",\"format\":\"anthropic-claude-v1\",\"index\":0,\"signature\":\"EvgCCkgIDRABGAIqQKb/wFIBWhtfZLSnNhQwwG129YA/VzhXG3yrKKa8RDLsJF9Ou09wUxfl8aZAM4RrbMtgfJj0NqOwW6gR/IxJCaYSDCJGTmAZRCX8O6P0SxoMEclljJPZqUpkiTlSIjD8acYx0eq73rSidczytc6ya6Q2+Z6aQinyGI3qT0XFaNIuA5TjxTIo0eVOMfEl0k8q3QHMxOzt0C9P/6AgewciZFhw+tVmFCGWlzlbvNbHBKanZPOMVAA0p95QLWgZ0v1qbNGDaYlkL17bms+XBXmHNdZDBybYY4bjmFgiy60i90Ag/Kg8DxBfKET2tOMigbtJa1lpBc/e1m0QD/rR1UzqoKbvMg5NMqzdgARgEQS+udM6CnyXGcG3IrZS+HcBlp2CCBR9QKdhe+D+YX8xjuWF9UftT/H7xcx8E0Z24SFypKalibdT3jShS72rDdHShG6qFqwvIVzfCc932jEk9IDn0KBdK6Sj4ViB1+iEIAjfQhgB\"}]}}],\"usage\":{\"prompt_tokens\":607,\"completion_tokens\":105,\"total_tokens\":712,\"cost\":0.001132,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001132,\"upstream_inference_prompt_cost\":0.000607,\"upstream_inference_completions_cost\":0.000525},\"completion_tokens_details\":{\"reasoning_tokens\":52,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 5.523986875s + duration: 947.214916ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 2170 + content_length: 1824 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_011YAi4MUZaDYszc4HjpbhN2","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"anthropic-claude-v1","index":0,"signature":"EtsDCkgICxABGAIqQEwZWjOj3+xqUgNiHMa7PU5h2NpcWKGQ5Xz6Z2W6TpuQI8BawgtBcx2w3Ii+aO8SWxb9/FWh7QMQIxpC3V1N9hkSDBF9vqo23Di4tTYwfBoMdcIzCI5hZzhIYBWbIjCcfrx6oOoMUcCgm3R+Mh4goj6nQAzX4NbwlXUaXR0/QLr9IFLrsRIsTNen3kZec+EqwAIPgE2IdMn4w//171eA8fA6vJtlFtkOvwql1e/Znt+i/H4D1XA7wnBBzFJFNe7lXOEMWce3o9eAnzROAyTKtwEPCRVFySVgSWsl1YQ7wOEfT8fisVKp1fpKmpxnHz/gdFVoVE5FcuSMXaBg5fnNCzerUgv2GcImSr86WDSSuLhGiECmVPAeMeZU2zPUkKxIKJeDVxXotEX0MgpS2xZaq/GD/vgbi+DW5aVcSK+IAsSg55/wwwcR/aT95KO+ayT80adkVugVMIBr+CQfQZo40SjguNaxA55Fln6+WclcaRmVfeES54KeYWApJshca+93LwwwvOtpigqpoa0650ftVyLpvcr2dhxArg1K7tguv3wN6MDEvNflxRk3y2u010vPG/ycgT0Mkzs+TIPPlrz+a5S9yZzxUBfP+xKmyquEMTCQnhgB","text":"The user is asking for the weather in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \"Florence, Italy\" or just \"Florence\" as the location.\n\nLet me call the weather function with \"Florence, Italy\" to get the weather information.","type":"reasoning.text"}],"reasoning":"The user is asking for the weather in Florence, Italy. I have access to a weather function that takes a location parameter. I should call the weather function with \"Florence, Italy\" or just \"Florence\" as the location.\n\nLet me call the weather function with \"Florence, Italy\" to get the weather information."},{"content":"40 C","tool_call_id":"toolu_bdrk_011YAi4MUZaDYszc4HjpbhN2","role":"tool"}],"model":"anthropic/claude-haiku-4.5","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"reasoning":{"effort":"medium"},"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01AfMUr4SPqrUP7qb65GXqma","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_details":[{"format":"anthropic-claude-v1","index":0,"signature":"EvgCCkgIDRABGAIqQKb/wFIBWhtfZLSnNhQwwG129YA/VzhXG3yrKKa8RDLsJF9Ou09wUxfl8aZAM4RrbMtgfJj0NqOwW6gR/IxJCaYSDCJGTmAZRCX8O6P0SxoMEclljJPZqUpkiTlSIjD8acYx0eq73rSidczytc6ya6Q2+Z6aQinyGI3qT0XFaNIuA5TjxTIo0eVOMfEl0k8q3QHMxOzt0C9P/6AgewciZFhw+tVmFCGWlzlbvNbHBKanZPOMVAA0p95QLWgZ0v1qbNGDaYlkL17bms+XBXmHNdZDBybYY4bjmFgiy60i90Ag/Kg8DxBfKET2tOMigbtJa1lpBc/e1m0QD/rR1UzqoKbvMg5NMqzdgARgEQS+udM6CnyXGcG3IrZS+HcBlp2CCBR9QKdhe+D+YX8xjuWF9UftT/H7xcx8E0Z24SFypKalibdT3jShS72rDdHShG6qFqwvIVzfCc932jEk9IDn0KBdK6Sj4ViB1+iEIAjfQhgB","text":"The user is asking about the weather in Florence, Italy. I have access to a weather function that takes a location (city) as a parameter. I should call the weather function with \"Florence\" as the location.","type":"reasoning.text"}],"reasoning":"The user is asking about the weather in Florence, Italy. I have access to a weather function that takes a location (city) as a parameter. I should call the weather function with \"Florence\" as the location."},{"content":"40 C","tool_call_id":"toolu_bdrk_01AfMUr4SPqrUP7qb65GXqma","role":"tool"}],"model":"anthropic/claude-haiku-4.5","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"reasoning":{"effort":"medium"},"usage":{"include":true}}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.21.0 (https://charm.land/fantasy) url: https://openrouter.ai/api/v1/chat/completions method: POST response: @@ -54,10 +54,10 @@ interactions: proto_minor: 0 content_length: -1 uncompressed: true - body: "\n \n\n \n\n \n\n \n\n \n{\"id\":\"gen-1773945535-J1gXRWEKUu1J0LUdVpFo\",\"object\":\"chat.completion\",\"created\":1773945535,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**, which is quite hot! \\n\\nThat's typical for Florence during the summer months when temperatures can get quite warm. If you're planning to visit or are currently there, make sure to:\\n- Stay hydrated\\n- Wear light, breathable clothing\\n- Use sunscreen\\n- Try to explore during early morning or late evening hours to avoid the peak heat\\n\\nIs there anything else you'd like to know about the weather or Florence?\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":747,\"completion_tokens\":111,\"total_tokens\":858,\"cost\":0.001302,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001302,\"upstream_inference_prompt_cost\":0.000747,\"upstream_inference_completions_cost\":0.000555},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" + body: "\n \n\n \n\n \n{\"id\":\"gen-1777319948-7H6B4qcHtbG3hqFZquj6\",\"object\":\"chat.completion\",\"created\":1777319948,\"model\":\"anthropic/claude-4.5-haiku-20251001\",\"provider\":\"Amazon Bedrock\",\"system_fingerprint\":null,\"choices\":[{\"index\":0,\"logprobs\":null,\"finish_reason\":\"stop\",\"native_finish_reason\":\"end_turn\",\"message\":{\"role\":\"assistant\",\"content\":\"The weather in Florence, Italy is currently **40°C (104°F)**, which is quite hot! It's a warm day in Florence. Make sure to stay hydrated and take precautions against the heat if you're planning to visit or are already there.\",\"refusal\":null,\"reasoning\":null}}],\"usage\":{\"prompt_tokens\":727,\"completion_tokens\":59,\"total_tokens\":786,\"cost\":0.001022,\"is_byok\":false,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cache_write_tokens\":0,\"audio_tokens\":0,\"video_tokens\":0},\"cost_details\":{\"upstream_inference_cost\":0.001022,\"upstream_inference_prompt_cost\":0.000727,\"upstream_inference_completions_cost\":0.000295},\"completion_tokens_details\":{\"reasoning_tokens\":0,\"image_tokens\":0,\"audio_tokens\":0}}}" headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.309788583s + duration: 1.074211583s From ea03063390ae24b64a03ae19da4c733fd5623802 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 27 Apr 2026 17:14:36 -0300 Subject: [PATCH 29/95] v0.21.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 885415662..a67cebaf7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.21.0 +0.21.1 From 505a5b8c1ab57412bcb848c7a6855a4352368b26 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Wed, 29 Apr 2026 05:39:09 -0700 Subject: [PATCH 30/95] chore(deps): upgrade kronk to v1.24.0 (#218) --- go.mod | 20 ++++++++-------- go.sum | 52 ++++++++++++++++++++-------------------- providers/kronk/kronk.go | 17 ++++--------- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index 80a100dbc..4d5bc6bb9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.2 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.23.1 + github.com/ardanlabs/kronk v1.24.0 github.com/aws/aws-sdk-go-v2 v1.41.6 github.com/aws/aws-sdk-go-v2/config v1.32.16 github.com/aws/smithy-go v1.25.1 @@ -37,17 +37,17 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/ardanlabs/jinja v1.1.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.15 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 // indirect @@ -72,12 +72,12 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.12.0 // indirect + github.com/hybridgroup/yzma v1.13.0 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect github.com/kaptinlin/go-i18n v0.4.4 // indirect github.com/kaptinlin/jsonpointer v0.4.19 // indirect @@ -118,9 +118,9 @@ require ( golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.276.0 // indirect - google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect google.golang.org/grpc v1.80.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 6173777d7..9e8304c56 100644 --- a/go.sum +++ b/go.sum @@ -12,16 +12,16 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.9.0 h1:89wyjxT6DL4b5rk/Nk8eBC9DHqf+JiMstrn5IEYxFw4= cloud.google.com/go/iam v1.9.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/logging v1.15.0 h1:6ooUEBNT6jdWh2b36+iuPn6b/R9qN/tHCbvGS5255gg= -cloud.google.com/go/logging v1.15.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.10.0 h1:4OWvp1BjCvoeSZTog3sRFDu6j4IrI9TI4/Y9N+8h25g= -cloud.google.com/go/longrunning v0.10.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/logging v1.16.0 h1:MMNgYRvZ/pEwiNSkcoJTKWfAbAJDqCqAMJiarZx+/CI= +cloud.google.com/go/logging v1.16.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.11.0 h1:fE4XVLJQj+gRnw1HrbDyQXXgC0aiqY3wxP7DDU4cWk0= +cloud.google.com/go/longrunning v0.11.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.27.0 h1:BhYwMqao+e5Nn7JtWMM9m6zRtKtVUK6kJWMizXChkLU= cloud.google.com/go/monitoring v1.27.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= -cloud.google.com/go/trace v1.13.0 h1:RfqsqPOiSCG8ql50UZt5F65KrVa1zbY9mJrO7xvZfbE= -cloud.google.com/go/trace v1.13.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +cloud.google.com/go/trace v1.14.0 h1:jUtnmOrNcu5XJNk4Gz0fv+v5sM0weaOa3z5MPQUjRXs= +cloud.google.com/go/trace v1.14.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= 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= @@ -40,12 +40,12 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/ardanlabs/jinja v1.1.0 h1:SZtVrV+1szfSBXBKQA5FoJtOabUxkJu5IvEX+ADUtcM= github.com/ardanlabs/jinja v1.1.0/go.mod h1:onVec/ZOYPqNm7TRiNfJBnW+t9VxSi2gkARWhgP9qwQ= -github.com/ardanlabs/kronk v1.23.1 h1:5grtasj/ZIPHod0P9tG38RKZkRiOmLMjX2QwxpLzi8s= -github.com/ardanlabs/kronk v1.23.1/go.mod h1:a3FhTn4vz2tR0axNBCiG8SzFw33bN0WA9EBAK+YMYIE= +github.com/ardanlabs/kronk v1.24.0 h1:A5oEaMKHQFyh1jGGQb3nQUSCpd7bSLYGLx8jJ1FJvuo= +github.com/ardanlabs/kronk v1.24.0/go.mod h1:cdt6xRpBH8lfdNXHDPAJ2b9i4IhmY7Gc3KpJmV7nSO4= github.com/aws/aws-sdk-go-v2 v1.41.6 h1:1AX0AthnBQzMx1vbmir3Y4WsnJgiydmnJjiLu+LvXOg= github.com/aws/aws-sdk-go-v2 v1.41.6/go.mod h1:dy0UzBIfwSeot4grGvY1AqFWN5zgziMmWGzysDnHFcQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 h1:adBsCIIpLbLmYnkQU+nAChU5yhVTvu5PerROm+/Kq2A= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9/go.mod h1:uOYhgfgThm/ZyAuJGNQ5YgNyOlYfqnGpTHXvk3cpykg= github.com/aws/aws-sdk-go-v2/config v1.32.16 h1:Q0iQ7quUgJP0F/SCRTieScnaMdXr9h/2+wze1u3cNeM= github.com/aws/aws-sdk-go-v2/config v1.32.16/go.mod h1:duCCnJEFqpt2RC6no1iK6q+8HpwOAkiUua0pY507dQc= github.com/aws/aws-sdk-go-v2/credentials v1.19.15 h1:fyvgWTszojq8hEnMi8PPBTvZdTtEVmAVyo+NFLHBhH4= @@ -60,14 +60,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 h1:FPXsW9+gMuIeKmz7j6ENWcWtBGT github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23/go.mod h1:7J8iGMdRKk6lw2C+cMIphgAnT8uTwBwNOsGkyOCm80U= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 h1:HtOTYcbVcGABLOVuPYaIihj6IlkqubBwFj10K5fxRek= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8/go.mod h1:VsK9abqQeGlzPgUr+isNWzPlK2vKe9INMLWnY65f5Xs= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 h1:xnvDEnw+pnj5mctWiYuFbigrEzSm35x7k4KS/ZkCANg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14/go.mod h1:yS5rNogD8e0Wu9+l3MUwr6eENBzEeGejvINpN5PAYfY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 h1:PUmZeJU6Y1Lbvt9WFuJ0ugUK2xn6hIWUBBbKuOWF30s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22/go.mod h1:nO6egFBoAaoXze24a2C0NjQCvdpk8OueRoYimvEB9jo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0 h1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.99.0/go.mod h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 h1:SE+aQ4DEqG53RRCAIHlCf//B2ycxGH7jFkpnAh/kKPM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22/go.mod h1:ES3ynECd7fYeJIL6+oax+uIEljmfps0S70BaQzbMd/o= +github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 h1:7G26Sae6PMKn4kMcU5JzNfrm1YrKwyOhowXPYR2WiWY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0/go.mod h1:Fw9aqhJicIVee1VytBBjH+l+5ov6/PhbtIK/u3rt/ls= github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 h1:a1Fq/KXn75wSzoJaPQTgZO0wHGqE9mjFnylnqEPTchA= github.com/aws/aws-sdk-go-v2/service/signin v1.0.10/go.mod h1:p6+MXNxW7IA6dMgHfTAzljuwSKD0NCm/4lbS4t6+7vI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 h1:x6bKbmDhsgSZwv6q19wY/u3rLk/3FGjJWyqKcIRufpE= @@ -145,8 +145,8 @@ github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.12.0 h1:kRHZdzEQCuQaBCUx7AVWYqVUvTHw8qB6gp+9ORcryLg= -github.com/hybridgroup/yzma v1.12.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4GI= +github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= @@ -267,12 +267,12 @@ google.golang.org/api v0.276.0 h1:nVArUtfLEihtW+b0DdcqRGK1xoEm2+ltAihyztq7MKY= google.golang.org/api v0.276.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= google.golang.org/genai v1.54.0 h1:ZQCa70WMTJDI11FdqWCzGvZ5PanpcpfoO6jl/lrSnGU= google.golang.org/genai v1.54.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478 h1:aLsVTW0lZ8+IY5u/ERjZSCvAmhuR7slKzyha3YikDNA= -google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478/go.mod h1:YJAzKjfHIUHb9T+bfu8L7mthAp7VVXQBUs1PLdBWS7M= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= -google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 h1:2iMJZntwvmfgtse+s744JY7v7PgEdSBuFYXucvpOHNM= +google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:v14kaaboYyXQ1Gsu489Q+Hg/oN4B33mWtuOhF1HCeXA= +google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 h1:yOzSCGPx+cp5VO7IxvZ9SBFF7j1tZVcNtlHR2iYKtVo= +google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:Q9HWtNeE7tM9npdIsEvqXj1QJIvVoeAV3rtXtS715Cw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 h1:tEkOQcXgF6dH1G+MVKZrfpYvozGrzb91k6ha7jireSM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/providers/kronk/kronk.go b/providers/kronk/kronk.go index 8f7c8815a..6c698f7f1 100644 --- a/providers/kronk/kronk.go +++ b/providers/kronk/kronk.go @@ -9,7 +9,7 @@ import ( "charm.land/fantasy" "github.com/ardanlabs/kronk/sdk/kronk" - "github.com/ardanlabs/kronk/sdk/tools/catalog" + "github.com/ardanlabs/kronk/sdk/kronk/model" "github.com/ardanlabs/kronk/sdk/tools/libs" "github.com/ardanlabs/kronk/sdk/tools/models" ) @@ -102,7 +102,7 @@ func (p *provider) Close(ctx context.Context) error { return nil } -func (p *provider) installSystem(ctx context.Context, modelURL string) (models.Path, error) { +func (p *provider) installSystem(ctx context.Context, modelSource string) (models.Path, error) { logger := p.options.logger if logger == nil { logger = func(context.Context, string, ...any) {} @@ -117,21 +117,12 @@ func (p *provider) installSystem(ctx context.Context, modelURL string) (models.P return models.Path{}, fmt.Errorf("unable to install llama.cpp: %w", err) } - ctlg, err := catalog.New() - if err != nil { - return models.Path{}, fmt.Errorf("unable to create catalog system: %w", err) - } - - if err := ctlg.Download(ctx); err != nil { - return models.Path{}, fmt.Errorf("unable to download catalog: %w", err) - } - mdls, err := models.New() if err != nil { return models.Path{}, fmt.Errorf("unable to create models: %w", err) } - mp, err := mdls.Download(ctx, models.Logger(logger), modelURL, "") + mp, err := mdls.Download(ctx, models.Logger(logger), modelSource) if err != nil { return models.Path{}, fmt.Errorf("unable to install model: %w", err) } @@ -147,7 +138,7 @@ func (p *provider) newKronk(mp models.Path) (*kronk.Kronk, error) { cfg := p.options.modelConfig cfg.ModelFiles = mp.ModelFiles - krn, err := kronk.New(cfg) + krn, err := kronk.New(model.WithConfig(cfg)) if err != nil { return nil, fmt.Errorf("unable to create inference model: %w", err) } From d73b308628f5a2750c872ce80f283639a83ae4d1 Mon Sep 17 00:00:00 2001 From: Lauri Jutila Date: Wed, 29 Apr 2026 15:42:09 +0300 Subject: [PATCH 31/95] fix(anthropic): preserve `tool_use` when `ToolCallPart.Input` is empty or malformed (#219) json.Unmarshal("", &m) errors and previously caused the tool_use to be silently dropped in toPrompt, leaving the matching tool_result orphaned in the next user message. The Anthropic API then rejects the request with "tool_result must have a corresponding tool_use in the previous message". Default empty/whitespace input to {} (and nil for the server_tool_use branch); on malformed-but-non-empty input, emit {} + a CallWarning rather than dropping the block. Hit in the wild via DeepSeek's anthropic-compat endpoint, which emits empty input for parameterless tool calls. --- providers/anthropic/anthropic.go | 60 +++++++++++++++++++++++---- providers/anthropic/anthropic_test.go | 57 +++++++++++++++++++++++-- 2 files changed, 106 insertions(+), 11 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 882a22c9c..2760b0d71 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -999,10 +999,9 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl if toolCall.ProviderExecuted { // Reconstruct server_tool_use block for // multi-turn round-tripping. - var inputAny any - err := json.Unmarshal([]byte(toolCall.Input), &inputAny) - if err != nil { - continue + inputAny, warning := decodeToolCallInputAny(toolCall) + if warning != nil { + warnings = append(warnings, *warning) } anthropicContent = append(anthropicContent, anthropic.ContentBlockParamUnion{ OfServerToolUse: &anthropic.ServerToolUseBlockParam{ @@ -1013,10 +1012,9 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl }) continue } - var inputMap map[string]any - err := json.Unmarshal([]byte(toolCall.Input), &inputMap) - if err != nil { - continue + inputMap, warning := decodeToolCallInputMap(toolCall) + if warning != nil { + warnings = append(warnings, *warning) } toolUseBlock := anthropic.NewToolUseBlock(toolCall.ToolCallID, inputMap, toolCall.ToolName) if cacheControl != nil { @@ -1077,6 +1075,52 @@ func hasVisibleAssistantContent(content []anthropic.ContentBlockParamUnion) bool return false } +// decodeToolCallInputMap unmarshals a ToolCallPart.Input into a map for +// reconstructing an Anthropic tool_use block. The Anthropic API rejects any +// request whose tool_result lacks a matching tool_use in the previous +// message, so this helper never drops the block: empty input becomes {}, +// and malformed input falls back to {} with a CallWarning. The caller still +// emits a tool_use block with the original ToolCallID, preserving the pair. +func decodeToolCallInputMap(toolCall fantasy.ToolCallPart) (map[string]any, *fantasy.CallWarning) { + if strings.TrimSpace(toolCall.Input) == "" { + return map[string]any{}, nil + } + var inputMap map[string]any + if err := json.Unmarshal([]byte(toolCall.Input), &inputMap); err != nil { + return map[string]any{}, &fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf( + "tool call %q has malformed input JSON; emitting empty arguments to preserve tool_use ↔ tool_result pairing: %s", + toolCall.ToolCallID, err, + ), + } + } + if inputMap == nil { + return map[string]any{}, nil + } + return inputMap, nil +} + +// decodeToolCallInputAny is the server_tool_use counterpart to +// decodeToolCallInputMap. ServerToolUseBlockParam.Input has type `any` so +// nil is acceptable for the empty case. +func decodeToolCallInputAny(toolCall fantasy.ToolCallPart) (any, *fantasy.CallWarning) { + if strings.TrimSpace(toolCall.Input) == "" { + return nil, nil + } + var inputAny any + if err := json.Unmarshal([]byte(toolCall.Input), &inputAny); err != nil { + return nil, &fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf( + "server tool call %q has malformed input JSON; emitting empty arguments to preserve tool_use ↔ tool_result pairing: %s", + toolCall.ToolCallID, err, + ), + } + } + return inputAny, nil +} + // buildWebSearchToolResultBlock constructs an Anthropic // web_search_tool_result content block from structured metadata. func buildWebSearchToolResultBlock(toolCallID string, searchMeta *WebSearchResultMetadata) anthropic.ContentBlockParamUnion { diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 69c41f94f..219171c0b 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -176,9 +176,14 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) }) - t.Run("should drop assistant messages with invalid tool input", func(t *testing.T) { + t.Run("should preserve tool_use block when input JSON is malformed", func(t *testing.T) { t.Parallel() + // Anthropic's API rejects any request whose tool_result lacks a + // matching tool_use in the previous message. Dropping the tool_use + // because its input failed to parse leaves the next turn's + // tool_result orphaned and produces a 400. Emit the block with + // empty arguments instead, and surface the parse error as a warning. prompt := fantasy.Prompt{ { Role: fantasy.MessageRoleUser, @@ -201,10 +206,56 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { systemBlocks, messages, warnings := toPrompt(prompt, true) require.Empty(t, systemBlocks) - require.Len(t, messages, 1, "should only have user message") + require.Len(t, messages, 2, "user + assistant — assistant must be preserved so tool_result can pair") + assistant := messages[1] + require.Equal(t, anthropic.MessageParamRoleAssistant, assistant.Role) + require.Len(t, assistant.Content, 1) + toolUse := assistant.Content[0].OfToolUse + require.NotNil(t, toolUse, "tool_use block should be emitted even when input is malformed") + require.Equal(t, "call_123", toolUse.ID) + require.Equal(t, "get_weather", toolUse.Name) require.Len(t, warnings, 1) require.Equal(t, fantasy.CallWarningTypeOther, warnings[0].Type) - require.Contains(t, warnings[0].Message, "dropping empty assistant message") + require.Contains(t, warnings[0].Message, "malformed input JSON") + require.Contains(t, warnings[0].Message, "call_123") + }) + + t.Run("should preserve tool_use block when input is empty", func(t *testing.T) { + t.Parallel() + + // Some upstream providers (notably DeepSeek's anthropic-compat + // endpoint) emit tool_use blocks with empty input for parameterless + // tool calls. Treat empty input as {} rather than dropping the + // block, since the next turn's tool_result still needs its pair. + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Hi"}, + }, + }, + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ + ToolCallID: "call_empty", + ToolName: "ping", + Input: "", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Empty(t, warnings, "empty input is a valid round-trip; no warning") + require.Len(t, messages, 2) + require.Equal(t, anthropic.MessageParamRoleAssistant, messages[1].Role) + toolUse := messages[1].Content[0].OfToolUse + require.NotNil(t, toolUse) + require.Equal(t, "call_empty", toolUse.ID) + require.Equal(t, "ping", toolUse.Name) }) t.Run("should keep assistant messages with reasoning and text", func(t *testing.T) { From b2f723073617a47c156a60f853c04834b1c3f36f Mon Sep 17 00:00:00 2001 From: fwang2002 Date: Wed, 29 Apr 2026 20:44:27 +0800 Subject: [PATCH 32/95] fix(openai,openaicompat): apply `WithName` to provider lookup and `Name()` (#212) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The openaicompat PrepareCallFunc looked up ProviderOptions using the hardcoded "openai-compat" key, so any name supplied via WithName was silently ignored — users could not key their per-call options under a custom provider name. Switch the lookup to model.Provider() so it matches whatever name was configured. Similarly, the openai provider's Name() method always returned the hardcoded "openai" constant, discarding the value passed to WithName. Return o.options.name instead so the configured name is reported consistently. Co-authored-by: wangfeng01 --- providers/openai/openai.go | 2 +- providers/openaicompat/language_model_hooks.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/openai/openai.go b/providers/openai/openai.go index 51ebf4845..29a909426 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -200,5 +200,5 @@ func (o *provider) LanguageModel(_ context.Context, modelID string) (fantasy.Lan } func (o *provider) Name() string { - return Name + return o.options.name } diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index e6018b489..d2e77af1b 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -16,9 +16,9 @@ import ( const reasoningStartedCtx = "reasoning_started" // PrepareCallFunc prepares the call for the language model. -func PrepareCallFunc(_ fantasy.LanguageModel, params *openaisdk.ChatCompletionNewParams, call fantasy.Call) ([]fantasy.CallWarning, error) { +func PrepareCallFunc(model fantasy.LanguageModel, params *openaisdk.ChatCompletionNewParams, call fantasy.Call) ([]fantasy.CallWarning, error) { providerOptions := &ProviderOptions{} - if v, ok := call.ProviderOptions[Name]; ok { + if v, ok := call.ProviderOptions[model.Provider()]; ok { providerOptions, ok = v.(*ProviderOptions) if !ok { return nil, &fantasy.Error{Title: "invalid argument", Message: "openai-compat provider options should be *openaicompat.ProviderOptions"} From 966aa604320a46f6e86977ec15fb7cfde16fa527 Mon Sep 17 00:00:00 2001 From: fwang2002 Date: Wed, 29 Apr 2026 20:47:15 +0800 Subject: [PATCH 33/95] feat(agent): add `ToolChoice` to `AgentCall`, `AgentStreamCall`, and `WithToolChoice` option (#213) Previously ToolChoice could only be set via PrepareStep. Expose it as a first-class field on AgentCall/AgentStreamCall and a WithToolChoice agent option, mirroring how Temperature, TopP, and other call params are surfaced. Precedence: PrepareStep > call.ToolChoice > WithToolChoice > ToolChoiceAuto. Co-authored-by: wangfeng01 --- agent.go | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/agent.go b/agent.go index 01912bbf3..62e219457 100644 --- a/agent.go +++ b/agent.go @@ -146,6 +146,7 @@ type agentSettings struct { providerDefinedTools []ProviderDefinedTool executableProviderTools []ExecutableProviderTool tools []AgentTool + toolChoice *ToolChoice maxRetries *int model LanguageModel @@ -162,12 +163,13 @@ type AgentCall struct { Files []FilePart `json:"files"` Messages []Message `json:"messages"` MaxOutputTokens *int64 - Temperature *float64 `json:"temperature"` - TopP *float64 `json:"top_p"` - TopK *int64 `json:"top_k"` - PresencePenalty *float64 `json:"presence_penalty"` - FrequencyPenalty *float64 `json:"frequency_penalty"` - ActiveTools []string `json:"active_tools"` + Temperature *float64 `json:"temperature"` + TopP *float64 `json:"top_p"` + TopK *int64 `json:"top_k"` + PresencePenalty *float64 `json:"presence_penalty"` + FrequencyPenalty *float64 `json:"frequency_penalty"` + ActiveTools []string `json:"active_tools"` + ToolChoice *ToolChoice `json:"tool_choice"` ProviderOptions ProviderOptions OnRetry OnRetryCallback MaxRetries *int @@ -252,12 +254,13 @@ type AgentStreamCall struct { Files []FilePart `json:"files"` Messages []Message `json:"messages"` MaxOutputTokens *int64 - Temperature *float64 `json:"temperature"` - TopP *float64 `json:"top_p"` - TopK *int64 `json:"top_k"` - PresencePenalty *float64 `json:"presence_penalty"` - FrequencyPenalty *float64 `json:"frequency_penalty"` - ActiveTools []string `json:"active_tools"` + Temperature *float64 `json:"temperature"` + TopP *float64 `json:"top_p"` + TopK *int64 `json:"top_k"` + PresencePenalty *float64 `json:"presence_penalty"` + FrequencyPenalty *float64 `json:"frequency_penalty"` + ActiveTools []string `json:"active_tools"` + ToolChoice *ToolChoice `json:"tool_choice"` Headers map[string]string ProviderOptions ProviderOptions OnRetry OnRetryCallback @@ -335,6 +338,7 @@ func (a *agent) prepareCall(call AgentCall) AgentCall { call.PresencePenalty = cmp.Or(call.PresencePenalty, a.settings.presencePenalty) call.FrequencyPenalty = cmp.Or(call.FrequencyPenalty, a.settings.frequencyPenalty) call.MaxRetries = cmp.Or(call.MaxRetries, a.settings.maxRetries) + call.ToolChoice = cmp.Or(call.ToolChoice, a.settings.toolChoice) if len(call.StopWhen) == 0 && len(a.settings.stopWhen) > 0 { call.StopWhen = a.settings.stopWhen @@ -383,6 +387,9 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err stepSystemPrompt := a.settings.systemPrompt stepActiveTools := opts.ActiveTools stepToolChoice := ToolChoiceAuto + if opts.ToolChoice != nil { + stepToolChoice = *opts.ToolChoice + } disableAllTools := false stepTools := a.settings.tools if opts.PrepareStep != nil { @@ -787,6 +794,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, PresencePenalty: opts.PresencePenalty, FrequencyPenalty: opts.FrequencyPenalty, ActiveTools: opts.ActiveTools, + ToolChoice: opts.ToolChoice, ProviderOptions: opts.ProviderOptions, MaxRetries: opts.MaxRetries, OnRetry: opts.OnRetry, @@ -817,6 +825,9 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, stepSystemPrompt := a.settings.systemPrompt stepActiveTools := call.ActiveTools stepToolChoice := ToolChoiceAuto + if call.ToolChoice != nil { + stepToolChoice = *call.ToolChoice + } disableAllTools := false stepTools := a.settings.tools // Apply step preparation if provided @@ -1206,6 +1217,14 @@ func WithProviderDefinedTools(tools ...ProviderTool) AgentOption { } } +// WithToolChoice sets the default tool choice for the agent. It is overridden +// by the ToolChoice on a specific call, and by PrepareStep at the step level. +func WithToolChoice(choice ToolChoice) AgentOption { + return func(s *agentSettings) { + s.toolChoice = &choice + } +} + // WithStopConditions sets the stop conditions for the agent. func WithStopConditions(conditions ...StopCondition) AgentOption { return func(s *agentSettings) { From 6dbd4f52580682aef81f390c0a121da550706f70 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 29 Apr 2026 09:53:32 -0300 Subject: [PATCH 34/95] v0.22.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index a67cebaf7..215740905 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.21.1 +0.22.0 From ea8f291585c7447feda734c02ecf90eff226838f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 30 Apr 2026 12:49:11 -0400 Subject: [PATCH 35/95] fix(openai): handle media tool results (#221) This fix applies to media tool results for every downstream provider that builds on `providers/openai` (Hyper, OpenRouter, Vercel, MiniMax, Copilot, Azure, `openai-compat`). Tool results with image or audio content fell through the MessageRoleTool switch in both the Chat Completions and Responses paths, leaving a dangling `tool_call` with no matching tool message and 400-ing every subsequent turn. This fix emit a text tool message with a placeholder so the pairing stays valid, then attaches the media in a synthetic follow-up user message so vision and audio-capable models still see it. It will also warn on unknown tool result content types so new variants can't silently drop messages again. --- providers/openai/language_model_hooks.go | 70 ++++++ providers/openai/responses_language_model.go | 42 ++++ providers/openai/tool_result_media_test.go | 247 +++++++++++++++++++ 3 files changed, 359 insertions(+) create mode 100644 providers/openai/tool_result_media_test.go diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index e1131bc77..7da22c9dc 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -564,6 +564,41 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio continue } messages = append(messages, openai.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID)) + case fantasy.ToolResultContentTypeMedia: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](toolResultPart.Output) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool result output does not have the right type", + }) + continue + } + // OpenAI Chat Completions tool messages cannot carry image + // or audio content directly; the SDK's content union only + // accepts text. To keep the tool_call/tool_result pairing + // valid while still surfacing the media to vision-capable + // models, emit a text tool message with a placeholder (or + // any accompanying text) and follow it with a synthetic + // user message holding the actual media content part. + placeholder := output.Text + if placeholder == "" { + placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) + } + messages = append(messages, openai.ToolMessage(placeholder, toolResultPart.ToolCallID)) + mediaPart, mediaWarning, emit := toolResultMediaUserPart(output) + if mediaWarning != nil { + warnings = append(warnings, *mediaWarning) + } + if emit { + messages = append(messages, openai.UserMessage( + []openai.ChatCompletionContentPartUnionParam{mediaPart}, + )) + } + default: + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result output type %q not supported", toolResultPart.Output.GetType()), + }) } } } @@ -571,6 +606,41 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio return messages, warnings } +// toolResultMediaUserPart maps a tool-result media output to an OpenAI chat +// completions user content part. It returns the content part, an optional +// warning, and whether the caller should emit the returned part. +func toolResultMediaUserPart(output fantasy.ToolResultOutputContentMedia) (openai.ChatCompletionContentPartUnionParam, *fantasy.CallWarning, bool) { + switch { + case strings.HasPrefix(output.MediaType, "image/"): + data := "data:" + output.MediaType + ";base64," + output.Data + imageBlock := openai.ChatCompletionContentPartImageParam{ + ImageURL: openai.ChatCompletionContentPartImageImageURLParam{URL: data}, + } + return openai.ChatCompletionContentPartUnionParam{OfImageURL: &imageBlock}, nil, true + case output.MediaType == "audio/wav": + audioBlock := openai.ChatCompletionContentPartInputAudioParam{ + InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ + Data: output.Data, + Format: "wav", + }, + } + return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true + case output.MediaType == "audio/mpeg" || output.MediaType == "audio/mp3": + audioBlock := openai.ChatCompletionContentPartInputAudioParam{ + InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ + Data: output.Data, + Format: "mp3", + }, + } + return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true + default: + return openai.ChatCompletionContentPartUnionParam{}, &fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result media type %s not supported, sending text placeholder only", output.MediaType), + }, false + } +} + func hasVisibleUserContent(content []openai.ChatCompletionContentPartUnionParam) bool { for _, part := range content { if part.OfText != nil || part.OfImageURL != nil || part.OfInputAudio != nil || part.OfFile != nil { diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index bd61a68ba..06da0aa6e 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -611,6 +611,7 @@ func toResponsesPrompt(prompt fantasy.Prompt, systemMessageMode string, store bo } var outputStr string + var followupParts responses.ResponseInputMessageContentListParam switch toolResultPart.Output.GetType() { case fantasy.ToolResultContentTypeText: @@ -633,9 +634,50 @@ func toResponsesPrompt(prompt fantasy.Prompt, systemMessageMode string, store bo continue } outputStr = output.Error.Error() + case fantasy.ToolResultContentTypeMedia: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](toolResultPart.Output) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool result output does not have the right type", + }) + continue + } + // The Responses API function_call_output only accepts a + // string. Emit a text placeholder (preserving any + // accompanying text) so the tool_call/tool_result pairing + // stays valid, then attach the media as a synthetic user + // input_image so vision-capable models still receive it. + outputStr = output.Text + if outputStr == "" { + outputStr = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) + } + if strings.HasPrefix(output.MediaType, "image/") { + imageURL := fmt.Sprintf("data:%s;base64,%s", output.MediaType, output.Data) + followupParts = append(followupParts, responses.ResponseInputContentUnionParam{ + OfInputImage: &responses.ResponseInputImageParam{ + Type: "input_image", + ImageURL: param.NewOpt(imageURL), + }, + }) + } else { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result media type %s not supported, sending text placeholder only", output.MediaType), + }) + } + default: + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result output type %q not supported", toolResultPart.Output.GetType()), + }) + continue } input = append(input, responses.ResponseInputItemParamOfFunctionCallOutput(toolResultPart.ToolCallID, outputStr)) + if len(followupParts) > 0 { + input = append(input, responses.ResponseInputItemParamOfMessage(followupParts, responses.EasyInputMessageRoleUser)) + } } } } diff --git a/providers/openai/tool_result_media_test.go b/providers/openai/tool_result_media_test.go new file mode 100644 index 000000000..cc7424cf0 --- /dev/null +++ b/providers/openai/tool_result_media_test.go @@ -0,0 +1,247 @@ +package openai + +import ( + "encoding/base64" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// Tool messages in the OpenAI Chat Completions API cannot carry image or audio +// content directly — the SDK's content union only accepts text. When a tool +// returns media, DefaultToPrompt must still emit a text tool message so the +// tool_call/tool_result pairing stays valid, and attach the media to a +// synthetic follow-up user message so vision- and audio-capable models can see +// it. + +func TestDefaultToPrompt_MediaToolResult_ImagePNG(t *testing.T) { + t.Parallel() + + imageData := base64.StdEncoding.EncodeToString([]byte{0, 1, 2, 3}) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "img-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: imageData, + MediaType: "image/png", + }, + }, + }, + }, + } + + messages, warnings := DefaultToPrompt(prompt, "openrouter", "anthropic/claude-opus-4.7") + + require.Empty(t, warnings) + // Assistant tool call + text tool message + synthetic user image message. + require.Len(t, messages, 3) + + toolMsg := messages[1].OfTool + require.NotNil(t, toolMsg) + require.Equal(t, "img-1", toolMsg.ToolCallID) + require.Contains(t, toolMsg.Content.OfString.Value, "image/png") + + userMsg := messages[2].OfUser + require.NotNil(t, userMsg) + require.Len(t, userMsg.Content.OfArrayOfContentParts, 1) + imagePart := userMsg.Content.OfArrayOfContentParts[0].OfImageURL + require.NotNil(t, imagePart) + require.Equal(t, "data:image/png;base64,"+imageData, imagePart.ImageURL.URL) +} + +func TestDefaultToPrompt_MediaToolResult_PrefersAccompanyingText(t *testing.T) { + t.Parallel() + + imageData := base64.StdEncoding.EncodeToString([]byte{9, 9, 9}) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-2", ToolName: "view", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "img-2", + Output: fantasy.ToolResultOutputContentMedia{ + Data: imageData, + MediaType: "image/jpeg", + Text: "Screenshot of the blockquote element.", + }, + }, + }, + }, + } + + messages, warnings := DefaultToPrompt(prompt, "openrouter", "anthropic/claude-opus-4.7") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.Equal(t, "Screenshot of the blockquote element.", messages[1].OfTool.Content.OfString.Value) +} + +func TestDefaultToPrompt_MediaToolResult_AudioWAV(t *testing.T) { + t.Parallel() + + audio := base64.StdEncoding.EncodeToString([]byte("fake-wav-bytes")) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "audio-1", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "audio-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: audio, + MediaType: "audio/wav", + }, + }, + }, + }, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-4o-audio") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.NotNil(t, messages[1].OfTool) + userMsg := messages[2].OfUser + require.NotNil(t, userMsg) + require.Len(t, userMsg.Content.OfArrayOfContentParts, 1) + audioPart := userMsg.Content.OfArrayOfContentParts[0].OfInputAudio + require.NotNil(t, audioPart) + require.Equal(t, audio, audioPart.InputAudio.Data) + require.Equal(t, "wav", audioPart.InputAudio.Format) +} + +func TestDefaultToPrompt_MediaToolResult_UnsupportedMediaType(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "vid-1", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "vid-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: "AAAA", + MediaType: "video/mp4", + }, + }, + }, + }, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-5") + + // Assistant tool call + text tool message, but no synthetic user image. + require.Len(t, messages, 2) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "vid-1", messages[1].OfTool.ToolCallID) + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "video/mp4") +} + +func TestToResponsesPrompt_MediaToolResult_ImagePNG(t *testing.T) { + t.Parallel() + + imageData := base64.StdEncoding.EncodeToString([]byte{7, 7, 7, 7}) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-resp-1", ToolName: "view", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "img-resp-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: imageData, + MediaType: "image/png", + }, + }, + }, + }, + } + + input, warnings := toResponsesPrompt(prompt, "system", false) + + require.Empty(t, warnings) + // Assistant function call + function_call_output + synthetic user image + // message. + require.Len(t, input, 3) + + funcOut := input[1].OfFunctionCallOutput + require.NotNil(t, funcOut) + require.Equal(t, "img-resp-1", funcOut.CallID) + require.Contains(t, funcOut.Output.OfString.Value, "image/png") + + userMsg := input[2].OfMessage + require.NotNil(t, userMsg) + parts := userMsg.Content.OfInputItemContentList + require.Len(t, parts, 1) + imagePart := parts[0].OfInputImage + require.NotNil(t, imagePart) + require.Equal(t, "data:image/png;base64,"+imageData, imagePart.ImageURL.Value) +} + +func TestToResponsesPrompt_MediaToolResult_UnsupportedMediaType(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "vid-resp-1", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "vid-resp-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: "AAAA", + MediaType: "video/mp4", + }, + }, + }, + }, + } + + input, warnings := toResponsesPrompt(prompt, "system", false) + + // Assistant function call + function_call_output, but no synthetic user + // image message. + require.Len(t, input, 2) + require.NotNil(t, input[1].OfFunctionCallOutput) + require.Equal(t, "vid-resp-1", input[1].OfFunctionCallOutput.CallID) + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "video/mp4") +} From 792d186f5720b55339baf89bda3b34bdddd8a9d8 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 30 Apr 2026 13:50:45 -0300 Subject: [PATCH 36/95] feat: add `ExtraBody` provider option to openai-compat (#220) This was already present to some other providers, like Vercel and OpenRouter. --- providers/openaicompat/language_model_hooks.go | 3 +++ providers/openaicompat/provider_options.go | 1 + 2 files changed, 4 insertions(+) diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index d2e77af1b..5ffefb692 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -47,6 +47,9 @@ func PrepareCallFunc(model fantasy.LanguageModel, params *openaisdk.ChatCompleti if providerOptions.User != nil { params.User = param.NewOpt(*providerOptions.User) } + if len(providerOptions.ExtraBody) > 0 { + params.SetExtraFields(providerOptions.ExtraBody) + } return nil, nil } diff --git a/providers/openaicompat/provider_options.go b/providers/openaicompat/provider_options.go index 561860c32..1c5662c3c 100644 --- a/providers/openaicompat/provider_options.go +++ b/providers/openaicompat/provider_options.go @@ -28,6 +28,7 @@ func init() { type ProviderOptions struct { User *string `json:"user"` ReasoningEffort *openai.ReasoningEffort `json:"reasoning_effort"` + ExtraBody map[string]any `json:"extra_body,omitempty"` } // ReasoningData represents reasoning data for OpenAI-compatible provider. From f9f1cf6600e5c6e30af5fc4c6e508575a4d5153f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 30 Apr 2026 13:52:36 -0300 Subject: [PATCH 37/95] v0.23.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 215740905..ca222b7cf 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.22.0 +0.23.0 From 54c9dd50ecee61df3fe7b1d0ce80f9d447b95ef4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 10:41:44 +0000 Subject: [PATCH 38/95] chore(deps): bump the all group with 4 updates (#225) Bumps the all group with 4 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2), [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2` from 1.41.6 to 1.41.7 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.41.6...v1.41.7) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.16 to 1.32.17 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.16...config/v1.32.17) Updates `github.com/kaptinlin/jsonschema` from 0.7.11 to 0.7.13 - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.11...v0.7.13) Updates `google.golang.org/genai` from 1.54.0 to 1.55.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.54.0...v1.55.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.41.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.17 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.7.13 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.55.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 36 ++++++++++++++--------------- go.sum | 72 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/go.mod b/go.mod index 4d5bc6bb9..1ea71e402 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.24.0 - github.com/aws/aws-sdk-go-v2 v1.41.6 - github.com/aws/aws-sdk-go-v2/config v1.32.16 + github.com/aws/aws-sdk-go-v2 v1.41.7 + github.com/aws/aws-sdk-go-v2/config v1.32.17 github.com/aws/smithy-go v1.25.1 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 @@ -17,10 +17,10 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.11 + github.com/kaptinlin/jsonschema v0.7.13 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.54.0 + google.golang.org/genai v1.55.0 ) require ( @@ -38,20 +38,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/ardanlabs/jinja v1.1.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.15 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -63,7 +63,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 // indirect + github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -79,8 +79,8 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.13.0 // indirect github.com/jupiterrider/ffi v0.6.0 // indirect - github.com/kaptinlin/go-i18n v0.4.4 // indirect - github.com/kaptinlin/jsonpointer v0.4.19 // indirect + github.com/kaptinlin/go-i18n v0.4.5 // indirect + github.com/kaptinlin/jsonpointer v0.4.20 // indirect github.com/kaptinlin/messageformat-go v0.6.0 // indirect github.com/klauspost/compress v1.18.5 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect diff --git a/go.sum b/go.sum index 9e8304c56..2fd5762da 100644 --- a/go.sum +++ b/go.sum @@ -42,40 +42,40 @@ github.com/ardanlabs/jinja v1.1.0 h1:SZtVrV+1szfSBXBKQA5FoJtOabUxkJu5IvEX+ADUtcM github.com/ardanlabs/jinja v1.1.0/go.mod h1:onVec/ZOYPqNm7TRiNfJBnW+t9VxSi2gkARWhgP9qwQ= github.com/ardanlabs/kronk v1.24.0 h1:A5oEaMKHQFyh1jGGQb3nQUSCpd7bSLYGLx8jJ1FJvuo= github.com/ardanlabs/kronk v1.24.0/go.mod h1:cdt6xRpBH8lfdNXHDPAJ2b9i4IhmY7Gc3KpJmV7nSO4= -github.com/aws/aws-sdk-go-v2 v1.41.6 h1:1AX0AthnBQzMx1vbmir3Y4WsnJgiydmnJjiLu+LvXOg= -github.com/aws/aws-sdk-go-v2 v1.41.6/go.mod h1:dy0UzBIfwSeot4grGvY1AqFWN5zgziMmWGzysDnHFcQ= +github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= +github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 h1:adBsCIIpLbLmYnkQU+nAChU5yhVTvu5PerROm+/Kq2A= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9/go.mod h1:uOYhgfgThm/ZyAuJGNQ5YgNyOlYfqnGpTHXvk3cpykg= -github.com/aws/aws-sdk-go-v2/config v1.32.16 h1:Q0iQ7quUgJP0F/SCRTieScnaMdXr9h/2+wze1u3cNeM= -github.com/aws/aws-sdk-go-v2/config v1.32.16/go.mod h1:duCCnJEFqpt2RC6no1iK6q+8HpwOAkiUua0pY507dQc= -github.com/aws/aws-sdk-go-v2/credentials v1.19.15 h1:fyvgWTszojq8hEnMi8PPBTvZdTtEVmAVyo+NFLHBhH4= -github.com/aws/aws-sdk-go-v2/credentials v1.19.15/go.mod h1:gJiYyMOjNg8OEdRWOf3CrFQxM2a98qmrtjx1zuiQfB8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 h1:IOGsJ1xVWhsi+ZO7/NW8OuZZBtMJLZbk4P5HDjJO0jQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22/go.mod h1:b+hYdbU+jGKfXE8kKM6g1+h+L/Go3vMvzlxBsiuGsxg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 h1:GmLa5Kw1ESqtFpXsx5MmC84QWa/ZrLZvlJGa2y+4kcQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22/go.mod h1:6sW9iWm9DK9YRpRGga/qzrzNLgKpT2cIxb7Vo2eNOp0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 h1:dY4kWZiSaXIzxnKlj17nHnBcXXBfac6UlsAx2qL6XrU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22/go.mod h1:KIpEUx0JuRZLO7U6cbV204cWAEco2iC3l061IxlwLtI= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 h1:FPXsW9+gMuIeKmz7j6ENWcWtBGTe1kH8r9thNt5Uxx4= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23/go.mod h1:7J8iGMdRKk6lw2C+cMIphgAnT8uTwBwNOsGkyOCm80U= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 h1:HtOTYcbVcGABLOVuPYaIihj6IlkqubBwFj10K5fxRek= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8/go.mod h1:VsK9abqQeGlzPgUr+isNWzPlK2vKe9INMLWnY65f5Xs= +github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= +github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 h1:xnvDEnw+pnj5mctWiYuFbigrEzSm35x7k4KS/ZkCANg= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14/go.mod h1:yS5rNogD8e0Wu9+l3MUwr6eENBzEeGejvINpN5PAYfY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 h1:PUmZeJU6Y1Lbvt9WFuJ0ugUK2xn6hIWUBBbKuOWF30s= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22/go.mod h1:nO6egFBoAaoXze24a2C0NjQCvdpk8OueRoYimvEB9jo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 h1:SE+aQ4DEqG53RRCAIHlCf//B2ycxGH7jFkpnAh/kKPM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22/go.mod h1:ES3ynECd7fYeJIL6+oax+uIEljmfps0S70BaQzbMd/o= github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 h1:7G26Sae6PMKn4kMcU5JzNfrm1YrKwyOhowXPYR2WiWY= github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0/go.mod h1:Fw9aqhJicIVee1VytBBjH+l+5ov6/PhbtIK/u3rt/ls= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 h1:a1Fq/KXn75wSzoJaPQTgZO0wHGqE9mjFnylnqEPTchA= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.10/go.mod h1:p6+MXNxW7IA6dMgHfTAzljuwSKD0NCm/4lbS4t6+7vI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 h1:x6bKbmDhsgSZwv6q19wY/u3rLk/3FGjJWyqKcIRufpE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.16/go.mod h1:CudnEVKRtLn0+3uMV0yEXZ+YZOKnAtUJ5DmDhilVnIw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 h1:oK/njaL8GtyEihkWMD4k3VgHCT64RQKkZwh0DG5j8ak= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20/go.mod h1:JHs8/y1f3zY7U5WcuzoJ/yAYGYtNIVPKLIbp61euvmg= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 h1:ks8KBcZPh3PYISr5dAiXCM5/Thcuxk8l+PG4+A0exds= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.0/go.mod h1:pFw33T0WLvXU3rw1WBkpMlkgIn54eCB5FYLhjDc9Foo= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29h8BvsCoHQEQ6ST9X8w7w= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -116,8 +116,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 h1:vymEbVwYFP/L05h5TKQxvkXoKxNvTpjxYKdF1Nlwuao= -github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 h1:2WmHkJINIjgXXYDGik8d3oJvFA3DAwPy00csDJ3vo+o= +github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -161,12 +161,12 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= -github.com/kaptinlin/go-i18n v0.4.4 h1:3XrUYyLOykcd1K3gm4j7ndrF8YLIYrJjtbKGr/nF2Kw= -github.com/kaptinlin/go-i18n v0.4.4/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= -github.com/kaptinlin/jsonpointer v0.4.19 h1:dEkwEnvn9jJCofrwKGxfKaPNbDOQEf3UEbEumn4xZBg= -github.com/kaptinlin/jsonpointer v0.4.19/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= -github.com/kaptinlin/jsonschema v0.7.11 h1:h63Lb3Q4FBSWeWiAGefNPEVPNsOvgn91ATmf25X0yRs= -github.com/kaptinlin/jsonschema v0.7.11/go.mod h1:cJ8QIhwq3V/Yyh3sXRNt8w3sM943bNIbwnPTpBTXn3s= +github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= +github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= +github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= +github.com/kaptinlin/jsonpointer v0.4.20/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= +github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWswQEFvU= +github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= @@ -265,8 +265,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.276.0 h1:nVArUtfLEihtW+b0DdcqRGK1xoEm2+ltAihyztq7MKY= google.golang.org/api v0.276.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= -google.golang.org/genai v1.54.0 h1:ZQCa70WMTJDI11FdqWCzGvZ5PanpcpfoO6jl/lrSnGU= -google.golang.org/genai v1.54.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.55.0 h1:iLHGk4Bj/IZ/GNNZb7hYqwSJMRBvqLeu2Hb6YQ+rYGw= +google.golang.org/genai v1.55.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 h1:2iMJZntwvmfgtse+s744JY7v7PgEdSBuFYXucvpOHNM= google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:v14kaaboYyXQ1Gsu489Q+Hg/oN4B33mWtuOhF1HCeXA= google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 h1:yOzSCGPx+cp5VO7IxvZ9SBFF7j1tZVcNtlHR2iYKtVo= From 2c8825d8c7f48d2bd67349c0fefbd38a421731cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 10:46:43 +0000 Subject: [PATCH 39/95] chore(deps): bump github.com/ardanlabs/kronk (#226) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.24.0 to 1.24.2 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.24.0...v1.24.2) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.24.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 1ea71e402..3bca09ef9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.2 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.24.0 + github.com/ardanlabs/kronk v1.24.2 github.com/aws/aws-sdk-go-v2 v1.41.7 github.com/aws/aws-sdk-go-v2/config v1.32.17 github.com/aws/smithy-go v1.25.1 @@ -28,26 +28,26 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.9.0 // indirect - cloud.google.com/go/monitoring v1.27.0 // indirect + cloud.google.com/go/iam v1.10.0 // indirect + cloud.google.com/go/monitoring v1.28.0 // indirect cloud.google.com/go/storage v1.62.1 // 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect - github.com/ardanlabs/jinja v1.1.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 // indirect + github.com/ardanlabs/jinja v1.2.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect @@ -82,7 +82,7 @@ require ( github.com/kaptinlin/go-i18n v0.4.5 // indirect github.com/kaptinlin/jsonpointer v0.4.20 // indirect github.com/kaptinlin/messageformat-go v0.6.0 // indirect - github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/compress v1.18.6 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect @@ -117,7 +117,7 @@ require ( golang.org/x/sys v0.43.0 // indirect golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.276.0 // indirect + google.golang.org/api v0.277.0 // indirect google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect diff --git a/go.sum b/go.sum index 2fd5762da..7fc756f68 100644 --- a/go.sum +++ b/go.sum @@ -10,14 +10,14 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.9.0 h1:89wyjxT6DL4b5rk/Nk8eBC9DHqf+JiMstrn5IEYxFw4= -cloud.google.com/go/iam v1.9.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/iam v1.10.0 h1:cWWt8u8jXv3MzpvBmQgNClvvbVCRukruCJAnoK3fIJY= +cloud.google.com/go/iam v1.10.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= cloud.google.com/go/logging v1.16.0 h1:MMNgYRvZ/pEwiNSkcoJTKWfAbAJDqCqAMJiarZx+/CI= cloud.google.com/go/logging v1.16.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= cloud.google.com/go/longrunning v0.11.0 h1:fE4XVLJQj+gRnw1HrbDyQXXgC0aiqY3wxP7DDU4cWk0= cloud.google.com/go/longrunning v0.11.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= -cloud.google.com/go/monitoring v1.27.0 h1:BhYwMqao+e5Nn7JtWMM9m6zRtKtVUK6kJWMizXChkLU= -cloud.google.com/go/monitoring v1.27.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/monitoring v1.28.0 h1:jOe0Wkm+a56ptZnEeyHevXo7+KPWAPPP5wUTEJdP7GY= +cloud.google.com/go/monitoring v1.28.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= cloud.google.com/go/trace v1.14.0 h1:jUtnmOrNcu5XJNk4Gz0fv+v5sM0weaOa3z5MPQUjRXs= @@ -38,14 +38,14 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= -github.com/ardanlabs/jinja v1.1.0 h1:SZtVrV+1szfSBXBKQA5FoJtOabUxkJu5IvEX+ADUtcM= -github.com/ardanlabs/jinja v1.1.0/go.mod h1:onVec/ZOYPqNm7TRiNfJBnW+t9VxSi2gkARWhgP9qwQ= -github.com/ardanlabs/kronk v1.24.0 h1:A5oEaMKHQFyh1jGGQb3nQUSCpd7bSLYGLx8jJ1FJvuo= -github.com/ardanlabs/kronk v1.24.0/go.mod h1:cdt6xRpBH8lfdNXHDPAJ2b9i4IhmY7Gc3KpJmV7nSO4= +github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= +github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.24.2 h1:wQNEnM2kjb/sJ+QjbdNCAhrhvQru0gdGi2uHTd+dnGM= +github.com/ardanlabs/kronk v1.24.2/go.mod h1:jVlHPPmuKbiXIu5ZvB4W6jFQy8IznJBrO0WuS88yfX4= github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9 h1:adBsCIIpLbLmYnkQU+nAChU5yhVTvu5PerROm+/Kq2A= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.9/go.mod h1:uOYhgfgThm/ZyAuJGNQ5YgNyOlYfqnGpTHXvk3cpykg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= @@ -60,14 +60,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14 h1:xnvDEnw+pnj5mctWiYuFbigrEzSm35x7k4KS/ZkCANg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.14/go.mod h1:yS5rNogD8e0Wu9+l3MUwr6eENBzEeGejvINpN5PAYfY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22 h1:SE+aQ4DEqG53RRCAIHlCf//B2ycxGH7jFkpnAh/kKPM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.22/go.mod h1:ES3ynECd7fYeJIL6+oax+uIEljmfps0S70BaQzbMd/o= -github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0 h1:7G26Sae6PMKn4kMcU5JzNfrm1YrKwyOhowXPYR2WiWY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.100.0/go.mod h1:Fw9aqhJicIVee1VytBBjH+l+5ov6/PhbtIK/u3rt/ls= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1 h1:mxuT1xE+dI54NW3RkNjP8DUT5HXqbkiAFvfdyDFwE5c= +github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= @@ -169,8 +169,8 @@ github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWs github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= -github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= -github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -263,8 +263,8 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.276.0 h1:nVArUtfLEihtW+b0DdcqRGK1xoEm2+ltAihyztq7MKY= -google.golang.org/api v0.276.0/go.mod h1:Fnag/EWUPIcJXuIkP1pjoTgS5vdxlk3eeemL7Do6bvw= +google.golang.org/api v0.277.0 h1:HJfyJUiNeBBUMai7ez8u14wkp/gH/I4wpGbbO9o+cSk= +google.golang.org/api v0.277.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= google.golang.org/genai v1.55.0 h1:iLHGk4Bj/IZ/GNNZb7hYqwSJMRBvqLeu2Hb6YQ+rYGw= google.golang.org/genai v1.55.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 h1:2iMJZntwvmfgtse+s744JY7v7PgEdSBuFYXucvpOHNM= From ba2ee05fbded59853faef2632285df2b7b6a58b8 Mon Sep 17 00:00:00 2001 From: slzcdhd Date: Fri, 8 May 2026 22:27:58 +0800 Subject: [PATCH 40/95] fix: guard against nil response in Generate to prevent panic (#228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some OpenAI-compatible API endpoints (e.g. DeepSeek) may return a nil response with no error from the underlying SDK under edge conditions (empty response body, connection issues during response parsing, etc.). When this happens, accessing response.Choices (Chat Completions), response.Error (Responses API), or response.Content (Anthropic) causes a nil pointer dereference panic that crashes the process. Add nil response checks in Generate methods for: - providers/openai: languageModel.Generate (Chat Completions API) - providers/openai: responsesLanguageModel.Generate (Responses API) - providers/anthropic: languageModel.Generate Each returns a descriptive fantasy.Error instead of panicking. Co-authored-by: liaoyijun <“liaoyijun@wps.cn”> --- providers/anthropic/anthropic.go | 3 +++ providers/openai/language_model.go | 3 +++ providers/openai/openai_test.go | 25 ++++++++++++++++++++ providers/openai/responses_language_model.go | 3 +++ 4 files changed, 34 insertions(+) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 2760b0d71..27dd22698 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1171,6 +1171,9 @@ func (a languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas if err != nil { return nil, toProviderErr(err) } + if response == nil { + return nil, &fantasy.Error{Title: "no response", Message: "provider returned nil response"} + } var content []fantasy.Content for _, block := range response.Content { diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 4515dabbd..2907008de 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -251,6 +251,9 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas if err != nil { return nil, toProviderErr(err) } + if response == nil { + return nil, &fantasy.Error{Title: "no response", Message: "provider returned nil response"} + } if len(response.Choices) == 0 { return nil, &fantasy.Error{Title: "no response", Message: "no response generated"} diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 254ae6354..2230deae4 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2010,6 +2010,31 @@ func TestDoGenerate(t *testing.T) { require.Equal(t, "ServiceTier", result.Warnings[0].Setting) require.Contains(t, result.Warnings[0].Details, "priority processing is only available") }) + + t.Run("should return error instead of panic on empty response body", func(t *testing.T) { + t.Parallel() + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + // Write empty body — some OpenAI-compatible endpoints may do this + // under edge conditions, causing the SDK to return (nil, nil). + })) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + require.NotPanics(t, func() { + _, _ = model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt, + }) + }) + }) } type streamingMockServer struct { diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 06da0aa6e..35c88ed7e 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -789,6 +789,9 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) if err != nil { return nil, toProviderErr(err) } + if response == nil { + return nil, &fantasy.Error{Title: "no response", Message: "provider returned nil response"} + } if response.Error.Message != "" { return nil, &fantasy.Error{ From e0ddf8769a53fd9d1154c100bf3d72c87b1bb3fe Mon Sep 17 00:00:00 2001 From: mkaaad <119158371+mkaaad@users.noreply.github.com> Date: Sat, 9 May 2026 01:54:25 +0800 Subject: [PATCH 41/95] fix(openai): yield tool calls with invalid JSON instead of silently dropping (#223) Previously, tool calls with invalid JSON arguments were silently dropped in the stream, preventing the agent from reporting the error back to the model. Now all tool calls are yielded regardless of argument validity, and the agent handles validation via its existing repair/error flow. Additionally, track hasYieldedToolCall to map finishReason correctly: use tool_calls only when a tool call was actually yielded, and fall back to stop when no tool call was yielded despite the API saying tool_calls. --- providers/openai/language_model.go | 21 +++--- providers/openai/openai_test.go | 101 +++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 10 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 2907008de..06610dedb 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -517,7 +517,10 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } // Handle tool calls that finish with empty arguments (e.g., Copilot). - // Normalize empty args to "{}" and emit the tool call if valid. + // Normalize empty args to "{}" and emit the tool call. + // If the arguments are invalid JSON, we still yield the tool call + // so the consumer (agent) can handle the error rather than + // silently dropping it. for idx, tc := range toolCalls { if tc.hasFinished { continue @@ -526,16 +529,14 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S tc.arguments = "{}" toolCalls[idx] = tc } - if xjson.IsValid(tc.arguments) { - if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { - return - } - if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { - return - } - tc.hasFinished = true - toolCalls[idx] = tc + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { + return + } + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { + return } + tc.hasFinished = true + toolCalls[idx] = tc } if len(acc.Choices) > 0 { diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 2230deae4..058c8fc3d 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2296,6 +2296,23 @@ func (sms *streamingMockServer) prepareToolStreamResponseWithEmptyArgs() { sms.chunks = chunks } +func (sms *streamingMockServer) prepareToolStreamResponseWithInvalidJSON() { + chunks := []string{ + // Tool call start + `data: {"id":"chatcmpl-invalid","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_invalid_json","type":"function","function":{"name":"test-tool","arguments":""}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + // Arguments delta containing \x00 which is not a valid JSON escape + `data: {"id":"chatcmpl-invalid","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"old_string\":\"hello\\x00"}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + // Remaining arguments — combined is {"old_string":"hello\x00world"} which is invalid JSON + `data: {"id":"chatcmpl-invalid","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"world\"}"}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + // Finish with tool_calls + `data: {"id":"chatcmpl-invalid","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}` + "\n\n", + // Usage + `data: {"id":"chatcmpl-invalid","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[],"usage":{"prompt_tokens":53,"completion_tokens":17,"total_tokens":70}}` + "\n\n", + "data: [DONE]\n\n", + } + sms.chunks = chunks +} + func collectStreamParts(stream fantasy.StreamResponse) ([]fantasy.StreamPart, error) { var parts []fantasy.StreamPart for part := range stream { @@ -3022,6 +3039,90 @@ func TestDoStream(t *testing.T) { require.Equal(t, int64(35), finishPart.Usage.TotalTokens) require.Equal(t, int64(10), finishPart.Usage.ReasoningTokens) }) + + t.Run("should drop tool calls with invalid JSON arguments", func(t *testing.T) { + t.Parallel() + + server := newStreamingMockServer() + defer server.close() + + server.prepareToolStreamResponseWithInvalidJSON() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{ + fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{ + "old_string": map[string]any{ + "type": "string", + }, + "new_string": map[string]any{ + "type": "string", + }, + }, + "required": []string{"old_string", "new_string"}, + "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", + }, + }, + }, + }) + + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + // Find tool-related parts + toolInputStart, toolInputEnd, toolCall := -1, -1, -1 + var toolDeltas []string + var finishPart *fantasy.StreamPart + + for i, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeToolInputStart: + toolInputStart = i + require.Equal(t, "call_invalid_json", part.ID) + require.Equal(t, "test-tool", part.ToolCallName) + case fantasy.StreamPartTypeToolInputDelta: + toolDeltas = append(toolDeltas, part.Delta) + case fantasy.StreamPartTypeToolInputEnd: + toolInputEnd = i + require.Equal(t, "call_invalid_json", part.ID) + case fantasy.StreamPartTypeToolCall: + toolCall = i + require.Equal(t, "call_invalid_json", part.ID) + require.Equal(t, "test-tool", part.ToolCallName) + case fantasy.StreamPartTypeFinish: + finishPart = &part + } + } + + require.NotEqual(t, -1, toolInputStart, "expected ToolInputStart part") + require.NotEqual(t, -1, toolInputEnd, "expected ToolInputEnd part") + require.NotEqual(t, -1, toolCall, "expected ToolCall part") + + // Verify tool deltas combine to the complete input with \x00 + var fullInput strings.Builder + for _, delta := range toolDeltas { + fullInput.WriteString(delta) + } + require.Equal(t, `{"old_string":"hello\x00world"}`, fullInput.String()) + + // Finish reason is ToolCalls since the tool call was yielded + require.NotNil(t, finishPart) + require.Equal(t, fantasy.FinishReasonToolCalls, finishPart.FinishReason) + }) } func TestDefaultToPrompt_DropsEmptyMessages(t *testing.T) { From c954320fb977b7dbf3c1cf197d7cb17ccc0530e8 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 8 May 2026 15:01:00 -0300 Subject: [PATCH 42/95] chore: update go patch version to make govulncheck happy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 3bca09ef9..d8ec92b37 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.26.2 +go 1.26.3 require ( charm.land/x/vcr v0.1.1 From e6ec39547d4419f8e758b2e2bd8b36f972f0f27c Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 8 May 2026 15:05:56 -0300 Subject: [PATCH 43/95] v0.23.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ca222b7cf..610e28725 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.23.0 +0.23.1 From d9d0f63ecdbc86c4af1e09ebcd39bd36edf9b8c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 12:34:49 +0000 Subject: [PATCH 44/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#231) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.24.2 to 1.25.0 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.24.2...v1.25.0) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.25.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index d8ec92b37..37c2df978 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.3 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.24.2 + github.com/ardanlabs/kronk v1.25.0 github.com/aws/aws-sdk-go-v2 v1.41.7 github.com/aws/aws-sdk-go-v2/config v1.32.17 github.com/aws/smithy-go v1.25.1 @@ -28,8 +28,8 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.10.0 // indirect - cloud.google.com/go/monitoring v1.28.0 // indirect + cloud.google.com/go/iam v1.11.0 // indirect + cloud.google.com/go/monitoring v1.29.0 // indirect cloud.google.com/go/storage v1.62.1 // 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 @@ -47,7 +47,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect @@ -117,11 +117,11 @@ require ( golang.org/x/sys v0.43.0 // indirect golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.277.0 // indirect - google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect - google.golang.org/grpc v1.80.0 // indirect + google.golang.org/api v0.278.0 // indirect + google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/grpc v1.81.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 7fc756f68..ec632fb51 100644 --- a/go.sum +++ b/go.sum @@ -10,18 +10,18 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.10.0 h1:cWWt8u8jXv3MzpvBmQgNClvvbVCRukruCJAnoK3fIJY= -cloud.google.com/go/iam v1.10.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/logging v1.16.0 h1:MMNgYRvZ/pEwiNSkcoJTKWfAbAJDqCqAMJiarZx+/CI= -cloud.google.com/go/logging v1.16.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.11.0 h1:fE4XVLJQj+gRnw1HrbDyQXXgC0aiqY3wxP7DDU4cWk0= -cloud.google.com/go/longrunning v0.11.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= -cloud.google.com/go/monitoring v1.28.0 h1:jOe0Wkm+a56ptZnEeyHevXo7+KPWAPPP5wUTEJdP7GY= -cloud.google.com/go/monitoring v1.28.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= +cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.17.0 h1:rUFekZYwHiKElXCyz3zYBGz4BOeIqzgCKxVLdgrZ5mY= +cloud.google.com/go/logging v1.17.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.12.0 h1:wLv2hXvID9zHejLtcPo1B0JBjErnwZCYAPKSTa65xpY= +cloud.google.com/go/longrunning v0.12.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= +cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= -cloud.google.com/go/trace v1.14.0 h1:jUtnmOrNcu5XJNk4Gz0fv+v5sM0weaOa3z5MPQUjRXs= -cloud.google.com/go/trace v1.14.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +cloud.google.com/go/trace v1.15.0 h1:kAYkTwKyYHkGtAGFuu6qaUFRBkOVr+d1Yo44yZtGtgg= +cloud.google.com/go/trace v1.15.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= 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= @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.24.2 h1:wQNEnM2kjb/sJ+QjbdNCAhrhvQru0gdGi2uHTd+dnGM= -github.com/ardanlabs/kronk v1.24.2/go.mod h1:jVlHPPmuKbiXIu5ZvB4W6jFQy8IznJBrO0WuS88yfX4= +github.com/ardanlabs/kronk v1.25.0 h1:xq4nGeH7u0+9LtTFQc+awsF7ksMN0f0aeneihHeC2js= +github.com/ardanlabs/kronk v1.25.0/go.mod h1:EyAhFaGlF8aAUPCy908xFCdxQPWRKRPYUU8RXrNtNk0= github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= @@ -66,8 +66,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/ku github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1 h1:mxuT1xE+dI54NW3RkNjP8DUT5HXqbkiAFvfdyDFwE5c= -github.com/aws/aws-sdk-go-v2/service/s3 v1.100.1/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= @@ -263,18 +263,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.277.0 h1:HJfyJUiNeBBUMai7ez8u14wkp/gH/I4wpGbbO9o+cSk= -google.golang.org/api v0.277.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= +google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= +google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= google.golang.org/genai v1.55.0 h1:iLHGk4Bj/IZ/GNNZb7hYqwSJMRBvqLeu2Hb6YQ+rYGw= google.golang.org/genai v1.55.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4 h1:2iMJZntwvmfgtse+s744JY7v7PgEdSBuFYXucvpOHNM= -google.golang.org/genproto v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:v14kaaboYyXQ1Gsu489Q+Hg/oN4B33mWtuOhF1HCeXA= -google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4 h1:yOzSCGPx+cp5VO7IxvZ9SBFF7j1tZVcNtlHR2iYKtVo= -google.golang.org/genproto/googleapis/api v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:Q9HWtNeE7tM9npdIsEvqXj1QJIvVoeAV3rtXtS715Cw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 h1:tEkOQcXgF6dH1G+MVKZrfpYvozGrzb91k6ha7jireSM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= +google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= +google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= +google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348/go.mod h1:Yzdzr5OOZFgSsEV2D/Xi9NL3bszpXFAg0hFJiRohcD8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= +google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c03d60601ffef8d98d302cd8f089dd273b5f66e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 12:41:05 +0000 Subject: [PATCH 45/95] chore(deps): bump google.golang.org/genai (#230) Bumps the all group with 1 update in the / directory: [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `google.golang.org/genai` from 1.55.0 to 1.56.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.55.0...v1.56.0) --- updated-dependencies: - dependency-name: google.golang.org/genai dependency-version: 1.56.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 37c2df978..b0b00ac75 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/kaptinlin/jsonschema v0.7.13 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.55.0 + google.golang.org/genai v1.56.0 ) require ( diff --git a/go.sum b/go.sum index ec632fb51..4ceb811bd 100644 --- a/go.sum +++ b/go.sum @@ -265,8 +265,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= -google.golang.org/genai v1.55.0 h1:iLHGk4Bj/IZ/GNNZb7hYqwSJMRBvqLeu2Hb6YQ+rYGw= -google.golang.org/genai v1.55.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.56.0 h1:IwWrg1K0cn1/WBiPno/dYr0Q6o75NeH/bh3G4JEFERE= +google.golang.org/genai v1.56.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= From 5698022e65dfb30ae9d84e43d17358f5dc9bf8a9 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Tue, 12 May 2026 10:15:26 -0400 Subject: [PATCH 46/95] chore(deps): update kronk (#233) --- examples/go.mod | 136 ++++++++++----------- examples/go.sum | 317 ++++++++++++++++++++++-------------------------- go.mod | 14 +-- go.sum | 28 ++--- 4 files changed, 228 insertions(+), 267 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 173da9fdb..9cf6df70e 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.1 +go 1.26.3 replace charm.land/fantasy => ../ @@ -12,37 +12,37 @@ require ( ) require ( - cel.dev/expr v0.25.1 // indirect + cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth v0.20.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.3 // indirect - cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.61.3 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect - github.com/ardanlabs/kronk v1.21.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect - github.com/aws/smithy-go v1.24.2 // indirect + cloud.google.com/go/iam v1.11.0 // indirect + cloud.google.com/go/monitoring v1.29.0 // indirect + cloud.google.com/go/storage v1.62.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect + github.com/ardanlabs/jinja v1.2.0 // indirect + github.com/ardanlabs/kronk v1.25.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.17 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect + github.com/aws/smithy-go v1.25.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -53,15 +53,15 @@ require ( github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 // indirect + github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.10.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect - github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -70,38 +70,32 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.18.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect + github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.5 // indirect - github.com/hashicorp/go-version v1.8.0 // indirect - github.com/hybridgroup/yzma v1.11.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/jupiterrider/ffi v0.6.0 // indirect - github.com/kaptinlin/go-i18n v0.2.12 // indirect - github.com/kaptinlin/jsonpointer v0.4.17 // indirect - github.com/kaptinlin/jsonschema v0.7.6 // indirect - github.com/kaptinlin/messageformat-go v0.4.18 // indirect - github.com/klauspost/compress v1.18.4 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect + github.com/hybridgroup/yzma v1.13.0 // indirect + github.com/jupiterrider/ffi v0.7.0 // indirect + github.com/kaptinlin/go-i18n v0.4.5 // indirect + github.com/kaptinlin/jsonpointer v0.4.20 // indirect + github.com/kaptinlin/jsonschema v0.7.13 // indirect + github.com/kaptinlin/messageformat-go v0.6.0 // indirect + github.com/klauspost/compress v1.18.6 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nikolalohinski/gonja/v2 v2.7.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/sirupsen/logrus v1.9.4 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -110,31 +104,31 @@ require ( github.com/ulikunitz/xz v0.5.15 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.42.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect - go.opentelemetry.io/otel v1.42.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect - go.opentelemetry.io/otel/metric v1.42.0 // indirect - go.opentelemetry.io/otel/sdk v1.42.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect - go.opentelemetry.io/otel/trace v1.42.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.49.0 // indirect + golang.org/x/crypto v0.51.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/net v0.52.0 // indirect + golang.org/x/net v0.54.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.35.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.271.0 // indirect - google.golang.org/genai v1.51.0 // indirect - google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect - google.golang.org/grpc v1.79.2 // indirect + google.golang.org/api v0.278.0 // indirect + google.golang.org/genai v1.56.0 // indirect + google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect + google.golang.org/grpc v1.81.0 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 3b5392888..806d884b1 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1,75 +1,73 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= -cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= +cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= -cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= -cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= -cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= -cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= -cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= -cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= -cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= -cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= -cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= -cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/ardanlabs/kronk v1.21.4 h1:h/Wy+nxwKH8OZAuJfCZ/dSzKD0YNCGLcrswLqRb4Gk4= -github.com/ardanlabs/kronk v1.21.4/go.mod h1:07fwlo30o3xn8utYjAcy/3TCTNZbanP2WFthyjgBxPY= -github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= -github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= -github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= -github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= -github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= -github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= +cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.17.0 h1:rUFekZYwHiKElXCyz3zYBGz4BOeIqzgCKxVLdgrZ5mY= +cloud.google.com/go/logging v1.17.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.12.0 h1:wLv2hXvID9zHejLtcPo1B0JBjErnwZCYAPKSTa65xpY= +cloud.google.com/go/longrunning v0.12.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= +cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= +cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.15.0 h1:kAYkTwKyYHkGtAGFuu6qaUFRBkOVr+d1Yo44yZtGtgg= +cloud.google.com/go/trace v1.15.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= +github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= +github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.25.2 h1:kw8sDq/yDvy8D9I4/L4yptwmevfnM4hNeGv7mKLCz1s= +github.com/ardanlabs/kronk v1.25.2/go.mod h1:b5Gg4jDqvHDklkeHNB8+7treZRxUiCFsV65zphrTloY= +github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= +github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= +github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= +github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29h8BvsCoHQEQ6ST9X8w7w= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= +github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= +github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -98,20 +96,18 @@ github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99k github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= +github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= +github.com/charmbracelet/x/exp/strings v0.1.0/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= @@ -124,10 +120,10 @@ github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMD github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 h1:vymEbVwYFP/L05h5TKQxvkXoKxNvTpjxYKdF1Nlwuao= -github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 h1:2WmHkJINIjgXXYDGik8d3oJvFA3DAwPy00csDJ3vo+o= +github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -135,8 +131,6 @@ 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-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= @@ -145,75 +139,56 @@ 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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= -github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI= -github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE= +github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas= +github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71 h1:3qrWTgbR0uMacRVnE6//G1B20hUJexxqqmQ2OTs1+0s= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.71/go.mod h1:YV27+mh2SLUqeP36G1a9MiqL5eBkFnZQJjNTR9Q9NcY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.5 h1:DMPV5CSw5JrNg/IK7kDZt3+l2REKXOi3oAw7uYLh2NM= -github.com/hashicorp/go-getter v1.8.5/go.mod h1:WIffejwAyDSJhoVptc3UEshEMkR9O63rw34V7k43O3Q= -github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= -github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.11.0 h1:dIAs/GoV8imTB1fsFk1ft0ejI5APhUK6iHBSMudbfZc= -github.com/hybridgroup/yzma v1.11.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= -github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= -github.com/kaptinlin/go-i18n v0.2.12 h1:ywDsvb4KDFddMC2dpI/rrIzGU2mWUSvHmWUm9BMsdl4= -github.com/kaptinlin/go-i18n v0.2.12/go.mod h1:pVcu9qsW5pOIOoZFJXesRYmLos1vMQrby70JPAoWmJU= -github.com/kaptinlin/jsonpointer v0.4.17 h1:mY9k8ciWncxbsECyaxKnR0MdmxamNdp2tLQkAKVrtSk= -github.com/kaptinlin/jsonpointer v0.4.17/go.mod h1:SsfsjqnHG5zuKo1DTBzk1VknaHlL4osHw+X9kZKukpU= -github.com/kaptinlin/jsonschema v0.7.6 h1:UUMqZGFAk7nOzQsYAxvgygm4wpDp/nwXxA4VP9mCPCs= -github.com/kaptinlin/jsonschema v0.7.6/go.mod h1:GGk/oE+F1lWUfYrzKaCf4QWZmMdytt0LL4XdFEFB0LE= -github.com/kaptinlin/messageformat-go v0.4.18 h1:RBlHVWgZyoxTcUgGWBsl2AcyScq/urqbLZvzgryTmSI= -github.com/kaptinlin/messageformat-go v0.4.18/go.mod h1:ntI3154RnqJgr7GaC+vZBnIExl2V3sv9selvRNNEM24= -github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= -github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4GI= +github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= +github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= +github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= +github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= +github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= +github.com/kaptinlin/jsonpointer v0.4.20/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= +github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWswQEFvU= +github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= +github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= +github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nikolalohinski/gonja/v2 v2.7.0 h1:XuwnulQVPwzGaM0J/9AaQv0AFPBAxKI1GILifQ1r9pk= -github.com/nikolalohinski/gonja/v2 v2.7.0/go.mod h1:UIzXPVuOsr5h7dZ5DUbqk3/Z7oFA/NLGQGMjqT4L2aU= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= +github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= @@ -227,12 +202,8 @@ github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4Ul github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= -github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -251,68 +222,64 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= -go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= -go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= -go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= -go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= -go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= -go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= -go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= -go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= -go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= -go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= -go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= +go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= -google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= -google.golang.org/genai v1.51.0 h1:IZGuUqgfx40INv3hLFGCbOSGp0qFqm7LVmDghzNIYqg= -google.golang.org/genai v1.51.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c h1:ZhFDeBMmFc/4g8/GwxnJ4rzB3O4GwQVNr+8Mh7Y5z4g= -google.golang.org/genproto v0.0.0-20260311181403-84a4fc48630c/go.mod h1:hf4r/rBuzaTkLUWRO03771Xvcs6P5hwdQK3UUEJjqo0= -google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI= -google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= -google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= +google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= +google.golang.org/genai v1.56.0 h1:IwWrg1K0cn1/WBiPno/dYr0Q6o75NeH/bh3G4JEFERE= +google.golang.org/genai v1.56.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= +google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= +google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= +google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348/go.mod h1:Yzdzr5OOZFgSsEV2D/Xi9NL3bszpXFAg0hFJiRohcD8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= +google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/go.mod b/go.mod index b0b00ac75..e73042f82 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.3 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.25.0 + github.com/ardanlabs/kronk v1.25.2 github.com/aws/aws-sdk-go-v2 v1.41.7 github.com/aws/aws-sdk-go-v2/config v1.32.17 github.com/aws/smithy-go v1.25.1 @@ -24,7 +24,7 @@ require ( ) require ( - cel.dev/expr v0.25.1 // indirect + cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect @@ -78,7 +78,7 @@ require ( github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.13.0 // indirect - github.com/jupiterrider/ffi v0.6.0 // indirect + github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/go-i18n v0.4.5 // indirect github.com/kaptinlin/jsonpointer v0.4.20 // indirect github.com/kaptinlin/messageformat-go v0.6.0 // indirect @@ -111,11 +111,11 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.50.0 // indirect - golang.org/x/net v0.53.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.278.0 // indirect google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect diff --git a/go.sum b/go.sum index 4ceb811bd..4d63eade8 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.25.0 h1:xq4nGeH7u0+9LtTFQc+awsF7ksMN0f0aeneihHeC2js= -github.com/ardanlabs/kronk v1.25.0/go.mod h1:EyAhFaGlF8aAUPCy908xFCdxQPWRKRPYUU8RXrNtNk0= +github.com/ardanlabs/kronk v1.25.2 h1:kw8sDq/yDvy8D9I4/L4yptwmevfnM4hNeGv7mKLCz1s= +github.com/ardanlabs/kronk v1.25.2/go.mod h1:b5Gg4jDqvHDklkeHNB8+7treZRxUiCFsV65zphrTloY= github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= @@ -159,8 +159,8 @@ github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4 github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jupiterrider/ffi v0.6.0 h1:UX378KcZvH5c8qgLi9KL/bL82SZTHdRspZ+jj7bvBng= -github.com/jupiterrider/ffi v0.6.0/go.mod h1:PqZ5Go6X9by8CIXgfprxfMPYmn8oT5m2O7AA56s64bY= +github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= +github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= @@ -247,18 +247,18 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= From d097d0433c94fa8d579db9457c7f7876e1f90523 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 12 May 2026 11:15:38 -0300 Subject: [PATCH 47/95] v0.23.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 610e28725..fda96dcf6 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.23.1 +0.23.2 From 26c3c41f0620bfb92d33fd28b8ef96fb3ecede81 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Thu, 14 May 2026 23:22:19 +1000 Subject: [PATCH 48/95] fix(providers/anthropic): preserve web search error replay (#237) --- providers/anthropic/anthropic.go | 54 ++++-- providers/anthropic/anthropic_test.go | 237 ++++++++++++++++++++++++ providers/anthropic/provider_options.go | 10 +- 3 files changed, 284 insertions(+), 17 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 27dd22698..0a1bdf94e 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1027,8 +1027,9 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl continue } if result.ProviderExecuted { - // Reconstruct web_search_tool_result block - // with encrypted_content for round-tripping. + // Reconstruct web_search_tool_result blocks, + // including encrypted content and errors, for + // round-tripping. searchMeta := &WebSearchResultMetadata{} if webMeta, ok := result.ProviderOptions[Name]; ok { if typed, ok := webMeta.(*WebSearchResultMetadata); ok { @@ -1124,24 +1125,37 @@ func decodeToolCallInputAny(toolCall fantasy.ToolCallPart) (any, *fantasy.CallWa // buildWebSearchToolResultBlock constructs an Anthropic // web_search_tool_result content block from structured metadata. func buildWebSearchToolResultBlock(toolCallID string, searchMeta *WebSearchResultMetadata) anthropic.ContentBlockParamUnion { - resultBlocks := make([]anthropic.WebSearchResultBlockParam, 0, len(searchMeta.Results)) - for _, r := range searchMeta.Results { - block := anthropic.WebSearchResultBlockParam{ - URL: r.URL, - Title: r.Title, - EncryptedContent: r.EncryptedContent, + var content anthropic.WebSearchToolResultBlockParamContentUnion + switch { + case searchMeta != nil && len(searchMeta.Results) > 0: + resultBlocks := make([]anthropic.WebSearchResultBlockParam, 0, len(searchMeta.Results)) + for _, r := range searchMeta.Results { + block := anthropic.WebSearchResultBlockParam{ + URL: r.URL, + Title: r.Title, + EncryptedContent: r.EncryptedContent, + } + if r.PageAge != "" { + block.PageAge = param.NewOpt(r.PageAge) + } + resultBlocks = append(resultBlocks, block) + } + content = anthropic.WebSearchToolResultBlockParamContentUnion{ + OfWebSearchToolResultBlockItem: resultBlocks, } - if r.PageAge != "" { - block.PageAge = param.NewOpt(r.PageAge) + case searchMeta != nil && searchMeta.ErrorCode != "": + content = anthropic.NewWebSearchToolRequestError( + anthropic.WebSearchToolResultErrorCode(searchMeta.ErrorCode), + ) + default: + content = anthropic.WebSearchToolResultBlockParamContentUnion{ + OfWebSearchToolResultBlockItem: []anthropic.WebSearchResultBlockParam{}, } - resultBlocks = append(resultBlocks, block) } return anthropic.ContentBlockParamUnion{ OfWebSearchToolResult: &anthropic.WebSearchToolResultBlockParam{ ToolUseID: toolCallID, - Content: anthropic.WebSearchToolResultBlockParamContentUnion{ - OfWebSearchToolResultBlockItem: resultBlocks, - }, + Content: content, }, } } @@ -1271,6 +1285,12 @@ func (a languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas Results: metadataResults, }, } + } else if webSearchResult.Content.ErrorCode != "" { + toolResult.ProviderMetadata = fantasy.ProviderMetadata{ + Name: &WebSearchResultMetadata{ + ErrorCode: string(webSearchResult.Content.ErrorCode), + }, + } } content = append(content, toolResult) } @@ -1451,6 +1471,12 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S Results: metadataResults, }, } + } else if contentBlock.Content.ErrorCode != "" { + providerMeta = fantasy.ProviderMetadata{ + Name: &WebSearchResultMetadata{ + ErrorCode: string(contentBlock.Content.ErrorCode), + }, + } } if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeToolResult, diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 219171c0b..3b952827a 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -670,6 +670,17 @@ func awaitAnthropicCall(t *testing.T, calls <-chan anthropicCall) anthropicCall } } +func requireWebSearchResultMetadata(t *testing.T, metadata fantasy.ProviderMetadata) *WebSearchResultMetadata { + t.Helper() + + providerOption, ok := fantasy.ProviderOptions(metadata)[Name] + require.True(t, ok, "provider metadata should contain anthropic key") + result, ok := providerOption.(*WebSearchResultMetadata) + require.True(t, ok, "provider metadata should be *WebSearchResultMetadata") + require.NotNil(t, result) + return result +} + func assertNoAnthropicCall(t *testing.T, calls <-chan anthropicCall) { t.Helper() @@ -786,6 +797,103 @@ func mockAnthropicWebSearchResponse() map[string]any { } } +func mockAnthropicWebSearchErrorResponse() map[string]any { + return map[string]any{ + "id": "msg_01WebSearchError", + "type": "message", + "role": "assistant", + "model": "claude-sonnet-4-20250514", + "content": []any{ + map[string]any{ + "type": "server_tool_use", + "id": "srvtoolu_err", + "name": "web_search", + "input": map[string]any{"query": "latest AI news"}, + "caller": map[string]any{"type": "direct"}, + }, + map[string]any{ + "type": "web_search_tool_result", + "tool_use_id": "srvtoolu_err", + "caller": map[string]any{"type": "direct"}, + "content": map[string]any{ + "type": "web_search_tool_result_error", + "error_code": "max_uses_exceeded", + }, + }, + map[string]any{ + "type": "text", + "text": "I was unable to search.", + }, + }, + "stop_reason": "end_turn", + "stop_sequence": nil, + "usage": map[string]any{ + "input_tokens": 100, + "output_tokens": 20, + "cache_creation_input_tokens": 0, + "cache_read_input_tokens": 0, + "server_tool_use": map[string]any{ + "web_search_requests": 1, + }, + }, + } +} + +func TestToPrompt_WebSearchProviderExecutedErrorRoundTrip(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Search for the latest AI news"}, + }, + }, + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ + ToolCallID: "srvtoolu_err", + ToolName: "web_search", + Input: `{"query":"latest AI news"}`, + ProviderExecuted: true, + }, + fantasy.ToolResultPart{ + ToolCallID: "srvtoolu_err", + ProviderExecuted: true, + ProviderOptions: fantasy.ProviderOptions{ + Name: &WebSearchResultMetadata{ErrorCode: "max_uses_exceeded"}, + }, + }, + fantasy.TextPart{Text: "I was unable to search."}, + }, + }, + } + + _, messages, warnings := toPrompt(prompt, true) + require.Empty(t, warnings) + require.Len(t, messages, 2) + + assistantMsg := messages[1] + require.Len(t, assistantMsg.Content, 3) + require.NotNil(t, assistantMsg.Content[0].OfServerToolUse) + require.Equal(t, "srvtoolu_err", assistantMsg.Content[0].OfServerToolUse.ID) + + webResult := assistantMsg.Content[1] + require.NotNil(t, webResult.OfWebSearchToolResult) + require.Equal(t, "srvtoolu_err", webResult.OfWebSearchToolResult.ToolUseID) + require.Nil(t, webResult.OfWebSearchToolResult.Content.OfWebSearchToolResultBlockItem) + require.NotNil(t, webResult.OfWebSearchToolResult.Content.OfRequestWebSearchToolResultError) + require.Equal( + t, + anthropic.WebSearchToolResultErrorCodeMaxUsesExceeded, + webResult.OfWebSearchToolResult.Content.OfRequestWebSearchToolResultError.ErrorCode, + ) + + require.NotNil(t, assistantMsg.Content[2].OfText) + require.Equal(t, "I was unable to search.", assistantMsg.Content[2].OfText.Text) +} + func TestToPrompt_WebSearchProviderExecutedToolResults(t *testing.T) { t.Parallel() @@ -965,6 +1073,66 @@ func TestGenerate_WebSearchResponse(t *testing.T) { ) } +func TestGenerate_WebSearchErrorPreservesErrorCode(t *testing.T) { + t.Parallel() + + server, calls := newAnthropicJSONServer(mockAnthropicWebSearchErrorResponse()) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + resp, err := model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt(), + Tools: []fantasy.Tool{ + WebSearchTool(nil), + }, + }) + require.NoError(t, err) + + call := awaitAnthropicCall(t, calls) + require.Equal(t, "POST", call.method) + require.Equal(t, "/v1/messages", call.path) + + var ( + toolCalls []fantasy.ToolCallContent + sources []fantasy.SourceContent + toolResults []fantasy.ToolResultContent + texts []fantasy.TextContent + ) + for _, c := range resp.Content { + switch v := c.(type) { + case fantasy.ToolCallContent: + toolCalls = append(toolCalls, v) + case fantasy.SourceContent: + sources = append(sources, v) + case fantasy.ToolResultContent: + toolResults = append(toolResults, v) + case fantasy.TextContent: + texts = append(texts, v) + } + } + + require.Len(t, toolCalls, 1) + require.True(t, toolCalls[0].ProviderExecuted) + require.Equal(t, "srvtoolu_err", toolCalls[0].ToolCallID) + require.Empty(t, sources) + require.Len(t, toolResults, 1) + require.True(t, toolResults[0].ProviderExecuted) + require.Equal(t, "srvtoolu_err", toolResults[0].ToolCallID) + webMeta := requireWebSearchResultMetadata(t, toolResults[0].ProviderMetadata) + require.Equal(t, "max_uses_exceeded", webMeta.ErrorCode) + require.Empty(t, webMeta.Results) + require.Len(t, texts, 1) + require.Equal(t, "I was unable to search.", texts[0].Text) +} + func TestGenerate_WebSearchToolInRequest(t *testing.T) { t.Parallel() @@ -1436,6 +1604,75 @@ func TestStream_WebSearchResponse(t *testing.T) { require.Equal(t, "Here are the results.", textDeltas[0].Delta) } +func TestStream_WebSearchErrorPreservesErrorCode(t *testing.T) { + t.Parallel() + + chunks := []string{ + "event: message_start\n", + `data: {"type":"message_start","message":{"id":"msg_01WebSearchError","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":100,"output_tokens":0}}}` + "\n\n", + "event: content_block_start\n", + `data: {"type":"content_block_start","index":0,"content_block":{"type":"server_tool_use","id":"srvtoolu_err","name":"web_search","input":{}}}` + "\n\n", + "event: content_block_stop\n", + `data: {"type":"content_block_stop","index":0}` + "\n\n", + "event: content_block_start\n", + `data: {"type":"content_block_start","index":1,"content_block":{"type":"web_search_tool_result","tool_use_id":"srvtoolu_err","content":{"type":"web_search_tool_result_error","error_code":"max_uses_exceeded"}}}` + "\n\n", + "event: content_block_stop\n", + `data: {"type":"content_block_stop","index":1}` + "\n\n", + "event: message_stop\n", + `data: {"type":"message_stop"}` + "\n\n", + } + + server, calls := newAnthropicStreamingServer(chunks) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt(), + Tools: []fantasy.Tool{ + WebSearchTool(nil), + }, + }) + require.NoError(t, err) + + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + + _ = awaitAnthropicCall(t, calls) + + var ( + toolResults []fantasy.StreamPart + sourceParts []fantasy.StreamPart + ) + for _, p := range parts { + switch p.Type { + case fantasy.StreamPartTypeToolResult: + toolResults = append(toolResults, p) + case fantasy.StreamPartTypeSource: + sourceParts = append(sourceParts, p) + } + } + + require.Len(t, toolResults, 1) + require.Empty(t, sourceParts) + require.True(t, toolResults[0].ProviderExecuted) + require.Equal(t, "srvtoolu_err", toolResults[0].ID) + require.Equal(t, "web_search", toolResults[0].ToolCallName) + webMeta := requireWebSearchResultMetadata(t, toolResults[0].ProviderMetadata) + require.Equal(t, "max_uses_exceeded", webMeta.ErrorCode) + require.Empty(t, webMeta.Results) +} + func TestGenerate_ToolChoiceNone(t *testing.T) { t.Parallel() diff --git a/providers/anthropic/provider_options.go b/providers/anthropic/provider_options.go index a429b3ec8..ae643b3c7 100644 --- a/providers/anthropic/provider_options.go +++ b/providers/anthropic/provider_options.go @@ -159,10 +159,14 @@ type WebSearchResultItem struct { } // WebSearchResultMetadata stores web search results from Anthropic's -// server-executed web_search tool. The structured data (especially -// EncryptedContent) must be preserved for multi-turn conversations. +// server-executed web_search tool. The structured data, especially +// encrypted content and error codes, must be preserved for multi-turn +// conversations. type WebSearchResultMetadata struct { - Results []WebSearchResultItem `json:"results"` + Results []WebSearchResultItem `json:"results,omitempty"` + // ErrorCode is the Anthropic web_search_tool_result_error.error_code. + // At most one of Results or ErrorCode should be non-empty. + ErrorCode string `json:"error_code,omitempty"` } // Options implements the ProviderOptions interface. From 53ec8a648cdcb33803238f7d932424bef0628061 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Thu, 14 May 2026 23:25:48 +1000 Subject: [PATCH 49/95] fix(providers/anthropic): preserve reasoning replay fidelity (#238) --- providers/anthropic/anthropic.go | 38 ++++-- providers/anthropic/anthropic_test.go | 177 ++++++++++++++++++++++++++ 2 files changed, 206 insertions(+), 9 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 0a1bdf94e..3c697fe63 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -400,6 +400,21 @@ func GetReasoningMetadata(providerOptions fantasy.ProviderOptions) *ReasoningOpt return nil } +func reasoningProviderMetadata(signature, redactedData string) fantasy.ProviderMetadata { + switch { + case signature != "": + return fantasy.ProviderMetadata{ + Name: &ReasoningOptionMetadata{Signature: signature}, + } + case redactedData != "": + return fantasy.ProviderMetadata{ + Name: &ReasoningOptionMetadata{RedactedData: redactedData}, + } + default: + return nil + } +} + type messageBlock struct { Role fantasy.MessageRole Messages []fantasy.Message @@ -1355,13 +1370,9 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } case "redacted_thinking": if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeReasoningStart, - ID: fmt.Sprintf("%d", chunk.Index), - ProviderMetadata: fantasy.ProviderMetadata{ - Name: &ReasoningOptionMetadata{ - RedactedData: chunk.ContentBlock.Data, - }, - }, + Type: fantasy.StreamPartTypeReasoningStart, + ID: fmt.Sprintf("%d", chunk.Index), + ProviderMetadata: reasoningProviderMetadata("", chunk.ContentBlock.Data), }) { return } @@ -1400,8 +1411,17 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } case "thinking": if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeReasoningEnd, - ID: fmt.Sprintf("%d", chunk.Index), + Type: fantasy.StreamPartTypeReasoningEnd, + ID: fmt.Sprintf("%d", chunk.Index), + ProviderMetadata: reasoningProviderMetadata(contentBlock.Signature, ""), + }) { + return + } + case "redacted_thinking": + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningEnd, + ID: fmt.Sprintf("%d", chunk.Index), + ProviderMetadata: reasoningProviderMetadata("", contentBlock.Data), }) { return } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 3b952827a..539fc80b4 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -658,6 +658,63 @@ func newAnthropicStreamingServer(chunks []string) (*httptest.Server, <-chan anth return server, calls } +func anthropicSSEEvent(event, data string) string { + return fmt.Sprintf("event: %s\ndata: %s\n\n", event, data) +} + +func collectAnthropicStreamParts(stream fantasy.StreamResponse) []fantasy.StreamPart { + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + return parts +} + +func streamAnthropicParts(t *testing.T, chunks []string, tools ...fantasy.Tool) []fantasy.StreamPart { + t.Helper() + + server, calls := newAnthropicStreamingServer(chunks) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt(), + Tools: tools, + }) + require.NoError(t, err) + + parts := collectAnthropicStreamParts(stream) + _ = awaitAnthropicCall(t, calls) + return parts +} + +func requireReasoningMetadata(t *testing.T, metadata fantasy.ProviderMetadata) *ReasoningOptionMetadata { + t.Helper() + + reasoning := GetReasoningMetadata(fantasy.ProviderOptions(metadata)) + require.NotNil(t, reasoning) + return reasoning +} + +func streamPartsByType(parts []fantasy.StreamPart, typ fantasy.StreamPartType) []fantasy.StreamPart { + var matches []fantasy.StreamPart + for _, part := range parts { + if part.Type == typ { + matches = append(matches, part) + } + } + return matches +} + func awaitAnthropicCall(t *testing.T, calls <-chan anthropicCall) anthropicCall { t.Helper() @@ -2171,6 +2228,126 @@ func TestGenerate_BetaAPI(t *testing.T) { }) } +func TestStream_RedactedThinkingEmitsStartAndEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_redacted","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_blob"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + starts := streamPartsByType(parts, fantasy.StreamPartTypeReasoningStart) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, starts, 1) + require.Len(t, ends, 1) + require.Equal(t, starts[0].ID, ends[0].ID) + require.Equal(t, "redacted_blob", requireReasoningMetadata(t, starts[0].ProviderMetadata).RedactedData) + require.Equal(t, "redacted_blob", requireReasoningMetadata(t, ends[0].ProviderMetadata).RedactedData) +} + +func TestStream_ThinkingSignaturePresentOnEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first thought"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_123"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, deltas, 2) + require.Equal(t, "first thought", deltas[0].Delta) + require.Equal(t, "sig_123", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) + require.Len(t, ends, 1) + require.Equal(t, "sig_123", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) +} + +func TestStream_NilMetadataDeltaDoesNotEraseSignatureOnEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig_tail","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_tail"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"second"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, deltas, 3) + require.Equal(t, "first", deltas[0].Delta) + require.Len(t, deltas[0].ProviderMetadata, 0) + require.Equal(t, "sig_tail", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) + require.Equal(t, "second", deltas[2].Delta) + require.Len(t, deltas[2].ProviderMetadata, 0) + require.Len(t, ends, 1) + require.Equal(t, "sig_tail", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) +} + +func TestStream_InterleavedThinkingAndRedactedThinking(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_interleaved","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_0"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":1,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"thinking_delta","thinking":"reasoning_1"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"signature_delta","signature":"sig_1"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":1}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":2,"content_block":{"type":"redacted_thinking","data":"redacted_2"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":2}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + var reasoningParts []fantasy.StreamPart + for _, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeReasoningStart, fantasy.StreamPartTypeReasoningDelta, fantasy.StreamPartTypeReasoningEnd: + reasoningParts = append(reasoningParts, part) + } + } + + require.Len(t, reasoningParts, 8) + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[0].Type) + require.Equal(t, "0", reasoningParts[0].ID) + require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[0].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[1].Type) + require.Equal(t, "0", reasoningParts[1].ID) + require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[1].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[2].Type) + require.Equal(t, "1", reasoningParts[2].ID) + require.Len(t, reasoningParts[2].ProviderMetadata, 0) + + require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[3].Type) + require.Equal(t, "reasoning_1", reasoningParts[3].Delta) + require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[4].Type) + require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[4].ProviderMetadata).Signature) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[5].Type) + require.Equal(t, "1", reasoningParts[5].ID) + require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[5].ProviderMetadata).Signature) + + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[6].Type) + require.Equal(t, "2", reasoningParts[6].ID) + require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[6].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[7].Type) + require.Equal(t, "2", reasoningParts[7].ID) + require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[7].ProviderMetadata).RedactedData) +} + func TestStream_BetaAPI(t *testing.T) { t.Parallel() From 11bf8eefa61e96e3968b14d95a334f4097e4542b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2026 09:31:40 -0400 Subject: [PATCH 50/95] chore: handle partial stream endings to prevent silent truncation (#232) --- errors.go | 13 ++ providers/anthropic/anthropic.go | 9 ++ providers/anthropic/anthropic_test.go | 46 +++++++ providers/google/google.go | 8 +- providers/openai/language_model.go | 10 ++ providers/openai/openai_test.go | 135 +++++++++++++++++++ providers/openai/responses_language_model.go | 10 ++ 7 files changed, 230 insertions(+), 1 deletion(-) diff --git a/errors.go b/errors.go index a925d4c43..08d8f73a0 100644 --- a/errors.go +++ b/errors.go @@ -90,6 +90,19 @@ func (m *ProviderError) IsContextTooLarge() bool { return m.ContextTooLargeErr || m.ContextMaxTokens > 0 || m.ContextUsedTokens > 0 } +// NewIncompleteStreamError returns a retryable ProviderError indicating that +// an upstream stream closed cleanly without delivering its terminal signal +// (finish_reason, stop_reason, response.completed, candidate.finishReason, +// etc.). The cause is io.ErrUnexpectedEOF so ProviderError.IsRetryable() +// engages and the retry middleware re-runs the step. +func NewIncompleteStreamError() *ProviderError { + return &ProviderError{ + Title: "stream transport error", + Message: io.ErrUnexpectedEOF.Error(), + Cause: io.ErrUnexpectedEOF, + } +} + // RetryError represents an error that occurred during retry operations. type RetryError struct { Errors []error diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 3c697fe63..f3aa6e829 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1557,6 +1557,15 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S err := stream.Err() if err == nil || errors.Is(err, io.EOF) { + // Truncated stream: no terminal message_delta with stop_reason. + // Surface as a retryable error. + if acc.StopReason == "" { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: fantasy.NewIncompleteStreamError(), + }) + return + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, ID: acc.ID, diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 539fc80b4..880bd528b 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "math" "net/http" "net/http/httptest" @@ -2798,3 +2799,48 @@ func TestStream_ComputerUseTool(t *testing.T) { require.Contains(t, h, "computer-use-2025-01-24", "request %d", i) } } + +func TestStream_TruncatedWithoutStopReason(t *testing.T) { + t.Parallel() + + // Truncated stream: no terminal message_delta with stop_reason. + server, _ := newAnthropicStreamingServer([]string{ + "event: message_start\n", + `data: {"type":"message_start","message":{"id":"msg_01","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":10,"output_tokens":0}}}` + "\n\n", + "event: content_block_start\n", + `data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}` + "\n\n", + "event: content_block_delta\n", + `data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}` + "\n\n", + "event: content_block_stop\n", + `data: {"type":"content_block_stop","index":0}` + "\n\n", + }) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + require.NoError(t, err) + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + + var errPart *fantasy.StreamPart + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeError { + errPart = &parts[i] + } + require.NotEqual(t, fantasy.StreamPartTypeFinish, part.Type) + } + require.NotNil(t, errPart) + + var providerErr *fantasy.ProviderError + require.ErrorAs(t, errPart.Error, &providerErr) + require.True(t, providerErr.IsRetryable()) + require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) +} diff --git a/providers/google/google.go b/providers/google/google.go index 700341f7c..6fb1e3e20 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -867,7 +867,13 @@ func (g *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. if len(toolCalls) > 0 { finishReason = fantasy.FinishReasonToolCalls } else if finishReason == "" { - finishReason = fantasy.FinishReasonStop + // Truncated stream: no candidate emitted a finishReason before + // close. Surface as a retryable error. + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: fantasy.NewIncompleteStreamError(), + }) + return } var finalUsage fantasy.Usage diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 06610dedb..84dd69445 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -564,6 +564,16 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S mappedFinishReason = fantasy.FinishReasonToolCalls } } + // Truncated stream: upstream closed without finish_reason and we + // can't infer a tool-call turn. Surface as a retryable error so + // the retry middleware re-runs the step. + if finishReason == "" && mappedFinishReason != fantasy.FinishReasonToolCalls { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: fantasy.NewIncompleteStreamError(), + }) + return + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 058c8fc3d..249c3f99b 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "encoding/json" "errors" + "io" "net/http" "net/http/httptest" "strings" @@ -3123,6 +3124,95 @@ func TestDoStream(t *testing.T) { require.NotNil(t, finishPart) require.Equal(t, fantasy.FinishReasonToolCalls, finishPart.FinishReason) }) + + t.Run("should error when stream closes without finish_reason", func(t *testing.T) { + t.Parallel() + + // Truncated SSE: deltas + [DONE] without any finish_reason chunk. + server := newStreamingMockServer() + defer server.close() + + server.chunks = []string{ + `data: {"id":"chatcmpl-trunc","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-trunc","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}` + "\n\n", + "data: [DONE]\n\n", + } + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + }) + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + var errPart *fantasy.StreamPart + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeError { + errPart = &parts[i] + } + require.NotEqual(t, fantasy.StreamPartTypeFinish, part.Type) + } + require.NotNil(t, errPart) + + var providerErr *fantasy.ProviderError + require.ErrorAs(t, errPart.Error, &providerErr) + require.True(t, providerErr.IsRetryable()) + require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) + }) + + t.Run("should still finish cleanly when tool_calls arrive without finish_reason", func(t *testing.T) { + t.Parallel() + + // Tool-call-only turn without finish_reason: accumulator infers + // FinishReasonToolCalls; truncation guard must not fire. + server := newStreamingMockServer() + defer server.close() + + server.chunks = []string{ + `data: {"id":"chatcmpl-tc","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"role":"assistant","tool_calls":[{"index":0,"id":"call_x","type":"function","function":{"name":"test-tool","arguments":"{\"a\":1}"}}]},"finish_reason":null}]}` + "\n\n", + "data: [DONE]\n\n", + } + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"a": map[string]any{"type": "number"}}, + }, + }}, + }) + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + var finish *fantasy.StreamPart + for i, part := range parts { + require.NotEqual(t, fantasy.StreamPartTypeError, part.Type) + if part.Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonToolCalls, finish.FinishReason) + }) } func TestDefaultToPrompt_DropsEmptyMessages(t *testing.T) { @@ -4338,3 +4428,48 @@ func TestResponsesStream_PreviousResponseIDOption(t *testing.T) { require.Equal(t, "/responses", sms.calls[0].path) require.Equal(t, "resp_prev_456", sms.calls[0].body["previous_response_id"]) } + +func TestResponsesStream_TruncatedWithoutResponseCompleted(t *testing.T) { + t.Parallel() + + // Truncated Responses stream: deltas without response.completed. + chunks := []string{ + "event: response.created\n" + + `data: {"type":"response.created","response":{"id":"resp_01","status":"in_progress"}}` + "\n\n", + "event: response.output_item.added\n" + + `data: {"type":"response.output_item.added","output_index":0,"item":{"type":"message","id":"msg_01","role":"assistant","status":"in_progress","content":[]}}` + "\n\n", + "event: response.output_text.delta\n" + + `data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":"Hello"}` + "\n\n", + } + + sms := newStreamingMockServer() + defer sms.close() + sms.chunks = chunks + + model := newResponsesProvider(t, sms.server.URL) + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + }) + require.NoError(t, err) + + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + + var errPart *fantasy.StreamPart + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeError { + errPart = &parts[i] + } + require.NotEqual(t, fantasy.StreamPartTypeFinish, part.Type) + } + require.NotNil(t, errPart) + + var providerErr *fantasy.ProviderError + require.ErrorAs(t, errPart.Error, &providerErr) + require.True(t, providerErr.IsRetryable()) + require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) +} diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 35c88ed7e..fde8c23a8 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -1240,6 +1240,16 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( return } + // Truncated stream: no response.completed / response.incomplete event + // before close. Surface as a retryable error. + if finishReason == fantasy.FinishReasonUnknown { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: fantasy.NewIncompleteStreamError(), + }) + return + } + yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, From d259d3185394fc2406d353c197b759e751d3da8e Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 12 May 2026 16:39:29 -0400 Subject: [PATCH 51/95] feat(responses): add WithResponsesAPIFunc to opt in specific models --- providers/openai/openai.go | 18 +++++++++++++++++- providers/openaicompat/openaicompat.go | 7 +++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/providers/openai/openai.go b/providers/openai/openai.go index 29a909426..3e5714e51 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -30,6 +30,7 @@ type options struct { project string name string useResponsesAPI bool + responsesAPIFunc func(modelID string) bool headers map[string]string userAgent string client option.HTTPClient @@ -134,6 +135,14 @@ func WithUseResponsesAPI() Option { } } +// WithResponsesAPIFunc sets a custom filter for which models use the Responses API. +// When set, this function is called instead of the default IsResponsesModel(). +func WithResponsesAPIFunc(fn func(modelID string) bool) Option { + return func(o *options) { + o.responsesAPIFunc = fn + } +} + // WithUserAgent sets an explicit User-Agent header, overriding the default and any // value set via WithHeaders. func WithUserAgent(ua string) Option { @@ -179,7 +188,7 @@ func (o *provider) LanguageModel(_ context.Context, modelID string) (fantasy.Lan client := openai.NewClient(openaiClientOptions...) - if o.options.useResponsesAPI && IsResponsesModel(modelID) { + if o.options.useResponsesAPI && o.isResponsesModel(modelID) { // Not supported for responses API objectMode := o.options.objectMode if objectMode == fantasy.ObjectModeJSON { @@ -202,3 +211,10 @@ func (o *provider) LanguageModel(_ context.Context, modelID string) (fantasy.Lan func (o *provider) Name() string { return o.options.name } + +func (o *provider) isResponsesModel(modelID string) bool { + if o.options.responsesAPIFunc != nil { + return o.options.responsesAPIFunc(modelID) + } + return IsResponsesModel(modelID) +} diff --git a/providers/openaicompat/openaicompat.go b/providers/openaicompat/openaicompat.go index bb376c59e..4e9894462 100644 --- a/providers/openaicompat/openaicompat.go +++ b/providers/openaicompat/openaicompat.go @@ -122,3 +122,10 @@ func WithUseResponsesAPI() Option { o.openaiOptions = append(o.openaiOptions, openai.WithUseResponsesAPI()) } } + +// WithResponsesAPIFunc sets a custom filter for which models use the Responses API. +func WithResponsesAPIFunc(fn func(modelID string) bool) Option { + return func(o *options) { + o.openaiOptions = append(o.openaiOptions, openai.WithResponsesAPIFunc(fn)) + } +} From 8be360612da3619587bf956cea0d0fb908a19653 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 14 May 2026 16:25:14 -0300 Subject: [PATCH 52/95] v0.24.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index fda96dcf6..2094a100c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.23.2 +0.24.0 From a7be6118a19ac0f53aaf0b309270db31dbb5f46d Mon Sep 17 00:00:00 2001 From: "Cris R." <232431073+processtrader@users.noreply.github.com> Date: Sun, 17 May 2026 20:40:59 +0200 Subject: [PATCH 53/95] feat(retry): also retry on network connection errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The retry logic only retried errors wrapped in ProviderError (HTTP-level errors like 429, 5xx). Network-level errors (DNS failures, TCP timeouts, connection refused) surface as raw net.Error and were never retried. Add isRetryableError() that checks for net.Error in addition to ProviderError.IsRetryable(), with an explicit guard against context.Canceled/DeadlineExceeded which also implement net.Error. 💘 Generated with Crush Assisted-by: Crush:glm-5.1 --- retry.go | 20 ++++++- retry_test.go | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 retry_test.go diff --git a/retry.go b/retry.go index 6b2c2a412..2c1ecaf8b 100644 --- a/retry.go +++ b/retry.go @@ -3,6 +3,7 @@ package fantasy import ( "context" "errors" + "net" "strconv" "time" ) @@ -56,6 +57,22 @@ func isAbortError(err error) bool { return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) } +// isRetryableError reports whether the error should be retried. +// It checks for retryable ProviderError and also retries network-level +// connection errors (DNS failures, TCP timeouts, connection refused, etc.) +// that never produce an HTTP response and therefore aren't wrapped in ProviderError. +func isRetryableError(err error) bool { + var providerErr *ProviderError + if errors.As(err, &providerErr) { + return providerErr.IsRetryable() + } + if isAbortError(err) { + return false + } + var netErr net.Error + return errors.As(err, &netErr) +} + // RetryWithExponentialBackoffRespectingRetryHeaders creates a retry function that retries // a failed operation with exponential backoff, while respecting rate limit headers // (retry-after-ms and retry-after) if they are provided and reasonable (0-60 seconds). @@ -110,9 +127,10 @@ func retryWithExponentialBackoff[T any](ctx context.Context, fn RetryFn[T], opti } var providerErr *ProviderError - if errors.As(err, &providerErr) && providerErr.IsRetryable() && tryNumber <= options.MaxRetries { + if isRetryableError(err) && tryNumber <= options.MaxRetries { delay := getRetryDelayInMs(err, options.InitialDelayIn) if options.OnRetry != nil { + errors.As(err, &providerErr) options.OnRetry(providerErr, delay) } diff --git a/retry_test.go b/retry_test.go new file mode 100644 index 000000000..81dce507c --- /dev/null +++ b/retry_test.go @@ -0,0 +1,145 @@ +package fantasy + +import ( + "context" + "errors" + "net" + "testing" + "time" +) + +func TestIsRetryableError(t *testing.T) { + t.Parallel() + + t.Run("retryable ProviderError", func(t *testing.T) { + t.Parallel() + err := &ProviderError{ + StatusCode: 429, + Message: "rate limited", + } + if !isRetryableError(err) { + t.Error("expected retryable ProviderError to be retryable") + } + }) + + t.Run("non-retryable ProviderError", func(t *testing.T) { + t.Parallel() + err := &ProviderError{ + StatusCode: 400, + Message: "bad request", + } + if isRetryableError(err) { + t.Error("expected non-retryable ProviderError to not be retryable") + } + }) + + t.Run("net.OpError is retryable", func(t *testing.T) { + t.Parallel() + err := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + if !isRetryableError(err) { + t.Error("expected net.OpError to be retryable") + } + }) + + t.Run("context.Canceled is not retryable", func(t *testing.T) { + t.Parallel() + err := context.Canceled + if isRetryableError(err) { + t.Error("expected context.Canceled to not be retryable") + } + }) + + t.Run("context.DeadlineExceeded is not retryable", func(t *testing.T) { + t.Parallel() + err := context.DeadlineExceeded + if isRetryableError(err) { + t.Error("expected context.DeadlineExceeded to not be retryable") + } + }) + + t.Run("generic error is not retryable", func(t *testing.T) { + t.Parallel() + err := errors.New("something went wrong") + if isRetryableError(err) { + t.Error("expected generic error to not be retryable") + } + }) +} + +func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { + t.Parallel() + + t.Run("retries on net.OpError", func(t *testing.T) { + t.Parallel() + attempts := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + + result, err := retryFn(context.Background(), func() (int, error) { + attempts++ + if attempts < 3 { + return 0, &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + } + return 42, nil + }) + + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if result != 42 { + t.Fatalf("expected result 42, got %d", result) + } + if attempts != 3 { + t.Fatalf("expected 3 attempts, got %d", attempts) + } + }) + + t.Run("does not retry on context.Canceled", func(t *testing.T) { + t.Parallel() + attempts := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + + _, err := retryFn(context.Background(), func() (int, error) { + attempts++ + return 0, context.Canceled + }) + + if err == nil { + t.Fatal("expected error, got nil") + } + if attempts != 1 { + t.Fatalf("expected 1 attempt (no retry), got %d", attempts) + } + }) + + t.Run("returns RetryError when max retries exceeded on connection error", func(t *testing.T) { + t.Parallel() + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + + _, err := retryFn(context.Background(), func() (int, error) { + return 0, &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + }) + + var retryErr *RetryError + if !errors.As(err, &retryErr) { + t.Fatalf("expected RetryError, got %T: %v", err, err) + } + }) +} From 4cf3a0f2e322d49cefbe54d9a5efe2723239e862 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 18 May 2026 10:17:30 -0300 Subject: [PATCH 54/95] refactor(retry): move functions to a better place --- retry.go | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/retry.go b/retry.go index 2c1ecaf8b..894e5aea7 100644 --- a/retry.go +++ b/retry.go @@ -52,27 +52,6 @@ func getRetryDelayInMs(err error, exponentialBackoffDelay time.Duration) time.Du return exponentialBackoffDelay } -// isAbortError checks if the error is a context cancellation error. -func isAbortError(err error) bool { - return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) -} - -// isRetryableError reports whether the error should be retried. -// It checks for retryable ProviderError and also retries network-level -// connection errors (DNS failures, TCP timeouts, connection refused, etc.) -// that never produce an HTTP response and therefore aren't wrapped in ProviderError. -func isRetryableError(err error) bool { - var providerErr *ProviderError - if errors.As(err, &providerErr) { - return providerErr.IsRetryable() - } - if isAbortError(err) { - return false - } - var netErr net.Error - return errors.As(err, &netErr) -} - // RetryWithExponentialBackoffRespectingRetryHeaders creates a retry function that retries // a failed operation with exponential backoff, while respecting rate limit headers // (retry-after-ms and retry-after) if they are provided and reasonable (0-60 seconds). @@ -153,3 +132,24 @@ func retryWithExponentialBackoff[T any](ctx context.Context, fn RetryFn[T], opti return zero, &RetryError{newErrors} } + +// isRetryableError reports whether the error should be retried. +// It checks for retryable ProviderError and also retries network-level +// connection errors (DNS failures, TCP timeouts, connection refused, etc.) +// that never produce an HTTP response and therefore aren't wrapped in ProviderError. +func isRetryableError(err error) bool { + var providerErr *ProviderError + if errors.As(err, &providerErr) { + return providerErr.IsRetryable() + } + if isAbortError(err) { + return false + } + var netErr net.Error + return errors.As(err, &netErr) +} + +// isAbortError checks if the error is a context cancellation error. +func isAbortError(err error) bool { + return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) +} From 15e3da1d6c9d54bab7047dbd8f5d67b7928d09ef Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 18 May 2026 10:30:24 -0300 Subject: [PATCH 55/95] v0.25.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 2094a100c..d21d277be 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.24.0 +0.25.0 From 54c29a30da7523603ee3bf0801bd562b365e6a48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 16:22:54 +0000 Subject: [PATCH 56/95] chore(deps): bump the all group with 2 updates (#243) Bumps the all group with 2 updates: [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/kaptinlin/jsonschema` from 0.7.13 to 0.7.14 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.13...v0.7.14) Updates `google.golang.org/genai` from 1.56.0 to 1.57.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.56.0...v1.57.0) --- updated-dependencies: - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.7.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.57.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index e73042f82..c08f20212 100644 --- a/go.mod +++ b/go.mod @@ -17,10 +17,10 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.13 + github.com/kaptinlin/jsonschema v0.7.14 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.56.0 + google.golang.org/genai v1.57.0 ) require ( @@ -63,7 +63,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 // indirect + github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -79,9 +79,9 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.13.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/go-i18n v0.4.5 // indirect - github.com/kaptinlin/jsonpointer v0.4.20 // indirect - github.com/kaptinlin/messageformat-go v0.6.0 // indirect + github.com/kaptinlin/go-i18n v0.4.8 // indirect + github.com/kaptinlin/jsonpointer v0.4.23 // indirect + github.com/kaptinlin/messageformat-go v0.6.4 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index 4d63eade8..5e6148bbf 100644 --- a/go.sum +++ b/go.sum @@ -116,8 +116,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 h1:2WmHkJINIjgXXYDGik8d3oJvFA3DAwPy00csDJ3vo+o= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836 h1:5KGUhXZFTN1PrCY4zUZLe1J8n7uBNmPDbCLCn78EbPQ= +github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -161,14 +161,14 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= -github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= -github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= -github.com/kaptinlin/jsonpointer v0.4.20/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= -github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWswQEFvU= -github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= -github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= -github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= +github.com/kaptinlin/go-i18n v0.4.8 h1:ymGkz0uU974wljuuHZufHP1BlFWVk5Tf/sSMO8Cl9yQ= +github.com/kaptinlin/go-i18n v0.4.8/go.mod h1:F+ezt0Q39p5x8PQW6p4xKMovhjNbhZYHuqwyEV1hHMw= +github.com/kaptinlin/jsonpointer v0.4.23 h1:0VisnCL7rJT7BRTwxSWMU7vC0PD/RFgmisNcURkWp3k= +github.com/kaptinlin/jsonpointer v0.4.23/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= +github.com/kaptinlin/jsonschema v0.7.14 h1:6grzaTJiRuLXlIGEdlGX5HEII3Za2tV+xxGpW3Kg4Rc= +github.com/kaptinlin/jsonschema v0.7.14/go.mod h1:9WFuBzJjrvNkXVjo0L2Ujl1T/yqAGurwgbx4JWgF5C8= +github.com/kaptinlin/messageformat-go v0.6.4 h1:6nC70fsqEn2xxg/Xoby2+Dk2r77kvxa3QNnYL/hsNcM= +github.com/kaptinlin/messageformat-go v0.6.4/go.mod h1:553UGZ1x5jmGtyH4pQKYwLGMyPm71deCoZICjq1DtR8= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -181,8 +181,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= -github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7olPtrEc= +github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -265,8 +265,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= -google.golang.org/genai v1.56.0 h1:IwWrg1K0cn1/WBiPno/dYr0Q6o75NeH/bh3G4JEFERE= -google.golang.org/genai v1.56.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.57.0 h1:qTyG2ynz5dQy2jF4CvZdLHHVslhR0heMue+zM1a4GNM= +google.golang.org/genai v1.57.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= From c5fcd7c1e8743f52099a55fd505be07629c761d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 16:29:37 +0000 Subject: [PATCH 57/95] chore(deps): bump github.com/ardanlabs/kronk (#244) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.25.2 to 1.25.8 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.25.2...v1.25.8) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.25.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index c08f20212..7f2526e5a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.3 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.25.2 + github.com/ardanlabs/kronk v1.25.8 github.com/aws/aws-sdk-go-v2 v1.41.7 github.com/aws/aws-sdk-go-v2/config v1.32.17 github.com/aws/smithy-go v1.25.1 @@ -36,7 +36,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect - github.com/ardanlabs/jinja v1.2.0 // indirect + github.com/ardanlabs/jinja v1.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.13.0 // indirect + github.com/hybridgroup/yzma v1.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/go-i18n v0.4.8 // indirect github.com/kaptinlin/jsonpointer v0.4.23 // indirect @@ -117,11 +117,11 @@ require ( golang.org/x/sys v0.44.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.278.0 // indirect - google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/grpc v1.81.0 // indirect + google.golang.org/api v0.279.0 // indirect + google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 5e6148bbf..8683e9d4d 100644 --- a/go.sum +++ b/go.sum @@ -12,16 +12,16 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/logging v1.17.0 h1:rUFekZYwHiKElXCyz3zYBGz4BOeIqzgCKxVLdgrZ5mY= -cloud.google.com/go/logging v1.17.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.12.0 h1:wLv2hXvID9zHejLtcPo1B0JBjErnwZCYAPKSTa65xpY= -cloud.google.com/go/longrunning v0.12.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= +cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v0.13.0 h1:dUfqF8y0bHOeZzF5+tKPZ6RBCeEEDOejvwGwENv/eEc= +cloud.google.com/go/longrunning v0.13.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= -cloud.google.com/go/trace v1.15.0 h1:kAYkTwKyYHkGtAGFuu6qaUFRBkOVr+d1Yo44yZtGtgg= -cloud.google.com/go/trace v1.15.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= +cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= 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= @@ -38,10 +38,10 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= -github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= -github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.25.2 h1:kw8sDq/yDvy8D9I4/L4yptwmevfnM4hNeGv7mKLCz1s= -github.com/ardanlabs/kronk v1.25.2/go.mod h1:b5Gg4jDqvHDklkeHNB8+7treZRxUiCFsV65zphrTloY= +github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= +github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.25.8 h1:m00XchkmanD8LsF1+hW5fE/+6qKgND8LQvdO0M3xwJo= +github.com/ardanlabs/kronk v1.25.8/go.mod h1:lRIUsMXaLFJ0rFniYthW+kpqXWVcr+LnFoyf5LU9JHQ= github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4GI= -github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hybridgroup/yzma v1.14.0 h1:40G9wxRG356mqLsIMBWCzJnksxIIVm+cCtdXVMe0Rdw= +github.com/hybridgroup/yzma v1.14.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -263,18 +263,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= -google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= +google.golang.org/api v0.279.0 h1:hsx2M2OaRcaKtVYK6vXEUnQvdjnend7ZYES+lYaot74= +google.golang.org/api v0.279.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= google.golang.org/genai v1.57.0 h1:qTyG2ynz5dQy2jF4CvZdLHHVslhR0heMue+zM1a4GNM= google.golang.org/genai v1.57.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348/go.mod h1:Yzdzr5OOZFgSsEV2D/Xi9NL3bszpXFAg0hFJiRohcD8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= -google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 h1:rhBdfmsOlOZIvz3Y5/BdUzPg2CkO8L7QQPKj96B8554= +google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60/go.mod h1:8xo2Pj1b20ZOCpzlU3B9qieMwVIAXx1QVZWLMlPL6sM= +google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 h1:3WsB1FAbiRIf2tOxscWKs3pQBD9he1NsrnbhMuWfekc= +google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60/go.mod h1:7yoXV7RIh5gblj/xVYoogxAWvA9wUeVbpsK/M694l00= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e277abdc6b5a616bed167b5eb15d727ce6dfb5be Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 20 May 2026 22:56:58 +1000 Subject: [PATCH 58/95] fix(openai): require terminal stream events before finishing (#246) --- providers/openai/language_model.go | 24 +- providers/openai/openai_test.go | 341 ++++++++++++++++++- providers/openai/responses_language_model.go | 82 ++++- 3 files changed, 430 insertions(+), 17 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 84dd69445..231a77213 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -568,9 +568,13 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S // can't infer a tool-call turn. Surface as a retryable error so // the retry middleware re-runs the step. if finishReason == "" && mappedFinishReason != fantasy.FinishReasonToolCalls { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, - Error: fantasy.NewIncompleteStreamError(), + Error: err, }) return } @@ -868,8 +872,8 @@ func (o languageModel) streamObjectWithJSONMode(ctx context.Context, call fantas var lastParsedObject any var usage fantasy.Usage var finishReason fantasy.FinishReason + var sawFinishReason bool var providerMetadata fantasy.ProviderMetadata - var streamErr error for stream.Next() { chunk := stream.Current() @@ -884,6 +888,7 @@ func (o languageModel) streamObjectWithJSONMode(ctx context.Context, call fantas choice := chunk.Choices[0] if choice.FinishReason != "" { finishReason = o.mapFinishReasonFunc(choice.FinishReason) + sawFinishReason = true } if choice.Delta.Content != "" { @@ -928,10 +933,21 @@ func (o languageModel) streamObjectWithJSONMode(ctx context.Context, call fantas err := stream.Err() if err != nil && !errors.Is(err, io.EOF) { - streamErr = toProviderErr(err) yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeError, - Error: streamErr, + Error: toProviderErr(err), + }) + return + } + + if !sawFinishReason { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } + yield(fantasy.ObjectStreamPart{ + Type: fantasy.ObjectStreamPartTypeError, + Error: err, }) return } diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 249c3f99b..24f4a687c 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2260,6 +2260,17 @@ func (sms *streamingMockServer) prepareStreamResponse(opts map[string]any) { sms.chunks = chunks } +// chatCompletionChunksBeforeFinishReason drops every chunk from the final +// finish_reason chunk onward, including any trailing usage-only chunk. +func chatCompletionChunksBeforeFinishReason(chunks []string) []string { + for i, chunk := range chunks { + if strings.Contains(chunk, `"finish_reason":"`) { + return append([]string(nil), chunks[:i]...) + } + } + return append([]string(nil), chunks...) +} + func (sms *streamingMockServer) prepareToolStreamResponse() { chunks := []string{ `data: {"id":"chatcmpl-96aZqmeDpA9IPD6tACY8djkMsJCMP","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_O17Uplv4lJvD6DVdIvFFeRMw","type":"function","function":{"name":"test-tool","arguments":""}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", @@ -2328,6 +2339,90 @@ func collectStreamParts(stream fantasy.StreamResponse) ([]fantasy.StreamPart, er return parts, nil } +func TestChatCompletionsStreamObject_RequiresFinishReasonBeforeFinish(t *testing.T) { + t.Parallel() + + objectSchema := fantasy.Schema{ + Type: "object", + Properties: map[string]*fantasy.Schema{ + "answer": {Type: "string"}, + }, + Required: []string{"answer"}, + } + + tests := []struct { + name string + truncate bool + wantFinish bool + }{ + { + name: "complete stream finishes", + wantFinish: true, + }, + { + name: "stream closed before finish_reason errors", + truncate: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + server := newStreamingMockServer() + defer server.close() + + server.prepareStreamResponse(map[string]any{ + "content": []string{`{"answer":"hello"}`}, + }) + if tt.truncate { + server.chunks = chatCompletionChunksBeforeFinishReason(server.chunks) + } + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.StreamObject(context.Background(), fantasy.ObjectCall{ + Prompt: testPrompt, + Schema: objectSchema, + }) + require.NoError(t, err) + + parts := collectObjectStreamParts(stream) + + var objects, finishes, errorParts []fantasy.ObjectStreamPart + for _, part := range parts { + switch part.Type { + case fantasy.ObjectStreamPartTypeObject: + objects = append(objects, part) + case fantasy.ObjectStreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.ObjectStreamPartTypeError: + errorParts = append(errorParts, part) + } + } + + require.NotEmpty(t, objects) + require.Equal(t, map[string]any{"answer": "hello"}, objects[len(objects)-1].Object) + + if tt.wantFinish { + require.Len(t, finishes, 1) + require.Empty(t, errorParts) + return + } + + require.Empty(t, finishes) + require.Len(t, errorParts, 1) + require.Error(t, errorParts[0].Error) + requireRetryableUnexpectedEOF(t, errorParts[0].Error) + }) + } +} + func TestDoStream(t *testing.T) { t.Parallel() @@ -3883,7 +3978,8 @@ func TestResponsesGenerate_WebSearchResponse(t *testing.T) { // TextContent with the final answer. require.Len(t, texts, 1) - require.Equal(t, + require.Equal( + t, "Based on recent search results, here is the latest AI news.", texts[0].Text, ) @@ -4265,6 +4361,249 @@ func TestResponsesToPrompt_ReasoningWithStore(t *testing.T) { }) } +func TestResponsesStream_RequiresTerminalEventBeforeFinish(t *testing.T) { + t.Parallel() + + textChunks := []string{ + responsesSSEEvent("response.created", `{"type":"response.created","response":{"id":"resp_01","status":"in_progress","output":[]}}`), + responsesSSEEvent("response.output_item.added", `{"type":"response.output_item.added","output_index":0,"item":{"id":"msg_01","type":"message","role":"assistant","status":"in_progress","content":[]}}`), + responsesSSEEvent("response.content_part.added", `{"type":"response.content_part.added","output_index":0,"content_index":0,"item_id":"msg_01","part":{"type":"output_text","text":""}}`), + responsesSSEEvent("response.output_text.delta", `{"type":"response.output_text.delta","output_index":0,"content_index":0,"item_id":"msg_01","delta":"hello"}`), + } + incompleteEvent := responsesSSEEvent("response.incomplete", `{"type":"response.incomplete","response":{"id":"resp_02","status":"incomplete","output":[],"incomplete_details":{"reason":"max_output_tokens"},"usage":{"input_tokens":1,"output_tokens":1,"total_tokens":2}}}`) + failedEvent := responsesSSEEvent("response.failed", `{"type":"response.failed","response":{"id":"resp_03","status":"failed","error":{"code":"server_error","message":"boom"},"output":[]}}`) + errorEvent := responsesSSEEvent("error", `{"type":"error","message":"stream down","code":"server_error","param":"","sequence_number":1}`) + + tests := []struct { + name string + chunks []string + wantFinish bool + wantFinishReason fantasy.FinishReason + wantRetryable bool + wantErrContain string + }{ + { + name: "incomplete terminal event finishes", + chunks: append(append([]string{}, textChunks...), incompleteEvent), + wantFinish: true, + wantFinishReason: fantasy.FinishReasonLength, + }, + { + name: "stream closed before terminal event errors", + chunks: textChunks, + wantRetryable: true, + }, + { + name: "response failed errors", + chunks: []string{failedEvent}, + wantErrContain: "response failed: boom (code: server_error)", + }, + { + name: "provider error event is preserved", + chunks: []string{errorEvent}, + wantErrContain: "response error: stream down (code: server_error)", + }, + { + name: "malformed event error is preserved", + chunks: []string{responsesSSEEvent("response.created", `{`)}, + wantErrContain: "unexpected end of JSON input", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + sms := newStreamingMockServer() + defer sms.close() + sms.chunks = tt.chunks + + model := newResponsesProvider(t, sms.server.URL) + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt}) + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + var finishes, errorParts []fantasy.StreamPart + for _, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.StreamPartTypeError: + errorParts = append(errorParts, part) + } + } + + if tt.wantFinish { + require.Len(t, finishes, 1) + require.Empty(t, errorParts) + require.Equal(t, tt.wantFinishReason, finishes[0].FinishReason) + return + } + + require.Empty(t, finishes) + require.Len(t, errorParts, 1) + require.Error(t, errorParts[0].Error) + if tt.wantErrContain != "" { + require.Contains(t, errorParts[0].Error.Error(), tt.wantErrContain) + } + + if tt.wantRetryable { + requireRetryableUnexpectedEOF(t, errorParts[0].Error) + } else { + requireNotRetryableUnexpectedEOF(t, errorParts[0].Error) + } + }) + } +} + +func TestResponsesStreamObject_RequiresTerminalEventBeforeFinish(t *testing.T) { + t.Parallel() + + objectSchema := fantasy.Schema{ + Type: "object", + Properties: map[string]*fantasy.Schema{ + "answer": {Type: "string"}, + }, + Required: []string{"answer"}, + } + + objectChunks := []string{ + responsesSSEEvent("response.created", `{"type":"response.created","response":{"id":"resp_obj","status":"in_progress","output":[]}}`), + responsesSSEEvent("response.output_text.delta", `{"type":"response.output_text.delta","output_index":0,"content_index":0,"item_id":"msg_obj","delta":"{\"answer\":\"hello\"}"}`), + } + completedEvent := responsesSSEEvent("response.completed", `{"type":"response.completed","response":{"id":"resp_obj","status":"completed","output":[],"usage":{"input_tokens":1,"output_tokens":1,"total_tokens":2}}}`) + failedEvent := responsesSSEEvent("response.failed", `{"type":"response.failed","response":{"id":"resp_failed","status":"failed","error":{"code":"server_error","message":"boom"},"output":[]}}`) + errorEvent := responsesSSEEvent("error", `{"type":"error","message":"stream down","code":"server_error","param":"","sequence_number":1}`) + + tests := []struct { + name string + chunks []string + wantFinish bool + wantObject bool + wantRetryable bool + wantErrContain string + }{ + { + name: "completed terminal event finishes", + chunks: append(append([]string{}, objectChunks...), completedEvent), + wantFinish: true, + wantObject: true, + }, + { + name: "object stream closed before terminal event errors", + chunks: objectChunks, + wantObject: true, + wantRetryable: true, + }, + { + name: "response failed errors", + chunks: []string{failedEvent}, + wantErrContain: "response failed: boom (code: server_error)", + }, + { + name: "provider error event is preserved", + chunks: []string{errorEvent}, + wantErrContain: "response error: stream down (code: server_error)", + }, + { + name: "malformed event error is preserved", + chunks: []string{responsesSSEEvent("response.output_text.delta", `{`)}, + wantErrContain: "unexpected end of JSON input", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + sms := newStreamingMockServer() + defer sms.close() + sms.chunks = tt.chunks + + model := newResponsesProvider(t, sms.server.URL) + stream, err := model.StreamObject(context.Background(), fantasy.ObjectCall{ + Prompt: testPrompt, + Schema: objectSchema, + }) + require.NoError(t, err) + + parts := collectObjectStreamParts(stream) + + var objects, finishes, errorParts []fantasy.ObjectStreamPart + for _, part := range parts { + switch part.Type { + case fantasy.ObjectStreamPartTypeObject: + objects = append(objects, part) + case fantasy.ObjectStreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.ObjectStreamPartTypeError: + errorParts = append(errorParts, part) + } + } + + if tt.wantObject { + require.NotEmpty(t, objects) + require.Equal(t, map[string]any{"answer": "hello"}, objects[len(objects)-1].Object) + } else { + require.Empty(t, objects) + } + + if tt.wantFinish { + require.Len(t, finishes, 1) + require.Empty(t, errorParts) + return + } + + require.Empty(t, finishes) + require.Len(t, errorParts, 1) + require.Error(t, errorParts[0].Error) + if tt.wantErrContain != "" { + require.Contains(t, errorParts[0].Error.Error(), tt.wantErrContain) + } + + if tt.wantRetryable { + requireRetryableUnexpectedEOF(t, errorParts[0].Error) + } else { + requireNotRetryableUnexpectedEOF(t, errorParts[0].Error) + } + }) + } +} + +func responsesSSEEvent(event, data string) string { + return "event: " + event + "\n" + "data: " + data + "\n\n" +} + +func collectObjectStreamParts(stream fantasy.ObjectStreamResponse) []fantasy.ObjectStreamPart { + var parts []fantasy.ObjectStreamPart + for part := range stream { + parts = append(parts, part) + } + return parts +} + +func requireNotRetryableUnexpectedEOF(t *testing.T, err error) { + t.Helper() + + require.NotErrorIs(t, err, io.ErrUnexpectedEOF) + var providerErr *fantasy.ProviderError + if errors.As(err, &providerErr) { + require.False(t, providerErr.IsRetryable()) + require.NotErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) + } +} + +func requireRetryableUnexpectedEOF(t *testing.T, err error) { + t.Helper() + + var providerErr *fantasy.ProviderError + require.ErrorAs(t, err, &providerErr) + require.True(t, providerErr.IsRetryable()) + require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) +} + func TestResponsesStream_WebSearchResponse(t *testing.T) { t.Parallel() diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index fde8c23a8..9d9771360 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "reflect" "strings" @@ -789,6 +790,7 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) if err != nil { return nil, toProviderErr(err) } + if response == nil { return nil, &fantasy.Error{Title: "no response", Message: "provider returned nil response"} } @@ -949,6 +951,7 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( // identical; the overwrites ensure we have the final value even if an event // is missed. responseID := "" + sawTerminalEvent := false ongoingToolCalls := make(map[int64]*ongoingToolCall) hasFunctionCall := false activeReasoning := make(map[string]*reasoningState) @@ -1208,22 +1211,34 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( } case "response.completed": + sawTerminalEvent = true completed := event.AsResponseCompleted() responseID = completed.Response.ID finishReason = mapResponsesFinishReason(completed.Response.IncompleteDetails.Reason, hasFunctionCall) usage = responsesUsage(completed.Response) case "response.incomplete": + sawTerminalEvent = true incomplete := event.AsResponseIncomplete() responseID = incomplete.Response.ID finishReason = mapResponsesFinishReason(incomplete.Response.IncompleteDetails.Reason, hasFunctionCall) usage = responsesUsage(incomplete.Response) + case "response.failed": + failed := event.AsResponseFailed() + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: responsesFailedStreamError(failed.Response.Error.Message, string(failed.Response.Error.Code)), + }) { + return + } + return + case "error": errorEvent := event.AsError() if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, - Error: fmt.Errorf("response error: %s (code: %s)", errorEvent.Message, errorEvent.Code), + Error: responsesErrorStreamError(errorEvent.Message, errorEvent.Code), }) { return } @@ -1232,7 +1247,7 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( } err := stream.Err() - if err != nil { + if err != nil && !errors.Is(err, io.EOF) { yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, Error: toProviderErr(err), @@ -1240,12 +1255,14 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( return } - // Truncated stream: no response.completed / response.incomplete event - // before close. Surface as a retryable error. - if finishReason == fantasy.FinishReasonUnknown { + if !sawTerminalEvent { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, - Error: fantasy.NewIncompleteStreamError(), + Error: err, }) return } @@ -1259,6 +1276,24 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( }, nil } +// responsesFailedStreamError intentionally returns a provider-declared failure +// instead of a retryable transport error. Only synthetic stream truncation +// errors are wrapped with io.ErrUnexpectedEOF. +func responsesFailedStreamError(message, code string) error { + return responsesStreamFailureError("response failed", message, code) +} + +func responsesErrorStreamError(message, code string) error { + return responsesStreamFailureError("response error", message, code) +} + +func responsesStreamFailureError(title, message, code string) error { + if code != "" { + message = fmt.Sprintf("%s (code: %s)", message, code) + } + return &fantasy.Error{Title: title, Message: message} +} + // toWebSearchToolParam converts a ProviderDefinedTool with ID // "web_search" into the OpenAI SDK's WebSearchToolParam. func toWebSearchToolParam(pt fantasy.ProviderDefinedTool) responses.ToolUnionParam { @@ -1518,7 +1553,7 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca // identical; the overwrites ensure we have the final value even if an event // is missed. var responseID string - var streamErr error + var sawTerminalEvent bool hasFunctionCall := false for stream.Next() { @@ -1573,23 +1608,34 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca } case "response.completed": + sawTerminalEvent = true completed := event.AsResponseCompleted() responseID = completed.Response.ID finishReason = mapResponsesFinishReason(completed.Response.IncompleteDetails.Reason, hasFunctionCall) usage = responsesUsage(completed.Response) case "response.incomplete": + sawTerminalEvent = true incomplete := event.AsResponseIncomplete() responseID = incomplete.Response.ID finishReason = mapResponsesFinishReason(incomplete.Response.IncompleteDetails.Reason, hasFunctionCall) usage = responsesUsage(incomplete.Response) + case "response.failed": + failed := event.AsResponseFailed() + if !yield(fantasy.ObjectStreamPart{ + Type: fantasy.ObjectStreamPartTypeError, + Error: responsesFailedStreamError(failed.Response.Error.Message, string(failed.Response.Error.Code)), + }) { + return + } + return + case "error": errorEvent := event.AsError() - streamErr = fmt.Errorf("response error: %s (code: %s)", errorEvent.Message, errorEvent.Code) if !yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeError, - Error: streamErr, + Error: responsesErrorStreamError(errorEvent.Message, errorEvent.Code), }) { return } @@ -1598,7 +1644,7 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca } err := stream.Err() - if err != nil { + if err != nil && !errors.Is(err, io.EOF) { yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeError, Error: toProviderErr(err), @@ -1606,15 +1652,27 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca return } + if !sawTerminalEvent { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } + yield(fantasy.ObjectStreamPart{ + Type: fantasy.ObjectStreamPartTypeError, + Error: err, + }) + return + } + // Final validation and emit - if streamErr == nil && lastParsedObject != nil { + if lastParsedObject != nil { yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeFinish, Usage: usage, FinishReason: finishReason, ProviderMetadata: responsesProviderMetadata(responseID), }) - } else if streamErr == nil && lastParsedObject == nil { + } else { // No object was generated yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeError, From 9aa7447fdbe8fb60eeaa1fe76685dc2eeba6937f Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 21 May 2026 00:38:18 +1000 Subject: [PATCH 59/95] fix(anthropic): require message_stop before finishing stream (#245) --- providers/anthropic/anthropic.go | 54 +++++++----- providers/anthropic/anthropic_test.go | 116 +++++++++++++++++++++++++- 2 files changed, 144 insertions(+), 26 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index f3aa6e829..eb5b735e7 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1347,6 +1347,8 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } + sawMessageStop := false + for stream.Next() { chunk := stream.Current() _ = acc.Accumulate(chunk) @@ -1552,41 +1554,47 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } case "message_stop": + sawMessageStop = true } } err := stream.Err() - if err == nil || errors.Is(err, io.EOF) { - // Truncated stream: no terminal message_delta with stop_reason. - // Surface as a retryable error. - if acc.StopReason == "" { - yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeError, - Error: fantasy.NewIncompleteStreamError(), - }) - return - } + if err != nil && !errors.Is(err, io.EOF) { yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeFinish, - ID: acc.ID, - FinishReason: mapFinishReason(string(acc.StopReason)), - Usage: fantasy.Usage{ - InputTokens: acc.Usage.InputTokens, - OutputTokens: acc.Usage.OutputTokens, - TotalTokens: acc.Usage.InputTokens + acc.Usage.OutputTokens, - CacheCreationTokens: acc.Usage.CacheCreationInputTokens, - CacheReadTokens: acc.Usage.CacheReadInputTokens, - }, - ProviderMetadata: fantasy.ProviderMetadata{}, + Type: fantasy.StreamPartTypeError, + Error: toProviderErr(err), }) return - } else { //nolint: revive + } + + // Anthropic's SSE protocol reports the stop_reason in message_delta + // and then terminates the message with message_stop. Require both so + // a socket close after only one of those signals is retried. + if !sawMessageStop || acc.StopReason == "" { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, - Error: toProviderErr(err), + Error: err, }) return } + + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeFinish, + ID: acc.ID, + FinishReason: mapFinishReason(string(acc.StopReason)), + Usage: fantasy.Usage{ + InputTokens: acc.Usage.InputTokens, + OutputTokens: acc.Usage.OutputTokens, + TotalTokens: acc.Usage.InputTokens + acc.Usage.OutputTokens, + CacheCreationTokens: acc.Usage.CacheCreationInputTokens, + CacheReadTokens: acc.Usage.CacheReadInputTokens, + }, + ProviderMetadata: fantasy.ProviderMetadata{}, + }) }, nil } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 880bd528b..9d8af299d 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -600,6 +600,113 @@ func TestStream_SendsOutputConfigEffort(t *testing.T) { requireAnthropicEffort(t, call.body, EffortHigh) } +func TestStream_RequiresMessageStopBeforeFinish(t *testing.T) { + t.Parallel() + + completeTextStream := []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_complete","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"hello"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_delta", `{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":1}}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + } + + missingStopReasonStream := append([]string(nil), completeTextStream[:len(completeTextStream)-2]...) + missingStopReasonStream = append(missingStopReasonStream, completeTextStream[len(completeTextStream)-1]) + + tests := []struct { + name string + chunks []string + wantFinish bool + wantRetryable bool + wantErrContain string + }{ + { + name: "complete stream finishes", + chunks: completeTextStream, + wantFinish: true, + }, + { + name: "message_stop without stop_reason errors", + chunks: missingStopReasonStream, + wantRetryable: true, + }, + { + name: "text stream closed before message_stop errors", + chunks: completeTextStream[:len(completeTextStream)-1], + wantRetryable: true, + }, + { + name: "provider error event is preserved", + chunks: []string{ + anthropicSSEEvent("error", `{"type":"error","error":{"type":"api_error","message":"stream down"}}`), + }, + wantErrContain: "stream down", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + server, calls := newAnthropicStreamingServer(tt.chunks) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + parts := collectAnthropicStreamParts(stream) + _ = awaitAnthropicCall(t, calls) + + var finishes, errorParts []fantasy.StreamPart + for _, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.StreamPartTypeError: + errorParts = append(errorParts, part) + } + } + + if tt.wantFinish { + require.Len(t, finishes, 1) + require.Empty(t, errorParts) + return + } + + require.Empty(t, finishes) + require.Len(t, errorParts, 1) + require.Error(t, errorParts[0].Error) + if tt.wantErrContain != "" { + require.Contains(t, errorParts[0].Error.Error(), tt.wantErrContain) + } + + var providerErr *fantasy.ProviderError + if tt.wantRetryable { + require.ErrorAs(t, errorParts[0].Error, &providerErr) + require.True(t, providerErr.IsRetryable()) + require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) + } else { + require.NotErrorIs(t, errorParts[0].Error, io.ErrUnexpectedEOF) + if errors.As(errorParts[0].Error, &providerErr) { + require.False(t, providerErr.IsRetryable()) + require.NotErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) + } + } + }) + } +} + type anthropicCall struct { method string path string @@ -1125,7 +1232,8 @@ func TestGenerate_WebSearchResponse(t *testing.T) { // TextContent with the final answer. require.Len(t, texts, 1) - require.Equal(t, + require.Equal( + t, "Based on recent search results, here is the latest AI news.", texts[0].Text, ) @@ -2587,7 +2695,8 @@ func TestGenerate_ComputerUseTool(t *testing.T) { // Build the next prompt: append the assistant tool-call turn // and the user screenshot-result turn. - prompt = append(prompt, + prompt = append( + prompt, fantasy.Message{ Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ @@ -2767,7 +2876,8 @@ func TestStream_ComputerUseTool(t *testing.T) { require.NoError(t, err, "turn %d", turn) gotActions = append(gotActions, parsed.Action) - prompt = append(prompt, + prompt = append( + prompt, fantasy.Message{ Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ From 98dc56e6308df085841ce8a6885b0bfa2a84da8d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 20 May 2026 11:39:24 -0300 Subject: [PATCH 60/95] v0.25.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index d21d277be..af2dabf3f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.25.0 +0.25.1 From c8d4eb207c97e11d623824c1a711111d63eb1a74 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 21 May 2026 14:49:12 -0300 Subject: [PATCH 61/95] chore: add `.helix/ignore` --- .helix/ignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .helix/ignore diff --git a/.helix/ignore b/.helix/ignore new file mode 100644 index 000000000..793b6caf2 --- /dev/null +++ b/.helix/ignore @@ -0,0 +1 @@ +providertests/testdata From 1b525a18dbc5e267ac254262a80f7d16e99dee4f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 22 May 2026 15:18:33 -0300 Subject: [PATCH 62/95] fix(bedrock): enforce `us-east-1` as region for bedrock (#248) As I understand, this is the only region with access to all models. Having a fixed region should aviod confusion as some users might have `AWS_REGION` or `AWS_DEFAULT_REGION` set, but other regions won't really work. * Catwalk PR: https://github.com/charmbracelet/catwalk/pull/289 * Crush PR: https://github.com/charmbracelet/crush/pull/2985 * Closes #189 --- providers/anthropic/anthropic.go | 2 -- providers/anthropic/bedrock.go | 18 +----------------- providertests/bedrock_test.go | 8 ++++---- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index eb5b735e7..abf5ee831 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -223,8 +223,6 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L ) } if a.options.useBedrock { - modelID = bedrockPrefixModelWithRegion(modelID) - if a.options.skipAuth || a.options.apiKey != "" { clientOptions = append( clientOptions, diff --git a/providers/anthropic/bedrock.go b/providers/anthropic/bedrock.go index 8d9b94959..0d0483869 100644 --- a/providers/anthropic/bedrock.go +++ b/providers/anthropic/bedrock.go @@ -1,29 +1,13 @@ package anthropic import ( - "cmp" - "os" - "strings" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/auth/bearer" ) func bedrockBasicAuthConfig(apiKey string) aws.Config { return aws.Config{ - Region: cmp.Or(os.Getenv("AWS_REGION"), "us-east-1"), + Region: "us-east-1", BearerAuthTokenProvider: bearer.StaticTokenProvider{Token: bearer.Token{Value: apiKey}}, } } - -func bedrockPrefixModelWithRegion(modelID string) string { - region := os.Getenv("AWS_REGION") - if len(region) < 2 { - region = "us-east-1" - } - prefix := region[:2] + "." - if strings.HasPrefix(modelID, prefix) { - return modelID - } - return prefix + modelID -} diff --git a/providertests/bedrock_test.go b/providertests/bedrock_test.go index 382201ea0..f8b9b339f 100644 --- a/providertests/bedrock_test.go +++ b/providertests/bedrock_test.go @@ -30,7 +30,7 @@ func builderBedrockClaudeSonnet(t *testing.T, r *vcr.Recorder) (fantasy.Language if err != nil { return nil, err } - return provider.LanguageModel(t.Context(), "anthropic.claude-sonnet-4-5-20250929-v1:0") + return provider.LanguageModel(t.Context(), "us.anthropic.claude-sonnet-4-5-20250929-v1:0") } func builderBedrockClaudeOpus(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, error) { @@ -41,7 +41,7 @@ func builderBedrockClaudeOpus(t *testing.T, r *vcr.Recorder) (fantasy.LanguageMo if err != nil { return nil, err } - return provider.LanguageModel(t.Context(), "anthropic.claude-opus-4-6-v1") + return provider.LanguageModel(t.Context(), "us.anthropic.claude-opus-4-6-v1") } func builderBedrockClaudeHaiku(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, error) { @@ -52,7 +52,7 @@ func builderBedrockClaudeHaiku(t *testing.T, r *vcr.Recorder) (fantasy.LanguageM if err != nil { return nil, err } - return provider.LanguageModel(t.Context(), "anthropic.claude-haiku-4-5-20251001-v1:0") + return provider.LanguageModel(t.Context(), "us.anthropic.claude-haiku-4-5-20251001-v1:0") } func buildersBedrockBasicAuth(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, error) { @@ -64,5 +64,5 @@ func buildersBedrockBasicAuth(t *testing.T, r *vcr.Recorder) (fantasy.LanguageMo if err != nil { return nil, err } - return provider.LanguageModel(t.Context(), "anthropic.claude-haiku-4-5-20251001-v1:0") + return provider.LanguageModel(t.Context(), "us.anthropic.claude-haiku-4-5-20251001-v1:0") } From 2569fb6b1ee31bb3dd911a06a3f5b279f65b177d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 22 May 2026 15:19:01 -0300 Subject: [PATCH 63/95] ci: fix govulncheck --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 7f2526e5a..f9d2bd059 100644 --- a/go.mod +++ b/go.mod @@ -112,9 +112,9 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.51.0 // indirect - golang.org/x/net v0.54.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.279.0 // indirect diff --git a/go.sum b/go.sum index 8683e9d4d..aec3d255a 100644 --- a/go.sum +++ b/go.sum @@ -249,14 +249,14 @@ go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= From dcabfc5e7dd8537fbd5e0f0d6b92550de8cf421c Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 22 May 2026 15:24:38 -0300 Subject: [PATCH 64/95] v0.25.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index af2dabf3f..166c9e29b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.25.1 +0.25.2 From 470094b54aaf91a12f47b73172f1283bd6711c84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 May 2026 13:36:30 +0000 Subject: [PATCH 65/95] chore(deps): bump the all group with 2 updates (#250) Bumps the all group with 2 updates: [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.17 to 1.32.18 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.17...config/v1.32.18) Updates `google.golang.org/genai` from 1.57.0 to 1.58.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.57.0...v1.58.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.18 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.58.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index f9d2bd059..5aae9adeb 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.25.8 github.com/aws/aws-sdk-go-v2 v1.41.7 - github.com/aws/aws-sdk-go-v2/config v1.32.17 + github.com/aws/aws-sdk-go-v2/config v1.32.18 github.com/aws/smithy-go v1.25.1 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 @@ -20,7 +20,7 @@ require ( github.com/kaptinlin/jsonschema v0.7.14 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.57.0 + google.golang.org/genai v1.58.0 ) require ( @@ -38,7 +38,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.17 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect @@ -50,7 +50,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect diff --git a/go.sum b/go.sum index aec3d255a..de2951ccf 100644 --- a/go.sum +++ b/go.sum @@ -46,10 +46,10 @@ github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6t github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= -github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= -github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug= +github.com/aws/aws-sdk-go-v2/config v1.32.18 h1:Hcia46bxhGgF3BaSnG8nSNCWmqTK6bj9xN9/FJ3WK6Q= +github.com/aws/aws-sdk-go-v2/config v1.32.18/go.mod h1:zEjCAYmxqDadH1WX8CdBvmLKhUEUVFgKRQG38zjDmrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.17 h1:gP2nkGsS+KMvF/jfFz2Vv2qiiOqWKyPACSzPsqHgoW8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.17/go.mod h1:Bsew3S/moG5iT77giPj1q8wb/s0RE5/QfH+ASjYtuQc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= @@ -72,8 +72,8 @@ github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VX github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29h8BvsCoHQEQ6ST9X8w7w= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 h1:nDARhv/oF55bcxF7rCI/4PDxOKnVXVWwDuDwCs2I2SQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= @@ -265,8 +265,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.279.0 h1:hsx2M2OaRcaKtVYK6vXEUnQvdjnend7ZYES+lYaot74= google.golang.org/api v0.279.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= -google.golang.org/genai v1.57.0 h1:qTyG2ynz5dQy2jF4CvZdLHHVslhR0heMue+zM1a4GNM= -google.golang.org/genai v1.57.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.58.0 h1:MNA3ZkRyr7MnRwZ9RNZ60p4+UMKV3yYRw6pyHq4pp0U= +google.golang.org/genai v1.58.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 h1:rhBdfmsOlOZIvz3Y5/BdUzPg2CkO8L7QQPKj96B8554= google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60/go.mod h1:8xo2Pj1b20ZOCpzlU3B9qieMwVIAXx1QVZWLMlPL6sM= google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 h1:3WsB1FAbiRIf2tOxscWKs3pQBD9he1NsrnbhMuWfekc= From e519b1bf1862c732581d7246dc8086b13c94b343 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 May 2026 13:43:33 +0000 Subject: [PATCH 66/95] chore(deps): bump github.com/ardanlabs/kronk (#251) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.25.8 to 1.26.1 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.25.8...v1.26.1) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.26.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 5aae9adeb..a8f755a0a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.3 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.25.8 + github.com/ardanlabs/kronk v1.26.1 github.com/aws/aws-sdk-go-v2 v1.41.7 github.com/aws/aws-sdk-go-v2/config v1.32.18 github.com/aws/smithy-go v1.25.1 @@ -30,7 +30,7 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.11.0 // indirect cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.1 // indirect + cloud.google.com/go/storage v1.62.2 // 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect @@ -69,7 +69,7 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.14.0 // indirect + github.com/hybridgroup/yzma v1.14.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/go-i18n v0.4.8 // indirect github.com/kaptinlin/jsonpointer v0.4.23 // indirect @@ -111,16 +111,16 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.51.0 // indirect + golang.org/x/crypto v0.52.0 // indirect golang.org/x/net v0.55.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.279.0 // indirect - google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/api v0.280.0 // indirect + google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index de2951ccf..6cc2d55b1 100644 --- a/go.sum +++ b/go.sum @@ -14,12 +14,12 @@ cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.13.0 h1:dUfqF8y0bHOeZzF5+tKPZ6RBCeEEDOejvwGwENv/eEc= -cloud.google.com/go/longrunning v0.13.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= +cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= -cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/storage v1.62.2 h1:WgR4U9n7bIzXkkVnwPKKE8bkaKUNsHG+0MAAlh9DGU4= +cloud.google.com/go/storage v1.62.2/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.25.8 h1:m00XchkmanD8LsF1+hW5fE/+6qKgND8LQvdO0M3xwJo= -github.com/ardanlabs/kronk v1.25.8/go.mod h1:lRIUsMXaLFJ0rFniYthW+kpqXWVcr+LnFoyf5LU9JHQ= +github.com/ardanlabs/kronk v1.26.1 h1:6do/vQZDSB8plsuzwbMyotZNBRmcMSsNsxmmlURCEzQ= +github.com/ardanlabs/kronk v1.26.1/go.mod h1:b4DnbGJ7Y7cUOgUgVBKfU2JTxmRm6PotkqdjisNsep0= github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= @@ -139,8 +139,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas= -github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.14.0 h1:40G9wxRG356mqLsIMBWCzJnksxIIVm+cCtdXVMe0Rdw= -github.com/hybridgroup/yzma v1.14.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.14.1 h1:EMSy9ONR8WMljsWwKLDt8gEYJPOEyxZkBtCHxNWxOjQ= +github.com/hybridgroup/yzma v1.14.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -247,8 +247,8 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= @@ -263,16 +263,16 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.279.0 h1:hsx2M2OaRcaKtVYK6vXEUnQvdjnend7ZYES+lYaot74= -google.golang.org/api v0.279.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= +google.golang.org/api v0.280.0 h1:F4OfEHZhZh6a7uTufJAXXVd/2TQ8EjM4vZH+jX/vFYk= +google.golang.org/api v0.280.0/go.mod h1:oGKmPZRDoD3vdkf6MA7F4VNkR1rxCiuaPSkhsf3EolU= google.golang.org/genai v1.58.0 h1:MNA3ZkRyr7MnRwZ9RNZ60p4+UMKV3yYRw6pyHq4pp0U= google.golang.org/genai v1.58.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 h1:rhBdfmsOlOZIvz3Y5/BdUzPg2CkO8L7QQPKj96B8554= -google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60/go.mod h1:8xo2Pj1b20ZOCpzlU3B9qieMwVIAXx1QVZWLMlPL6sM= -google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 h1:3WsB1FAbiRIf2tOxscWKs3pQBD9he1NsrnbhMuWfekc= -google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60/go.mod h1:7yoXV7RIh5gblj/xVYoogxAWvA9wUeVbpsK/M694l00= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 h1:cTHF8xtqtBN5sQ4dcoNwOS6FFejvFTkWQbZXsTU3trM= +google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:RRHjglSYABVCWpQ7USCpdfhcd9t4PkajvVwyynZizTc= +google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 h1:WVVw1Nl19li0fMX++FJ3ye1z9+S1N35QODDy5qpnaXw= +google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:1dCETSCY2YKZNXQE3h4fun3TYwF5p8jejRKZgfWAgAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1:PvEgGJf9C/1u5CHkInMg7UFYYUoiaQmW2LbtH0pjB78= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From 75704eefefa56dd2a536c0b8e0e243ec15df6c76 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 26 May 2026 14:52:52 -0300 Subject: [PATCH 67/95] feat(bedrock): add WithRegion option to configure AWS region (#252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow users to specify a custom AWS region for Bedrock instead of defaulting to us-east-1, enabling support for EU and other regions. 💘 Generated with Crush Assisted-by: Crush:qwen3.7-max --- providers/anthropic/anthropic.go | 12 ++++++++++-- providers/anthropic/bedrock.go | 6 ++++-- providers/bedrock/bedrock.go | 7 +++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index abf5ee831..e3e21b534 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -77,7 +77,8 @@ type options struct { vertexLocation string skipAuth bool - useBedrock bool + useBedrock bool + bedrockRegion string objectMode fantasy.ObjectMode } @@ -142,6 +143,13 @@ func WithBedrock() Option { } } +// WithBedrockRegion sets the AWS region for the Bedrock provider. +func WithBedrockRegion(region string) Option { + return func(o *options) { + o.bedrockRegion = region + } +} + // WithName sets the name for the Anthropic provider. func WithName(name string) Option { return func(o *options) { @@ -226,7 +234,7 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L if a.options.skipAuth || a.options.apiKey != "" { clientOptions = append( clientOptions, - bedrock.WithConfig(bedrockBasicAuthConfig(a.options.apiKey)), + bedrock.WithConfig(bedrockBasicAuthConfig(a.options.apiKey, a.options.bedrockRegion)), ) } else { if cfg, err := config.LoadDefaultConfig(ctx); err == nil { diff --git a/providers/anthropic/bedrock.go b/providers/anthropic/bedrock.go index 0d0483869..b8ac35e6e 100644 --- a/providers/anthropic/bedrock.go +++ b/providers/anthropic/bedrock.go @@ -1,13 +1,15 @@ package anthropic import ( + "cmp" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/smithy-go/auth/bearer" ) -func bedrockBasicAuthConfig(apiKey string) aws.Config { +func bedrockBasicAuthConfig(apiKey string, region string) aws.Config { return aws.Config{ - Region: "us-east-1", + Region: cmp.Or(region, "us-east-1"), BearerAuthTokenProvider: bearer.StaticTokenProvider{Token: bearer.Token{Value: apiKey}}, } } diff --git a/providers/bedrock/bedrock.go b/providers/bedrock/bedrock.go index a430314e2..d3e0854e7 100644 --- a/providers/bedrock/bedrock.go +++ b/providers/bedrock/bedrock.go @@ -78,3 +78,10 @@ func WithSkipAuth(skipAuth bool) Option { o.skipAuth = skipAuth } } + +// WithRegion sets the AWS region for the Bedrock provider. +func WithRegion(region string) Option { + return func(o *options) { + o.anthropicOptions = append(o.anthropicOptions, anthropic.WithBedrockRegion(region)) + } +} From 412a0a5e26d2f955c3838a06a58a9c608dc243c5 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 26 May 2026 14:53:38 -0300 Subject: [PATCH 68/95] v0.26.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 166c9e29b..4e8f395fa 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.25.2 +0.26.0 From f4434d71709cc2d69cb129d8caa93b55e055daa1 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 26 May 2026 15:08:53 -0300 Subject: [PATCH 69/95] ci(labeler): do not use custom token --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index afc6427ff..52935102d 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -14,6 +14,7 @@ on: permissions: issues: write + pull-requests: write contents: read jobs: @@ -26,5 +27,4 @@ jobs: enable-versioned-regex: 0 include-title: 1 include-body: 0 - repo-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} issue-number: ${{ github.event.inputs.issue-number || github.event.issue.number || github.event.pull_request.number }} From 1327dc142cb261935cd2e3677e376d9a226c5787 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 28 May 2026 11:56:09 -0400 Subject: [PATCH 70/95] feat(errors): support ionet context length error --- providers/openai/error.go | 2 +- providers/openai/openai_test.go | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/providers/openai/error.go b/providers/openai/error.go index 5cbc76be0..1d31ba74f 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -13,7 +13,7 @@ import ( "github.com/charmbracelet/openai-go" ) -var openaiContextPattern = regexp.MustCompile(`maximum context length is (\d+) tokens.*?(?:resulted in|requested) (\d+) tokens`) +var openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) func toProviderErr(err error) error { var apiErr *openai.Error diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 24f4a687c..ba4cef3fb 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -3664,6 +3664,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantUsed: 10000, wantMax: 8192, }, + { + name: "matches ionet format with of and tilde", + message: "Your request exceeds this model's maximum context length of 204800 tokens. You requested ~269722 tokens (204186 input + 65536 output). Reduce your prompt length or max_tokens and retry.", + wantErr: true, + wantUsed: 269722, + wantMax: 204800, + }, { name: "does not match unrelated error", message: "invalid api key", From 22785dab6daac0c44809db62d3aba5c5f549b514 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 28 May 2026 17:57:09 -0300 Subject: [PATCH 71/95] fix(bedrock): apply region if given for aws config as well (#255) Before, it was only being applied for raw API keys. --- providers/anthropic/anthropic.go | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index e3e21b534..01e049358 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -238,6 +238,7 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L ) } else { if cfg, err := config.LoadDefaultConfig(ctx); err == nil { + cfg.Region = cmp.Or(a.options.bedrockRegion, cfg.Region) clientOptions = append( clientOptions, bedrock.WithConfig(cfg), From da2032ff00f5994154e628f3bb7e755f7ee5f62b Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 28 May 2026 17:58:06 -0300 Subject: [PATCH 72/95] v0.27.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 4e8f395fa..1b58cc101 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.26.0 +0.27.0 From 55563e4ed1e27b2065e5bb728cb4557d6263dc45 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 28 May 2026 16:36:06 -0400 Subject: [PATCH 73/95] feat(errors): add proper context window errors for alibaba --- providers/openai/error.go | 18 ++++++++++++------ providers/openai/openai_test.go | 6 ++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/providers/openai/error.go b/providers/openai/error.go index 1d31ba74f..873105f71 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -13,7 +13,10 @@ import ( "github.com/charmbracelet/openai-go" ) -var openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) +var ( + openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) + alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) +) func toProviderErr(err error) error { var apiErr *openai.Error @@ -46,13 +49,16 @@ func toProviderErr(err error) error { } func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { - matches := openaiContextPattern.FindStringSubmatch(message) - if matches == nil { + if matches := openaiContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[2]) return } - providerErr.ContextTooLargeErr = true - providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) - providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[2]) + if matches := alibabaContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) + } } func toProviderErrMessage(apiErr *openai.Error) string { diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index ba4cef3fb..17d4af015 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -3671,6 +3671,12 @@ func TestParseContextTooLargeError(t *testing.T) { wantUsed: 269722, wantMax: 204800, }, + { + name: "matches alibaba/qwen format", + message: "<400> InternalError.Algo.InvalidParameter: Range of input length should be [1, 245760]", + wantErr: true, + wantMax: 245760, + }, { name: "does not match unrelated error", message: "invalid api key", From 80572360055eedbcd25605f3b47369f8ab3f5f45 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 29 May 2026 13:26:31 -0400 Subject: [PATCH 74/95] v0.28.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 1b58cc101..697f087f3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.27.0 +0.28.0 From 798593037331aae8391692894ee564d0bd70a8f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 03:23:52 +0000 Subject: [PATCH 75/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#263) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.26.1 to 1.26.6 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.26.1...v1.26.6) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.26.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 72 +++++++++++++-------------- go.sum | 150 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 112 insertions(+), 110 deletions(-) diff --git a/go.mod b/go.mod index a8f755a0a..abc282d72 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.26.3 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.26.1 - github.com/aws/aws-sdk-go-v2 v1.41.7 - github.com/aws/aws-sdk-go-v2/config v1.32.18 - github.com/aws/smithy-go v1.25.1 + github.com/ardanlabs/kronk v1.26.6 + github.com/aws/aws-sdk-go-v2 v1.41.9 + github.com/aws/aws-sdk-go-v2/config v1.32.20 + github.com/aws/smithy-go v1.26.0 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -37,28 +37,28 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.17 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.19 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/ebitengine/purego v0.10.0 // indirect + github.com/ebitengine/purego v0.10.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -73,7 +73,7 @@ require ( github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect @@ -89,7 +89,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/common v0.68.0 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect @@ -98,16 +98,16 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.15 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect @@ -117,10 +117,10 @@ require ( golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.280.0 // indirect - google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect + google.golang.org/api v0.282.0 // indirect + google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 6cc2d55b1..e31bc956b 100644 --- a/go.sum +++ b/go.sum @@ -40,44 +40,44 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.26.1 h1:6do/vQZDSB8plsuzwbMyotZNBRmcMSsNsxmmlURCEzQ= -github.com/ardanlabs/kronk v1.26.1/go.mod h1:b4DnbGJ7Y7cUOgUgVBKfU2JTxmRm6PotkqdjisNsep0= -github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= -github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= -github.com/aws/aws-sdk-go-v2/config v1.32.18 h1:Hcia46bxhGgF3BaSnG8nSNCWmqTK6bj9xN9/FJ3WK6Q= -github.com/aws/aws-sdk-go-v2/config v1.32.18/go.mod h1:zEjCAYmxqDadH1WX8CdBvmLKhUEUVFgKRQG38zjDmrY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.17 h1:gP2nkGsS+KMvF/jfFz2Vv2qiiOqWKyPACSzPsqHgoW8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.17/go.mod h1:Bsew3S/moG5iT77giPj1q8wb/s0RE5/QfH+ASjYtuQc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0 h1:nDARhv/oF55bcxF7rCI/4PDxOKnVXVWwDuDwCs2I2SQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.0/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= -github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= -github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.26.6 h1:u4wlgPbdUrGBYp7ZjOVji9tiBnP2mYU05zY/Ca8GPR4= +github.com/ardanlabs/kronk v1.26.6/go.mod h1:yImFM7h+YvTMP4y7JJ837M1X02c+skeiTJ600F+V2tQ= +github.com/aws/aws-sdk-go-v2 v1.41.9 h1:/rYeyO2+HrMztAmxAq9++XJtFMqSIpSsNA0yDGALYq4= +github.com/aws/aws-sdk-go-v2 v1.41.9/go.mod h1:+HsoOEX80qAVUitj1A2DhCNTjmb3edVyuDypb6LNEeo= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11 h1:h5+3VT69KUBK24grGuuA5saDJTj2IIjLb9au668Fo5I= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11/go.mod h1:dnakxebH6UwFvcvujL0LVggYQ8nEvBGjU4G/V79Nv94= +github.com/aws/aws-sdk-go-v2/config v1.32.20 h1:8VMDnWc/kEzxsI/1ngGM9mG81a8IGmIHD8KLcYGwagc= +github.com/aws/aws-sdk-go-v2/config v1.32.20/go.mod h1:PuwEpciweIXGULWeOeSTXtSbH4CW9mWdWrhdCKQI1sM= +github.com/aws/aws-sdk-go-v2/credentials v1.19.19 h1:yuFzSV1U0aRNYCQGVaTY2zW2M/L93pYHnXnrJUphYhU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.19/go.mod h1:7y63L1kGzeoDlJaQ3Z578KrnmfBut96JjvJUzGwR+YE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 h1:0w6dCiO8iez+YKwRhRBlL1CH/E3GTfdkuzrwj1by8vo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25/go.mod h1:9FDWUothyr5RCRAHc45XOiVCzUR8n/IhCYX+uVqw6vk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 h1:Uii3frf9ztec/ABM2/FSH9/z7PLzxfpG8h4RpkUFflQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25/go.mod h1:G6kntsA2GorAxDPbap6xgB2F+amSLUF8GJTi7PUoX44= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 h1:r1+/l6m+WaUJF9HISEsNOLHSNj5EXYQxK8VX6Cz9NlA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25/go.mod h1:cKf+D+NMDK1LndD7BowHbBZPgR9V0/5HubH0PFWvA+c= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 h1:A1PmWU2zfkIm9EyFlJncFXL4W4phML+h8KjltUsCvNQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26/go.mod h1:dY4MRzXEizrD4hqtpKvWVGPX7QleSGGVY+EBolo1RmM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 h1:d5/908OJ4bXg8lyjeMPvXetEKqoDoLi5Owy1zNue3yg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10/go.mod h1:a57l7Hwh+FWI+we50g5NPJHYUKeJKfXbc4w8SyXu8Ig= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18 h1:W/EyPFl9A5rXrtoilfwHYEvzHER+K4SpBPtMXi24Mos= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18/go.mod h1:UG50K+pvd/uy6xExbobg0rjqFBFZe6I3l75EPDZw4tg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 h1:dD3dhHNglpd98gs72my22Ndqi1hqQGllFFg1F+twfxg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25/go.mod h1:0yAbjPfd64gG7mj85RW+fMEYdfBgCRZw8g/oWcL1pjc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25 h1:2pQEbwf+/6EDbiit/GcBE2K4IUpMZymaA0kOz3xK978= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25/go.mod h1:KvT6NCcQ0EZ+ZkVRrlBMt04Po3ok23YELEp7WimhLhM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2 h1:ie4ElCmUKS26pzrZcIk/lmt4yWjAqLLcawstyQCh298= +github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2/go.mod h1:zjsomFeX5duj+4PlMB+o4JoWTIx+G0XMyzjYrUbQkN0= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 h1:1VwbP3qMNfxUDEXWki4rCE5iA+44VA1lokTz9HasGzw= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.1/go.mod h1:vUtyoSj0OPji3kjIVSc/GlKuWEiL33f/WFxl6dmpy/A= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 h1:N6pIsdFOW1Kd9S4KyFKXdGRBojPPxkP32+uHFWLv4Hc= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.19/go.mod h1:3gt5WJArFooNmyLONS+h/R4J+o86II8du38IgCwj9dE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 h1:hc+lBYiiTr8Zk4MTzIsQ92MeDWCIDvWGmzKUWOaBcOg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2/go.mod h1:hU6fqB3OJA6/ePheD47LQnxvjYk6br6PtQxs+Q9ojvk= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 h1:ErklX/7uhSbkAAeyQD/Y1OoQ9hO3SJXQNEgksORW3Js= +github.com/aws/aws-sdk-go-v2/service/sts v1.42.3/go.mod h1:ULe4HCzfKPiR6R3HEurE3b1upEkuk8AkMrOKtaOxKO8= +github.com/aws/smithy-go v1.26.0 h1:9ouqbi+NyKP7fV3Te7UElCwdAb6Y8uk7LGwPE5tVe/s= +github.com/aws/smithy-go v1.26.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -102,8 +102,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= -github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= +github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= @@ -127,8 +127,8 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= -github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= 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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -147,8 +147,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= @@ -193,8 +193,8 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/common v0.68.0 h1:8rQJvQmYltsR2L7h8Zw0Iyj8WYNNmpwikoQTZXwfVeA= +github.com/prometheus/common v0.68.0/go.mod h1:4soH+U8yJSROk7OJ//hmTiWKsxapv6zRGgTt3keN8gQ= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -217,28 +217,30 @@ github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= +go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -263,16 +265,16 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.280.0 h1:F4OfEHZhZh6a7uTufJAXXVd/2TQ8EjM4vZH+jX/vFYk= -google.golang.org/api v0.280.0/go.mod h1:oGKmPZRDoD3vdkf6MA7F4VNkR1rxCiuaPSkhsf3EolU= +google.golang.org/api v0.282.0 h1:WmJiSVqUnKqJCpJOx7YADbXaC+9DDsnGSfllFSj7R2I= +google.golang.org/api v0.282.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= google.golang.org/genai v1.58.0 h1:MNA3ZkRyr7MnRwZ9RNZ60p4+UMKV3yYRw6pyHq4pp0U= google.golang.org/genai v1.58.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68 h1:cTHF8xtqtBN5sQ4dcoNwOS6FFejvFTkWQbZXsTU3trM= -google.golang.org/genproto v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:RRHjglSYABVCWpQ7USCpdfhcd9t4PkajvVwyynZizTc= -google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68 h1:WVVw1Nl19li0fMX++FJ3ye1z9+S1N35QODDy5qpnaXw= -google.golang.org/genproto/googleapis/api v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:1dCETSCY2YKZNXQE3h4fun3TYwF5p8jejRKZgfWAgAY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1:PvEgGJf9C/1u5CHkInMg7UFYYUoiaQmW2LbtH0pjB78= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From 2d27a0e9e03271f85e868e76d9f756c3ed1ffd92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 03:30:10 +0000 Subject: [PATCH 76/95] chore(deps): bump github.com/kaptinlin/jsonschema (#264) Bumps the all group with 1 update in the / directory: [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema). Updates `github.com/kaptinlin/jsonschema` from 0.7.14 to 0.7.15 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.14...v0.7.15) --- updated-dependencies: - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.7.15 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index abc282d72..6ea924d96 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.14 + github.com/kaptinlin/jsonschema v0.7.15 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/genai v1.58.0 @@ -63,7 +63,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836 // indirect + github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -79,8 +79,8 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.14.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/go-i18n v0.4.8 // indirect - github.com/kaptinlin/jsonpointer v0.4.23 // indirect + github.com/kaptinlin/go-i18n v0.4.9 // indirect + github.com/kaptinlin/jsonpointer v0.4.25 // indirect github.com/kaptinlin/messageformat-go v0.6.4 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect diff --git a/go.sum b/go.sum index e31bc956b..472da90ae 100644 --- a/go.sum +++ b/go.sum @@ -116,8 +116,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836 h1:5KGUhXZFTN1PrCY4zUZLe1J8n7uBNmPDbCLCn78EbPQ= -github.com/go-json-experiment/json v0.0.0-20260505212615-e40f80bf6836/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686 h1:NZBJxCpbHS1gzS6xAmyxbJznosZIIPk9IB42v62UvKA= +github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -161,12 +161,12 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/go-i18n v0.4.8 h1:ymGkz0uU974wljuuHZufHP1BlFWVk5Tf/sSMO8Cl9yQ= -github.com/kaptinlin/go-i18n v0.4.8/go.mod h1:F+ezt0Q39p5x8PQW6p4xKMovhjNbhZYHuqwyEV1hHMw= -github.com/kaptinlin/jsonpointer v0.4.23 h1:0VisnCL7rJT7BRTwxSWMU7vC0PD/RFgmisNcURkWp3k= -github.com/kaptinlin/jsonpointer v0.4.23/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= -github.com/kaptinlin/jsonschema v0.7.14 h1:6grzaTJiRuLXlIGEdlGX5HEII3Za2tV+xxGpW3Kg4Rc= -github.com/kaptinlin/jsonschema v0.7.14/go.mod h1:9WFuBzJjrvNkXVjo0L2Ujl1T/yqAGurwgbx4JWgF5C8= +github.com/kaptinlin/go-i18n v0.4.9 h1:kxYNfExb1GG241BIPnQaD3YOvWkP7poHwfj8ctwIpkw= +github.com/kaptinlin/go-i18n v0.4.9/go.mod h1:15vHHYLhwo1stIdztJatujSttIY6sRFt+7v8K1ik1AA= +github.com/kaptinlin/jsonpointer v0.4.25 h1:iJ197e8n+WwqaqBsa53FqG3rPJCg5oijyFXEXNWWC3E= +github.com/kaptinlin/jsonpointer v0.4.25/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= +github.com/kaptinlin/jsonschema v0.7.15 h1:5v9TBnGOm/DV4EEsC13dfR0UXid/3OcR7yAnpRlruE0= +github.com/kaptinlin/jsonschema v0.7.15/go.mod h1:5njr9isKoP9FnqZrFV1Iygx7QqjN3SBZ/AkgBl4Elug= github.com/kaptinlin/messageformat-go v0.6.4 h1:6nC70fsqEn2xxg/Xoby2+Dk2r77kvxa3QNnYL/hsNcM= github.com/kaptinlin/messageformat-go v0.6.4/go.mod h1:553UGZ1x5jmGtyH4pQKYwLGMyPm71deCoZICjq1DtR8= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= From 283ecba7dc1162da8b7778c8506d0ba0b6472ca0 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 2 Jun 2026 18:15:59 -0300 Subject: [PATCH 77/95] feat(anthropic): add support for "extra body" (#266) --- providers/anthropic/anthropic.go | 8 ++++++++ providers/anthropic/provider_options.go | 1 + 2 files changed, 9 insertions(+) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 01e049358..2481be5c9 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -42,6 +42,11 @@ func betaRequestOptions(flags []string) []option.RequestOption { // by Generate and Stream: user-agent, raw tool injection, and any // beta API flags. func buildRequestOptions(call fantasy.Call, rawTools []json.RawMessage, betaFlags []string) []option.RequestOption { + providerOptions := &ProviderOptions{} + if v, ok := call.ProviderOptions[Name]; ok { + providerOptions, _ = v.(*ProviderOptions) + } + reqOpts := callUARequestOptions(call) if len(rawTools) > 0 { // Tools are injected as raw JSON rather than via params.Tools @@ -50,6 +55,9 @@ func buildRequestOptions(call fantasy.Call, rawTools []json.RawMessage, betaFlag // this will need updating. reqOpts = append(reqOpts, option.WithJSONSet("tools", rawTools)) } + for k, v := range providerOptions.ExtraBody { + reqOpts = append(reqOpts, option.WithJSONSet(k, v)) + } if len(betaFlags) > 0 { reqOpts = append(reqOpts, betaRequestOptions(betaFlags)...) } diff --git a/providers/anthropic/provider_options.go b/providers/anthropic/provider_options.go index ae643b3c7..4c89a4438 100644 --- a/providers/anthropic/provider_options.go +++ b/providers/anthropic/provider_options.go @@ -71,6 +71,7 @@ type ProviderOptions struct { Thinking *ThinkingProviderOption `json:"thinking"` Effort *Effort `json:"effort"` DisableParallelToolUse *bool `json:"disable_parallel_tool_use"` + ExtraBody map[string]any `json:"extra_body,omitempty"` } // Options implements the ProviderOptions interface. From 0e7200140b00449f895ae75537d3bbffd525bd8a Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 2 Jun 2026 18:16:17 -0300 Subject: [PATCH 78/95] v0.29.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 697f087f3..ae6dd4e20 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.28.0 +0.29.0 From a79c920d37c9c9e23274e1fd311c6d1dedeeddce Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Wed, 3 Jun 2026 06:48:30 +0000 Subject: [PATCH 79/95] fix(providers/anthropic): forward PDF filename to document title Anthropic's DocumentBlockParam exposes a Title field that the model uses when it refers back to an attached document. Forward FilePart.Filename into that field so users can ask the model about a document by name. The title is sanitized first: Anthropic restricts titles to alphanumerics, whitespace, hyphens, parentheses, and square brackets, and returns 'The document file name can only contain alphanumeric characters, whitespace characters, hyphens, parentheses, and square brackets.' for any title containing other runes. Disallowed runes are replaced with spaces, runs of whitespace are collapsed, and the result is trimmed. Empty or fully disallowed input falls back to 'Document' so every attached document has a stable handle, matching the invariant the OpenAI provider already enforces with its part-N.pdf synthetic name. The sanitizer is a Go port of the implementation in coder/mux (src/node/utils/messages/sanitizeAnthropicDocumentFilename.ts); prior art for sending filename as title also includes vercel/ai's @ai-sdk/anthropic, which sets document.title from part.filename when no provider-options title is supplied. --- providers/anthropic/anthropic.go | 1 + providers/anthropic/anthropic_test.go | 31 ++++++++++ providers/anthropic/sanitize.go | 33 +++++++++++ providers/anthropic/sanitize_test.go | 81 +++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 providers/anthropic/sanitize.go create mode 100644 providers/anthropic/sanitize_test.go diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 2481be5c9..95c6adc91 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -874,6 +874,7 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl docBlock := anthropic.NewDocumentBlock(anthropic.Base64PDFSourceParam{ Data: base64Encoded, }) + docBlock.OfDocument.Title = anthropic.String(sanitizeAnthropicDocumentTitle(file.Filename)) if cacheControl != nil { docBlock.OfDocument.CacheControl = anthropic.NewCacheControlEphemeralParam() } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 9d8af299d..c95c5d4c8 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -322,6 +322,7 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ fantasy.FilePart{ + Filename: "quarterly_report.v1.pdf", Data: []byte("fake pdf data"), MediaType: "application/pdf", }, @@ -333,6 +334,36 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { require.Empty(t, systemBlocks) require.Len(t, messages, 1) + require.Len(t, messages[0].Content, 1) + require.NotNil(t, messages[0].Content[0].OfDocument) + require.Equal(t, "quarterly report v1 pdf", messages[0].Content[0].OfDocument.Title.Value) + require.True(t, messages[0].Content[0].OfDocument.Title.Valid()) + require.Empty(t, warnings) + }) + + t.Run("should fall back to Document title when PDF filename is missing", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.FilePart{ + Data: []byte("fake pdf data"), + MediaType: "application/pdf", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Len(t, messages, 1) + require.Len(t, messages[0].Content, 1) + require.NotNil(t, messages[0].Content[0].OfDocument) + require.Equal(t, "Document", messages[0].Content[0].OfDocument.Title.Value) + require.True(t, messages[0].Content[0].OfDocument.Title.Valid()) require.Empty(t, warnings) }) diff --git a/providers/anthropic/sanitize.go b/providers/anthropic/sanitize.go new file mode 100644 index 000000000..f9b664219 --- /dev/null +++ b/providers/anthropic/sanitize.go @@ -0,0 +1,33 @@ +package anthropic + +import ( + "regexp" + "strings" +) + +// anthropicDocumentTitleDisallowed matches every rune that Anthropic's +// document title field rejects. The allowlist is alphanumerics, whitespace, +// hyphens, parentheses, and square brackets. Anything else is replaced +// with a space; consecutive whitespace is then collapsed. +// +// Anthropic returns "The document file name can only contain alphanumeric +// characters, whitespace characters, hyphens, parentheses, and square +// brackets." when the title falls outside this set. +var anthropicDocumentTitleDisallowed = regexp.MustCompile(`[^a-zA-Z0-9\s\-()\[\]]`) + +// anthropicDocumentTitleWhitespace collapses runs of whitespace. +var anthropicDocumentTitleWhitespace = regexp.MustCompile(`\s+`) + +// sanitizeAnthropicDocumentTitle adapts a filename for use as the title +// field on an Anthropic DocumentBlock. Disallowed characters are replaced +// with spaces, runs of whitespace are collapsed, and the result is trimmed. +// Empty input (or input that sanitizes to empty) returns "Document" so the +// model always has a stable handle for the attachment. +func sanitizeAnthropicDocumentTitle(filename string) string { + replaced := anthropicDocumentTitleDisallowed.ReplaceAllString(filename, " ") + collapsed := strings.TrimSpace(anthropicDocumentTitleWhitespace.ReplaceAllString(replaced, " ")) + if collapsed == "" { + return "Document" + } + return collapsed +} diff --git a/providers/anthropic/sanitize_test.go b/providers/anthropic/sanitize_test.go new file mode 100644 index 000000000..6d99a94c6 --- /dev/null +++ b/providers/anthropic/sanitize_test.go @@ -0,0 +1,81 @@ +package anthropic + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSanitizeAnthropicDocumentTitle(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + input string + want string + }{ + { + name: "empty falls back to Document", + input: "", + want: "Document", + }, + { + name: "all disallowed falls back to Document", + input: "...", + want: "Document", + }, + { + name: "whitespace only falls back to Document", + input: " \t\n", + want: "Document", + }, + { + name: "alphanumeric is preserved", + input: "report 2026", + want: "report 2026", + }, + { + name: "dots and underscores become spaces", + input: "quarterly_report.v1.pdf", + want: "quarterly report v1 pdf", + }, + { + name: "preserves hyphens, parentheses, square brackets", + input: "draft-1 (final) [v2].pdf", + want: "draft-1 (final) [v2] pdf", + }, + { + name: "collapses runs of whitespace", + input: "name with spaces", + want: "name with spaces", + }, + { + name: "trims leading and trailing whitespace", + input: " leading and trailing ", + want: "leading and trailing", + }, + { + name: "leading dots collapse to single space then trim", + input: "..hidden.txt", + want: "hidden txt", + }, + { + name: "non-ascii letters are not allowlisted", + input: "résumé.pdf", + want: "r sum pdf", + }, + { + name: "production failure example is sanitized", + input: "D19910350Lj.pdf", + want: "D19910350Lj pdf", + }, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + require.Equal(t, tc.want, sanitizeAnthropicDocumentTitle(tc.input)) + }) + } +} From c9afe3be5c6c994a4f474800e63e7f1c284a8bbf Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Wed, 3 Jun 2026 06:49:22 +0000 Subject: [PATCH 80/95] fix(providers/anthropic): forward text filename and warn on unsupported media types Mirror the PDF document-title handling on the text/* document branch so text attachments also reach Anthropic with a stable handle the model can refer back to. The filename runs through the same sanitizer; an empty or fully disallowed filename falls back to 'Document'. Also add a default case to the file MediaType switch that emits a CallWarning when a FilePart's media type is not handled. Previously the Anthropic provider silently dropped any file with a media type other than image/*, application/pdf, or text/*, so unsupported attachments left no trace for the caller. The new behavior matches the openai, openaicompat, openrouter, and vercel providers, which already warn on unsupported FilePart media types. --- providers/anthropic/anthropic.go | 6 +++ providers/anthropic/anthropic_test.go | 67 +++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 95c6adc91..814b48122 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -883,10 +883,16 @@ func toPrompt(prompt fantasy.Prompt, sendReasoningData bool) ([]anthropic.TextBl documentBlock := anthropic.NewDocumentBlock(anthropic.PlainTextSourceParam{ Data: string(file.Data), }) + documentBlock.OfDocument.Title = anthropic.String(sanitizeAnthropicDocumentTitle(file.Filename)) if cacheControl != nil { documentBlock.OfDocument.CacheControl = anthropic.NewCacheControlEphemeralParam() } anthropicContent = append(anthropicContent, documentBlock) + default: + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("file part media type %s not supported", file.MediaType), + }) } } } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index c95c5d4c8..3d55d2fe6 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -375,6 +375,7 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ fantasy.FilePart{ + Filename: "notes_v1.md", Data: []byte("# Hello World\nSome markdown content"), MediaType: "text/markdown", }, @@ -386,9 +387,66 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { require.Empty(t, systemBlocks) require.Len(t, messages, 1) + require.Len(t, messages[0].Content, 1) + require.NotNil(t, messages[0].Content[0].OfDocument) + require.Equal(t, "notes v1 md", messages[0].Content[0].OfDocument.Title.Value) + require.True(t, messages[0].Content[0].OfDocument.Title.Valid()) require.Empty(t, warnings) }) + t.Run("should fall back to Document title when text filename is missing", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.FilePart{ + Data: []byte("# Hello World\nSome markdown content"), + MediaType: "text/markdown", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Len(t, messages, 1) + require.Len(t, messages[0].Content, 1) + require.NotNil(t, messages[0].Content[0].OfDocument) + require.Equal(t, "Document", messages[0].Content[0].OfDocument.Title.Value) + require.True(t, messages[0].Content[0].OfDocument.Title.Valid()) + require.Empty(t, warnings) + }) + + t.Run("should warn on unsupported file media type while keeping visible content", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "look at this archive"}, + fantasy.FilePart{ + Filename: "logs.zip", + Data: []byte("not supported"), + MediaType: "application/zip", + }, + }, + }, + } + + systemBlocks, messages, warnings := toPrompt(prompt, true) + + require.Empty(t, systemBlocks) + require.Len(t, messages, 1) + require.Len(t, warnings, 1) + require.Equal(t, fantasy.CallWarningTypeOther, warnings[0].Type) + require.Contains(t, warnings[0].Message, "application/zip") + require.Contains(t, warnings[0].Message, "not supported") + }) + t.Run("should drop user messages without visible content", func(t *testing.T) { t.Parallel() @@ -408,10 +466,13 @@ func TestToPrompt_DropsEmptyMessages(t *testing.T) { require.Empty(t, systemBlocks) require.Empty(t, messages) - require.Len(t, warnings, 1) + require.Len(t, warnings, 2) require.Equal(t, fantasy.CallWarningTypeOther, warnings[0].Type) - require.Contains(t, warnings[0].Message, "dropping empty user message") - require.Contains(t, warnings[0].Message, "neither user-facing content nor tool results") + require.Contains(t, warnings[0].Message, "application/zip") + require.Contains(t, warnings[0].Message, "not supported") + require.Equal(t, fantasy.CallWarningTypeOther, warnings[1].Type) + require.Contains(t, warnings[1].Message, "dropping empty user message") + require.Contains(t, warnings[1].Message, "neither user-facing content nor tool results") }) t.Run("should keep user messages with tool results", func(t *testing.T) { From 5876e9146a9c6eae29f6724c9aa18c45a71d5aaf Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 3 Jun 2026 11:02:01 -0300 Subject: [PATCH 81/95] ci: fix govulncheck --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 6ea924d96..ff47c341e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.26.3 +go 1.26.4 require ( charm.land/x/vcr v0.1.1 From 124d86ad1cc0b894b56a17921e4af9f6512657a3 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 3 Jun 2026 11:10:10 -0300 Subject: [PATCH 82/95] v0.29.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ae6dd4e20..25939d35c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.29.0 +0.29.1 From 0a925a9e3a004137c8e13834940a91ece77a582d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 5 Jun 2026 09:52:35 -0300 Subject: [PATCH 83/95] feat(vercel): add ability to set zero data retention (#269) https://vercel.com/docs/ai-gateway/capabilities/zdr#using-the-chat-completions-api --- providers/vercel/provider_options.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/providers/vercel/provider_options.go b/providers/vercel/provider_options.go index 163921b97..f554c3f96 100644 --- a/providers/vercel/provider_options.go +++ b/providers/vercel/provider_options.go @@ -69,6 +69,8 @@ type GatewayProviderOptions struct { Order []string `json:"order,omitempty"` // Models is the list of fallback models to try if the primary model fails. Models []string `json:"models,omitempty"` + // ZeroDataRetention control whether zero data retention is enforced. + ZeroDataRetention *bool `json:"zeroDataRetention,omitempty"` } // BYOKCredential represents a single provider credential for BYOK. From e9cf7a1379e05a10934aa8f585dc792252f0d065 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:12:20 +0200 Subject: [PATCH 84/95] fix(anthropic): send thinking display (#270) - Adds a typed Anthropic `ThinkingDisplay` provider option with `summarized` and `omitted` values. - Sends `thinking.display` for adaptive thinking and budget-token thinking, defaulting omitted-display models to `summarized` when thinking is enabled. - Converts budget-token thinking on adaptive-only models to adaptive thinking, while preserving plain Opus 4.7+ calls without a `thinking` field. --- providers/anthropic/anthropic.go | 68 ++++++++- providers/anthropic/anthropic_test.go | 191 ++++++++++++++++++++++++ providers/anthropic/provider_options.go | 11 ++ 3 files changed, 269 insertions(+), 1 deletion(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 814b48122..d00ebe09e 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -11,6 +11,7 @@ import ( "io" "maps" "math" + "strconv" "strings" "charm.land/fantasy" @@ -38,6 +39,51 @@ func betaRequestOptions(flags []string) []option.RequestOption { return opts } +func thinkingDisplay(providerOptions *ProviderOptions, modelID string) (ThinkingDisplay, bool) { + if providerOptions != nil && providerOptions.ThinkingDisplay != nil && *providerOptions.ThinkingDisplay != "" { + return *providerOptions.ThinkingDisplay, true + } + if defaultsToOmittedThinkingDisplay(modelID) { + return ThinkingDisplaySummarized, true + } + return "", false +} + +func defaultsToAdaptiveThinking(model string) bool { + model = strings.ToLower(strings.TrimSpace(model)) + return strings.Contains(model, "claude-mythos-preview") +} + +func requiresAdaptiveThinking(model string) bool { + return defaultsToAdaptiveThinking(model) || defaultsToOmittedOpusThinkingDisplay(model) +} + +func setThinkingDisplay(param interface{ SetExtraFields(map[string]any) }, display ThinkingDisplay) { + param.SetExtraFields(map[string]any{"display": string(display)}) +} + +func defaultsToOmittedThinkingDisplay(model string) bool { + model = strings.ToLower(strings.TrimSpace(model)) + return defaultsToAdaptiveThinking(model) || defaultsToOmittedOpusThinkingDisplay(model) +} + +func defaultsToOmittedOpusThinkingDisplay(model string) bool { + _, suffix, ok := strings.Cut(model, "claude-opus-4-") + if !ok { + return false + } + + versionEnd := 0 + for versionEnd < len(suffix) && suffix[versionEnd] >= '0' && suffix[versionEnd] <= '9' { + versionEnd++ + } + if versionEnd == 0 || versionEnd > 2 { + return false + } + minor, err := strconv.Atoi(suffix[:versionEnd]) + return err == nil && minor >= 7 +} + // buildRequestOptions constructs the common request options shared // by Generate and Stream: user-agent, raw tool injection, and any // beta API flags. @@ -342,12 +388,26 @@ func (a languageModel) prepareParams(call fantasy.Call) ( Effort: anthropic.OutputConfigEffort(effort), } adaptive := anthropic.NewThinkingConfigAdaptiveParam() + if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { + setThinkingDisplay(&adaptive, display) + } params.Thinking.OfAdaptive = &adaptive case providerOptions.Thinking != nil: if providerOptions.Thinking.BudgetTokens == 0 { return nil, nil, nil, nil, &fantasy.Error{Title: "no budget", Message: "thinking requires budget"} } - params.Thinking = anthropic.ThinkingConfigParamOfEnabled(providerOptions.Thinking.BudgetTokens) + if requiresAdaptiveThinking(a.modelID) { + adaptive := anthropic.NewThinkingConfigAdaptiveParam() + if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { + setThinkingDisplay(&adaptive, display) + } + params.Thinking.OfAdaptive = &adaptive + } else { + params.Thinking = anthropic.ThinkingConfigParamOfEnabled(providerOptions.Thinking.BudgetTokens) + if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { + setThinkingDisplay(params.Thinking.OfEnabled, display) + } + } if call.Temperature != nil { params.Temperature = param.Opt[float64]{} warnings = append(warnings, fantasy.CallWarning{ @@ -372,6 +432,12 @@ func (a languageModel) prepareParams(call fantasy.Call) ( Details: "TopK is not supported when thinking is enabled", }) } + case defaultsToAdaptiveThinking(a.modelID): + adaptive := anthropic.NewThinkingConfigAdaptiveParam() + if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { + setThinkingDisplay(&adaptive, display) + } + params.Thinking.OfAdaptive = &adaptive } if len(call.Tools) > 0 { diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 3d55d2fe6..2ee0cfe70 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -612,6 +612,7 @@ func TestParseOptions_Effort(t *testing.T) { "send_reasoning": true, "thinking": map[string]any{"budget_tokens": int64(2048)}, "effort": "medium", + "thinking_display": "summarized", "disable_parallel_tool_use": true, }) require.NoError(t, err) @@ -621,6 +622,8 @@ func TestParseOptions_Effort(t *testing.T) { require.Equal(t, int64(2048), options.Thinking.BudgetTokens) require.NotNil(t, options.Effort) require.Equal(t, EffortMedium, *options.Effort) + require.NotNil(t, options.ThinkingDisplay) + require.Equal(t, ThinkingDisplaySummarized, *options.ThinkingDisplay) require.NotNil(t, options.DisableParallelToolUse) require.True(t, *options.DisableParallelToolUse) } @@ -655,6 +658,194 @@ func TestGenerate_SendsOutputConfigEffort(t *testing.T) { requireAnthropicEffort(t, call.body, EffortMedium) } +func TestGenerate_SendsThinkingDisplay(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + model string + options func() *ProviderOptions + wantType string + wantDisplay string + wantBudget int64 + }{ + { + name: "explicit display with adaptive thinking", + model: "claude-sonnet-4-20250514", + options: func() *ProviderOptions { + effort := EffortMedium + display := ThinkingDisplayOmitted + return &ProviderOptions{Effort: &effort, ThinkingDisplay: &display} + }, + wantType: "adaptive", + wantDisplay: "omitted", + }, + { + name: "explicit display with budget thinking", + model: "claude-sonnet-4-20250514", + options: func() *ProviderOptions { + display := ThinkingDisplaySummarized + return &ProviderOptions{ + Thinking: &ThinkingProviderOption{BudgetTokens: 2048}, + ThinkingDisplay: &display, + } + }, + wantType: "enabled", + wantDisplay: "summarized", + wantBudget: 2048, + }, + { + name: "opus models default to summarized display", + model: "claude-opus-4-7-20260101", + options: func() *ProviderOptions { + effort := EffortHigh + return &ProviderOptions{Effort: &effort} + }, + wantType: "adaptive", + wantDisplay: "summarized", + }, + { + name: "bedrock opus models default to summarized display", + model: "us.anthropic.claude-opus-4-8-20260101-v1:0", + options: func() *ProviderOptions { + effort := EffortHigh + return &ProviderOptions{Effort: &effort} + }, + wantType: "adaptive", + wantDisplay: "summarized", + }, + { + name: "explicit display overrides opus default", + model: "claude-opus-4-8-20260101", + options: func() *ProviderOptions { + effort := EffortHigh + display := ThinkingDisplayOmitted + return &ProviderOptions{Effort: &effort, ThinkingDisplay: &display} + }, + wantType: "adaptive", + wantDisplay: "omitted", + }, + { + name: "mythos models default to adaptive thinking", + model: "claude-mythos-preview", + options: func() *ProviderOptions { + return &ProviderOptions{} + }, + wantType: "adaptive", + wantDisplay: "summarized", + }, + { + name: "opus models use adaptive thinking when budget thinking configured", + model: "claude-opus-4-7", + options: func() *ProviderOptions { + return &ProviderOptions{Thinking: &ThinkingProviderOption{BudgetTokens: 2048}} + }, + wantType: "adaptive", + wantDisplay: "summarized", + }, + { + name: "older opus models keep provider default", + model: "claude-opus-4-6-20260101", + options: func() *ProviderOptions { + effort := EffortHigh + return &ProviderOptions{Effort: &effort} + }, + wantType: "adaptive", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + server, calls := newAnthropicJSONServer(mockAnthropicGenerateResponse()) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), tt.model) + require.NoError(t, err) + + _, err = model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt(), + ProviderOptions: NewProviderOptions(tt.options()), + }) + require.NoError(t, err) + + call := awaitAnthropicCall(t, calls) + thinking, ok := call.body["thinking"].(map[string]any) + require.True(t, ok) + require.Equal(t, tt.wantType, thinking["type"]) + if tt.wantDisplay == "" { + require.NotContains(t, thinking, "display") + } else { + require.Equal(t, tt.wantDisplay, thinking["display"]) + } + if tt.wantBudget != 0 { + require.InDelta(t, tt.wantBudget, thinking["budget_tokens"], 0) + } + }) + } +} + +func TestGenerate_DoesNotEnableThinkingForPlainOpus(t *testing.T) { + t.Parallel() + + server, calls := newAnthropicJSONServer(mockAnthropicGenerateResponse()) + defer server.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(context.Background(), "claude-opus-4-7") + require.NoError(t, err) + + _, err = model.Generate(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + call := awaitAnthropicCall(t, calls) + require.NotContains(t, call.body, "thinking") +} + +func TestDefaultsToOmittedThinkingDisplay(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + model string + want bool + }{ + {name: "opus 4.7 alias", model: "claude-opus-4-7", want: true}, + {name: "opus 4.7", model: "claude-opus-4-7-20260101", want: true}, + {name: "opus 4.10", model: "claude-opus-4-10-20260101", want: true}, + {name: "bedrock opus 4.8 alias", model: "us.anthropic.claude-opus-4-8-v1", want: true}, + {name: "bedrock opus 4.8", model: "us.anthropic.claude-opus-4-8-20260101-v1:0", want: true}, + {name: "mythos preview", model: "claude-mythos-preview", want: true}, + {name: "bedrock mythos preview", model: "anthropic.claude-mythos-preview", want: true}, + {name: "opus 4.6", model: "claude-opus-4-6-20260101", want: false}, + {name: "opus 4 date only", model: "claude-opus-4-20250514", want: false}, + {name: "bedrock opus 4 date only", model: "us.anthropic.claude-opus-4-20250514-v1:0", want: false}, + {name: "sonnet", model: "claude-sonnet-4-20250514", want: false}, + {name: "no minor", model: "claude-opus-4", want: false}, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + require.Equal(t, tt.want, defaultsToOmittedThinkingDisplay(tt.model)) + }) + } +} + func TestStream_SendsOutputConfigEffort(t *testing.T) { t.Parallel() diff --git a/providers/anthropic/provider_options.go b/providers/anthropic/provider_options.go index 4c89a4438..34ad50276 100644 --- a/providers/anthropic/provider_options.go +++ b/providers/anthropic/provider_options.go @@ -25,6 +25,16 @@ const ( EffortMax Effort = "max" ) +// ThinkingDisplay controls whether Anthropic returns visible thinking content. +type ThinkingDisplay string + +const ( + // ThinkingDisplaySummarized requests visible summarized thinking content. + ThinkingDisplaySummarized ThinkingDisplay = "summarized" + // ThinkingDisplayOmitted requests hidden thinking content. + ThinkingDisplayOmitted ThinkingDisplay = "omitted" +) + // Global type identifiers for Anthropic-specific provider data. const ( TypeProviderOptions = Name + ".options" @@ -70,6 +80,7 @@ type ProviderOptions struct { SendReasoning *bool `json:"send_reasoning"` Thinking *ThinkingProviderOption `json:"thinking"` Effort *Effort `json:"effort"` + ThinkingDisplay *ThinkingDisplay `json:"thinking_display"` DisableParallelToolUse *bool `json:"disable_parallel_tool_use"` ExtraBody map[string]any `json:"extra_body,omitempty"` } From f32bf3e65a2ea7c21c736041406019faec268de8 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 5 Jun 2026 10:14:00 -0300 Subject: [PATCH 85/95] v0.30.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 25939d35c..c25c8e5b7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.29.1 +0.30.0 From a9c2178c0e04d6c9210b92f90119ebc3279aa038 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 5 Jun 2026 10:50:19 -0400 Subject: [PATCH 86/95] feat(tools): enable json repair by default --- agent.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/agent.go b/agent.go index 62e219457..2ce313577 100644 --- a/agent.go +++ b/agent.go @@ -11,6 +11,7 @@ import ( "slices" "sync" + "charm.land/fantasy/jsonrepair" "charm.land/fantasy/schema" "github.com/charmbracelet/x/exp/slice" ) @@ -1042,6 +1043,16 @@ func (a *agent) validateAndRepairToolCall(ctx context.Context, toolCall ToolCall return *repairedToolCall } } + } else { + // Default repair: try jsonrepair for malformed JSON when no + // custom repair function is configured. + if repaired, repairErr := jsonrepair.RepairJSON(toolCall.Input); repairErr == nil && repaired != toolCall.Input { + repairedCall := toolCall + repairedCall.Input = repaired + if validateErr := a.validateToolCall(repairedCall, availableTools, execProviderTools); validateErr == nil { + return repairedCall + } + } } invalidToolCall := toolCall From 82a4be29681a7473c6a0f669c53ad02b9b718dfd Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 5 Jun 2026 17:08:14 -0300 Subject: [PATCH 87/95] fix(vercel,openrouter): correct TotalTokens calculation for cached tokens (#272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both Vercel and OpenRouter APIs return prompt_tokens that INCLUDE cached tokens, similar to OpenAI. The providers were using this value directly as InputTokens, causing double-counting when cache is present. Changes: - Subtract cached tokens from prompt_tokens to get true input tokens - Calculate total_tokens as input + output + cache instead of using API value - Add comments explaining the adjustment (matching OpenAI provider pattern) This ensures consistency across all providers and fixes incorrect token counts displayed in the Hyper dashboard for Vercel/OpenRouter models. Before: GLM 5.1 showed Total=40,162 (Input+Output only) After: GLM 5.1 shows Total=59,143 (Input+Output+Cache) ✓ Assisted-by: Crush:qwen3.6-plus --- providers/openrouter/language_model_hooks.go | 15 +++++++++++---- providers/vercel/language_model_hooks.go | 15 +++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index acb518e83..18218322f 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -446,10 +446,13 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta Usage: openrouterUsage, } + // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + return fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -481,10 +484,14 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] // we do this here because the acc does not add prompt details completionTokenDetails := usage.CompletionTokensDetails promptTokenDetails := usage.PromptTokensDetails + + // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + aiUsage := fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index e3b829210..377dfd094 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -490,10 +490,13 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta Provider: provider, } + // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + return fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -521,10 +524,14 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] completionTokenDetails := usage.CompletionTokensDetails promptTokenDetails := usage.PromptTokensDetails + + // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + aiUsage := fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } From ab866364a5955fc4ef9c3aff1ea717320df47488 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 5 Jun 2026 17:08:49 -0300 Subject: [PATCH 88/95] v0.31.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index c25c8e5b7..26bea73e8 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.30.0 +0.31.0 From 0fdf5aff1ac5e150fcfa5c7f9afea7ff8e6bbc21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:26:29 +0000 Subject: [PATCH 89/95] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#275) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.26.6 to 1.27.3 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.26.6...v1.27.3) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.27.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 55 ++++++++++++++-------------- go.sum | 114 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 86 insertions(+), 83 deletions(-) diff --git a/go.mod b/go.mod index ff47c341e..1c49c16e9 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.26.6 - github.com/aws/aws-sdk-go-v2 v1.41.9 - github.com/aws/aws-sdk-go-v2/config v1.32.20 - github.com/aws/smithy-go v1.26.0 + github.com/ardanlabs/kronk v1.27.3 + github.com/aws/aws-sdk-go-v2 v1.41.12 + github.com/aws/aws-sdk-go-v2/config v1.32.23 + github.com/aws/smithy-go v1.27.2 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -30,28 +30,28 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.11.0 // indirect cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.2 // indirect + cloud.google.com/go/storage v1.62.3 // 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.19 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.22 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.14.1 // indirect + github.com/hybridgroup/yzma v1.16.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/go-i18n v0.4.9 // indirect github.com/kaptinlin/jsonpointer v0.4.25 // indirect @@ -89,9 +89,9 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.68.0 // indirect + github.com/prometheus/common v0.68.1 // indirect github.com/prometheus/procfs v0.20.1 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -112,12 +112,13 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.52.0 // indirect + golang.org/x/image v0.41.0 // indirect golang.org/x/net v0.55.0 // indirect golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.282.0 // indirect + google.golang.org/api v0.283.0 // indirect google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect diff --git a/go.sum b/go.sum index 472da90ae..66fbec6df 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMh cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.2 h1:WgR4U9n7bIzXkkVnwPKKE8bkaKUNsHG+0MAAlh9DGU4= -cloud.google.com/go/storage v1.62.2/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= +cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= @@ -30,54 +30,54 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP 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/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.26.6 h1:u4wlgPbdUrGBYp7ZjOVji9tiBnP2mYU05zY/Ca8GPR4= -github.com/ardanlabs/kronk v1.26.6/go.mod h1:yImFM7h+YvTMP4y7JJ837M1X02c+skeiTJ600F+V2tQ= -github.com/aws/aws-sdk-go-v2 v1.41.9 h1:/rYeyO2+HrMztAmxAq9++XJtFMqSIpSsNA0yDGALYq4= -github.com/aws/aws-sdk-go-v2 v1.41.9/go.mod h1:+HsoOEX80qAVUitj1A2DhCNTjmb3edVyuDypb6LNEeo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11 h1:h5+3VT69KUBK24grGuuA5saDJTj2IIjLb9au668Fo5I= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.11/go.mod h1:dnakxebH6UwFvcvujL0LVggYQ8nEvBGjU4G/V79Nv94= -github.com/aws/aws-sdk-go-v2/config v1.32.20 h1:8VMDnWc/kEzxsI/1ngGM9mG81a8IGmIHD8KLcYGwagc= -github.com/aws/aws-sdk-go-v2/config v1.32.20/go.mod h1:PuwEpciweIXGULWeOeSTXtSbH4CW9mWdWrhdCKQI1sM= -github.com/aws/aws-sdk-go-v2/credentials v1.19.19 h1:yuFzSV1U0aRNYCQGVaTY2zW2M/L93pYHnXnrJUphYhU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.19/go.mod h1:7y63L1kGzeoDlJaQ3Z578KrnmfBut96JjvJUzGwR+YE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 h1:0w6dCiO8iez+YKwRhRBlL1CH/E3GTfdkuzrwj1by8vo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25/go.mod h1:9FDWUothyr5RCRAHc45XOiVCzUR8n/IhCYX+uVqw6vk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 h1:Uii3frf9ztec/ABM2/FSH9/z7PLzxfpG8h4RpkUFflQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25/go.mod h1:G6kntsA2GorAxDPbap6xgB2F+amSLUF8GJTi7PUoX44= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 h1:r1+/l6m+WaUJF9HISEsNOLHSNj5EXYQxK8VX6Cz9NlA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25/go.mod h1:cKf+D+NMDK1LndD7BowHbBZPgR9V0/5HubH0PFWvA+c= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 h1:A1PmWU2zfkIm9EyFlJncFXL4W4phML+h8KjltUsCvNQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26/go.mod h1:dY4MRzXEizrD4hqtpKvWVGPX7QleSGGVY+EBolo1RmM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 h1:d5/908OJ4bXg8lyjeMPvXetEKqoDoLi5Owy1zNue3yg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10/go.mod h1:a57l7Hwh+FWI+we50g5NPJHYUKeJKfXbc4w8SyXu8Ig= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18 h1:W/EyPFl9A5rXrtoilfwHYEvzHER+K4SpBPtMXi24Mos= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.18/go.mod h1:UG50K+pvd/uy6xExbobg0rjqFBFZe6I3l75EPDZw4tg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 h1:dD3dhHNglpd98gs72my22Ndqi1hqQGllFFg1F+twfxg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25/go.mod h1:0yAbjPfd64gG7mj85RW+fMEYdfBgCRZw8g/oWcL1pjc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25 h1:2pQEbwf+/6EDbiit/GcBE2K4IUpMZymaA0kOz3xK978= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.25/go.mod h1:KvT6NCcQ0EZ+ZkVRrlBMt04Po3ok23YELEp7WimhLhM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2 h1:ie4ElCmUKS26pzrZcIk/lmt4yWjAqLLcawstyQCh298= -github.com/aws/aws-sdk-go-v2/service/s3 v1.102.2/go.mod h1:zjsomFeX5duj+4PlMB+o4JoWTIx+G0XMyzjYrUbQkN0= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 h1:1VwbP3qMNfxUDEXWki4rCE5iA+44VA1lokTz9HasGzw= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.1/go.mod h1:vUtyoSj0OPji3kjIVSc/GlKuWEiL33f/WFxl6dmpy/A= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 h1:N6pIsdFOW1Kd9S4KyFKXdGRBojPPxkP32+uHFWLv4Hc= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.19/go.mod h1:3gt5WJArFooNmyLONS+h/R4J+o86II8du38IgCwj9dE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 h1:hc+lBYiiTr8Zk4MTzIsQ92MeDWCIDvWGmzKUWOaBcOg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2/go.mod h1:hU6fqB3OJA6/ePheD47LQnxvjYk6br6PtQxs+Q9ojvk= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 h1:ErklX/7uhSbkAAeyQD/Y1OoQ9hO3SJXQNEgksORW3Js= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.3/go.mod h1:ULe4HCzfKPiR6R3HEurE3b1upEkuk8AkMrOKtaOxKO8= -github.com/aws/smithy-go v1.26.0 h1:9ouqbi+NyKP7fV3Te7UElCwdAb6Y8uk7LGwPE5tVe/s= -github.com/aws/smithy-go v1.26.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.27.3 h1:L66EfwpjS8rf/5Ih3pW38/T6gFf0lXCYxxDmIewtOOI= +github.com/ardanlabs/kronk v1.27.3/go.mod h1:OZuP0bzs3RzI5kBmbYmqDZ3tCyY6zLiQVpWD8fLqiQc= +github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= +github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= +github.com/aws/aws-sdk-go-v2/config v1.32.23 h1:PYDobtcsJXK6bQe9I8RQk6s19Bz3xa3xRU08Hy1Em3Y= +github.com/aws/aws-sdk-go-v2/config v1.32.23/go.mod h1:QID4dqUQVgEOYPKsPWd1sNWCCR2c5g7o3jeEtIXPOZU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22 h1:SHfH6wyPsEgG7fVsi5rQxWEt7tuIcN2PGhb1mTFv6tE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22/go.mod h1:54nO8lKD4aQPOntM/VTWjnR+DYzTwx0YkSMZMhAgewQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 h1:b+kcDejJrXc30zU/w8Tc9klISwaO5wh+6T0sMBdDoHM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28/go.mod h1:LnI62O9GnSv6GcuLXxOYqlq0C8EmxMcgnF6m7LdYuOY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 h1:Xf2j7NdVcUKomlZ4iihOP4AZ3Fzlr8h4yKpXeP+OFPg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28/go.mod h1:O8cDo1dW63jU7ki//kRe1z+tLGcpnD1jrouitsQddDw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 h1:KqIfN9kpkKkcBqBbNpNGTIrXO6ExTUvFKvXkC+YAzVo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28/go.mod h1:uxtQiKvLtNS4iXVsH2McVD/ls8FKN/uUhe1hGxPjrw0= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 h1:VkE9FuzTQVjBBrnj4+oCdxCLFIz7aqLYKUCjtvxVcOs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29/go.mod h1:H32Z2Qth9b+9LqjyBsCnozMQ8H2N7YBUDVXwbs0iggg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 h1:axj4mEDletwKmTm/9jR+DkIMmCfcn5vE4jBMAAN+3Vg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28/go.mod h1:3Aaz69M0jqfSHLKqxgolgUBFT4hpwSNc7DzC95orEi8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 h1:YcpVyIPLCbiypN6KSphijN5fC7DDjX114SqA7prnnxg= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4/go.mod h1:5ZICS++oFTRPfa1GsBqFDWX/8WamZ/QQOcCzIuU/zLw= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 h1:ySNWu7TPmj5fKFIa1GYvX+Ddxd5ccruqC20aMNuyWDM= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2/go.mod h1:A+U9luAOwFeB1kseyWCITVg7/NntoPebCFR9pQ4ch9A= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 h1:KSzGGqfk39O+WU3OEyYbx6F7sLDQCqxlOJ+2IksfK6U= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5/go.mod h1:ATs88lXDeQB6CZOgQ5BIl9JbYS+EsCWUSDyff6L/oVo= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 h1:RTO7mmGyedgnNmcPh3yQizNfc6GKoV5iqfdJavuf9vw= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2/go.mod h1:fBhUZXDin9YYqhcpOMjIcpdik25rVwWyxLdPH1RZd9s= +github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= +github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.14.1 h1:EMSy9ONR8WMljsWwKLDt8gEYJPOEyxZkBtCHxNWxOjQ= -github.com/hybridgroup/yzma v1.14.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.16.0 h1:b7/oKsWltRozsBvV5uGpX+pn6SnGZm0MN2zh1MqRpeA= +github.com/hybridgroup/yzma v1.16.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -193,14 +193,14 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.68.0 h1:8rQJvQmYltsR2L7h8Zw0Iyj8WYNNmpwikoQTZXwfVeA= -github.com/prometheus/common v0.68.0/go.mod h1:4soH+U8yJSROk7OJ//hmTiWKsxapv6zRGgTt3keN8gQ= +github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= +github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= +github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -251,6 +251,8 @@ go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= +golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= @@ -265,8 +267,8 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.282.0 h1:WmJiSVqUnKqJCpJOx7YADbXaC+9DDsnGSfllFSj7R2I= -google.golang.org/api v0.282.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= +google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= +google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= google.golang.org/genai v1.58.0 h1:MNA3ZkRyr7MnRwZ9RNZ60p4+UMKV3yYRw6pyHq4pp0U= google.golang.org/genai v1.58.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= From 5306613933a0a1d05e8c35683483c0497bab45fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:33:45 +0000 Subject: [PATCH 90/95] chore(deps): bump the all group across 1 directory with 2 updates (#276) Bumps the all group with 2 updates in the / directory: [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/kaptinlin/jsonschema` from 0.7.15 to 0.8.0 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.7.15...v0.8.0) Updates `google.golang.org/genai` from 1.58.0 to 1.59.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.58.0...v1.59.0) --- updated-dependencies: - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.59.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 ++++------ go.sum | 22 ++++++++-------------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 1c49c16e9..0aa3b9d92 100644 --- a/go.mod +++ b/go.mod @@ -17,10 +17,10 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.7.15 + github.com/kaptinlin/jsonschema v0.8.0 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.58.0 + google.golang.org/genai v1.59.0 ) require ( @@ -63,7 +63,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686 // indirect + github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -79,9 +79,7 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.16.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/go-i18n v0.4.9 // indirect - github.com/kaptinlin/jsonpointer v0.4.25 // indirect - github.com/kaptinlin/messageformat-go v0.6.4 // indirect + github.com/kaptinlin/jsonpointer v0.4.26 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index 66fbec6df..ca7648172 100644 --- a/go.sum +++ b/go.sum @@ -116,8 +116,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686 h1:NZBJxCpbHS1gzS6xAmyxbJznosZIIPk9IB42v62UvKA= -github.com/go-json-experiment/json v0.0.0-20260520185125-572e7c383686/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -161,14 +161,10 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/go-i18n v0.4.9 h1:kxYNfExb1GG241BIPnQaD3YOvWkP7poHwfj8ctwIpkw= -github.com/kaptinlin/go-i18n v0.4.9/go.mod h1:15vHHYLhwo1stIdztJatujSttIY6sRFt+7v8K1ik1AA= -github.com/kaptinlin/jsonpointer v0.4.25 h1:iJ197e8n+WwqaqBsa53FqG3rPJCg5oijyFXEXNWWC3E= -github.com/kaptinlin/jsonpointer v0.4.25/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= -github.com/kaptinlin/jsonschema v0.7.15 h1:5v9TBnGOm/DV4EEsC13dfR0UXid/3OcR7yAnpRlruE0= -github.com/kaptinlin/jsonschema v0.7.15/go.mod h1:5njr9isKoP9FnqZrFV1Iygx7QqjN3SBZ/AkgBl4Elug= -github.com/kaptinlin/messageformat-go v0.6.4 h1:6nC70fsqEn2xxg/Xoby2+Dk2r77kvxa3QNnYL/hsNcM= -github.com/kaptinlin/messageformat-go v0.6.4/go.mod h1:553UGZ1x5jmGtyH4pQKYwLGMyPm71deCoZICjq1DtR8= +github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= +github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= +github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= +github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -181,8 +177,6 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7olPtrEc= -github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -269,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= -google.golang.org/genai v1.58.0 h1:MNA3ZkRyr7MnRwZ9RNZ60p4+UMKV3yYRw6pyHq4pp0U= -google.golang.org/genai v1.58.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= +google.golang.org/genai v1.59.0 h1:xp+ydkJFW8hO0hTUaAkr8TrLM9HFP3NYAwFhPd0nDqA= +google.golang.org/genai v1.59.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= From cff9d46c003742083284ce9f065af80f21c38bd5 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Mon, 8 Jun 2026 12:55:40 -0400 Subject: [PATCH 91/95] deps: upgrading kronk to v1.27.4 (#277) --- examples/go.mod | 111 +++++++++++----------- examples/go.sum | 238 ++++++++++++++++++++++++------------------------ go.mod | 8 +- go.sum | 16 ++-- 4 files changed, 185 insertions(+), 188 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 9cf6df70e..16e6e6710 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.3 +go 1.26.4 replace charm.land/fantasy => ../ @@ -19,30 +19,30 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.11.0 // indirect cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect - github.com/ardanlabs/jinja v1.2.0 // indirect - github.com/ardanlabs/kronk v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.17 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect - github.com/aws/smithy-go v1.25.1 // indirect + cloud.google.com/go/storage v1.62.3 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect + github.com/ardanlabs/jinja v1.4.0 // indirect + github.com/ardanlabs/kronk v1.27.4 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.12 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.23 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.22 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 // indirect + github.com/aws/smithy-go v1.27.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -56,12 +56,12 @@ require ( github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/ebitengine/purego v0.10.0 // indirect + github.com/ebitengine/purego v0.10.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 // indirect + github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -70,20 +70,18 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.13.0 // indirect + github.com/hybridgroup/yzma v1.16.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/go-i18n v0.4.5 // indirect - github.com/kaptinlin/jsonpointer v0.4.20 // indirect - github.com/kaptinlin/jsonschema v0.7.13 // indirect - github.com/kaptinlin/messageformat-go v0.6.0 // indirect + github.com/kaptinlin/jsonpointer v0.4.26 // indirect + github.com/kaptinlin/jsonschema v0.8.0 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect @@ -93,10 +91,10 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/common v0.68.1 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -104,31 +102,32 @@ require ( github.com/ulikunitz/xz v0.5.15 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.51.0 // indirect + golang.org/x/crypto v0.52.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/net v0.54.0 // indirect + golang.org/x/image v0.41.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.278.0 // indirect - google.golang.org/genai v1.56.0 // indirect - google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/grpc v1.81.0 // indirect + google.golang.org/api v0.283.0 // indirect + google.golang.org/genai v1.59.0 // indirect + google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 806d884b1..87c260441 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -10,64 +10,64 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/logging v1.17.0 h1:rUFekZYwHiKElXCyz3zYBGz4BOeIqzgCKxVLdgrZ5mY= -cloud.google.com/go/logging v1.17.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.12.0 h1:wLv2hXvID9zHejLtcPo1B0JBjErnwZCYAPKSTa65xpY= -cloud.google.com/go/longrunning v0.12.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= +cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= +cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= -cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= -cloud.google.com/go/trace v1.15.0 h1:kAYkTwKyYHkGtAGFuu6qaUFRBkOVr+d1Yo44yZtGtgg= -cloud.google.com/go/trace v1.15.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= -github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= -github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.25.2 h1:kw8sDq/yDvy8D9I4/L4yptwmevfnM4hNeGv7mKLCz1s= -github.com/ardanlabs/kronk v1.25.2/go.mod h1:b5Gg4jDqvHDklkeHNB8+7treZRxUiCFsV65zphrTloY= -github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= -github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= -github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= -github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29h8BvsCoHQEQ6ST9X8w7w= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= -github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= -github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= +cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= +cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= +github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= +github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= +github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= +github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= +github.com/aws/aws-sdk-go-v2/config v1.32.23 h1:PYDobtcsJXK6bQe9I8RQk6s19Bz3xa3xRU08Hy1Em3Y= +github.com/aws/aws-sdk-go-v2/config v1.32.23/go.mod h1:QID4dqUQVgEOYPKsPWd1sNWCCR2c5g7o3jeEtIXPOZU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22 h1:SHfH6wyPsEgG7fVsi5rQxWEt7tuIcN2PGhb1mTFv6tE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22/go.mod h1:54nO8lKD4aQPOntM/VTWjnR+DYzTwx0YkSMZMhAgewQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 h1:b+kcDejJrXc30zU/w8Tc9klISwaO5wh+6T0sMBdDoHM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28/go.mod h1:LnI62O9GnSv6GcuLXxOYqlq0C8EmxMcgnF6m7LdYuOY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 h1:Xf2j7NdVcUKomlZ4iihOP4AZ3Fzlr8h4yKpXeP+OFPg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28/go.mod h1:O8cDo1dW63jU7ki//kRe1z+tLGcpnD1jrouitsQddDw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 h1:KqIfN9kpkKkcBqBbNpNGTIrXO6ExTUvFKvXkC+YAzVo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28/go.mod h1:uxtQiKvLtNS4iXVsH2McVD/ls8FKN/uUhe1hGxPjrw0= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 h1:VkE9FuzTQVjBBrnj4+oCdxCLFIz7aqLYKUCjtvxVcOs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29/go.mod h1:H32Z2Qth9b+9LqjyBsCnozMQ8H2N7YBUDVXwbs0iggg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 h1:axj4mEDletwKmTm/9jR+DkIMmCfcn5vE4jBMAAN+3Vg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28/go.mod h1:3Aaz69M0jqfSHLKqxgolgUBFT4hpwSNc7DzC95orEi8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 h1:YcpVyIPLCbiypN6KSphijN5fC7DDjX114SqA7prnnxg= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4/go.mod h1:5ZICS++oFTRPfa1GsBqFDWX/8WamZ/QQOcCzIuU/zLw= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 h1:ySNWu7TPmj5fKFIa1GYvX+Ddxd5ccruqC20aMNuyWDM= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2/go.mod h1:A+U9luAOwFeB1kseyWCITVg7/NntoPebCFR9pQ4ch9A= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 h1:KSzGGqfk39O+WU3OEyYbx6F7sLDQCqxlOJ+2IksfK6U= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5/go.mod h1:ATs88lXDeQB6CZOgQ5BIl9JbYS+EsCWUSDyff6L/oVo= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 h1:RTO7mmGyedgnNmcPh3yQizNfc6GKoV5iqfdJavuf9vw= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2/go.mod h1:fBhUZXDin9YYqhcpOMjIcpdik25rVwWyxLdPH1RZd9s= +github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= +github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -108,8 +108,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= -github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= +github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= @@ -122,8 +122,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 h1:2WmHkJINIjgXXYDGik8d3oJvFA3DAwPy00csDJ3vo+o= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -145,34 +145,30 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas= -github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4GI= -github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hybridgroup/yzma v1.16.1 h1:t1uA0Jsv5D9YzBa1D4CapK8kZA/uYrgaCHR33brVqjg= +github.com/hybridgroup/yzma v1.16.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= -github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= -github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= -github.com/kaptinlin/jsonpointer v0.4.20/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= -github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWswQEFvU= -github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= -github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= -github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= +github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= +github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= +github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= +github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= @@ -185,8 +181,6 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= -github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -195,15 +189,15 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= +github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= +github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -222,64 +216,68 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= +go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= +golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= -google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= -google.golang.org/genai v1.56.0 h1:IwWrg1K0cn1/WBiPno/dYr0Q6o75NeH/bh3G4JEFERE= -google.golang.org/genai v1.56.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348/go.mod h1:Yzdzr5OOZFgSsEV2D/Xi9NL3bszpXFAg0hFJiRohcD8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= -google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= +google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= +google.golang.org/genai v1.59.0 h1:xp+ydkJFW8hO0hTUaAkr8TrLM9HFP3NYAwFhPd0nDqA= +google.golang.org/genai v1.59.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/go.mod b/go.mod index 0aa3b9d92..d3b1e4b2a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.27.3 + github.com/ardanlabs/kronk v1.27.4 github.com/aws/aws-sdk-go-v2 v1.41.12 github.com/aws/aws-sdk-go-v2/config v1.32.23 github.com/aws/smithy-go v1.27.2 @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.16.0 // indirect + github.com/hybridgroup/yzma v1.16.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.26 // indirect github.com/klauspost/compress v1.18.6 // indirect @@ -112,8 +112,8 @@ require ( golang.org/x/crypto v0.52.0 // indirect golang.org/x/image v0.41.0 // indirect golang.org/x/net v0.55.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.283.0 // indirect diff --git a/go.sum b/go.sum index ca7648172..48ded2709 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.27.3 h1:L66EfwpjS8rf/5Ih3pW38/T6gFf0lXCYxxDmIewtOOI= -github.com/ardanlabs/kronk v1.27.3/go.mod h1:OZuP0bzs3RzI5kBmbYmqDZ3tCyY6zLiQVpWD8fLqiQc= +github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= +github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.16.0 h1:b7/oKsWltRozsBvV5uGpX+pn6SnGZm0MN2zh1MqRpeA= -github.com/hybridgroup/yzma v1.16.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.16.1 h1:t1uA0Jsv5D9YzBa1D4CapK8kZA/uYrgaCHR33brVqjg= +github.com/hybridgroup/yzma v1.16.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -251,10 +251,10 @@ golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= From c1bb354ec6822eb39765b6706a12fa70f8b4c63c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 09:29:00 +0000 Subject: [PATCH 92/95] chore(deps): bump the all group with 3 updates (#281) Bumps the all group with 3 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2` from 1.41.12 to 1.42.0 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.41.12...v1.42.0) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.23 to 1.32.25 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.23...config/v1.32.25) Updates `google.golang.org/genai` from 1.59.0 to 1.60.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.59.0...v1.60.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.42.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.25 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.60.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 26 +++++++++++++------------- go.sum | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index d3b1e4b2a..9efd1b5c5 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.27.4 - github.com/aws/aws-sdk-go-v2 v1.41.12 - github.com/aws/aws-sdk-go-v2/config v1.32.23 + github.com/aws/aws-sdk-go-v2 v1.42.0 + github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 @@ -20,7 +20,7 @@ require ( github.com/kaptinlin/jsonschema v0.8.0 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.59.0 + google.golang.org/genai v1.60.0 ) require ( @@ -38,20 +38,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.22 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect diff --git a/go.sum b/go.sum index 48ded2709..e485708da 100644 --- a/go.sum +++ b/go.sum @@ -42,40 +42,40 @@ github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= -github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= -github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= +github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= -github.com/aws/aws-sdk-go-v2/config v1.32.23 h1:PYDobtcsJXK6bQe9I8RQk6s19Bz3xa3xRU08Hy1Em3Y= -github.com/aws/aws-sdk-go-v2/config v1.32.23/go.mod h1:QID4dqUQVgEOYPKsPWd1sNWCCR2c5g7o3jeEtIXPOZU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.22 h1:SHfH6wyPsEgG7fVsi5rQxWEt7tuIcN2PGhb1mTFv6tE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.22/go.mod h1:54nO8lKD4aQPOntM/VTWjnR+DYzTwx0YkSMZMhAgewQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 h1:b+kcDejJrXc30zU/w8Tc9klISwaO5wh+6T0sMBdDoHM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28/go.mod h1:LnI62O9GnSv6GcuLXxOYqlq0C8EmxMcgnF6m7LdYuOY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 h1:Xf2j7NdVcUKomlZ4iihOP4AZ3Fzlr8h4yKpXeP+OFPg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28/go.mod h1:O8cDo1dW63jU7ki//kRe1z+tLGcpnD1jrouitsQddDw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 h1:KqIfN9kpkKkcBqBbNpNGTIrXO6ExTUvFKvXkC+YAzVo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28/go.mod h1:uxtQiKvLtNS4iXVsH2McVD/ls8FKN/uUhe1hGxPjrw0= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 h1:VkE9FuzTQVjBBrnj4+oCdxCLFIz7aqLYKUCjtvxVcOs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29/go.mod h1:H32Z2Qth9b+9LqjyBsCnozMQ8H2N7YBUDVXwbs0iggg= +github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= +github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 h1:axj4mEDletwKmTm/9jR+DkIMmCfcn5vE4jBMAAN+3Vg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28/go.mod h1:3Aaz69M0jqfSHLKqxgolgUBFT4hpwSNc7DzC95orEi8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 h1:YcpVyIPLCbiypN6KSphijN5fC7DDjX114SqA7prnnxg= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.4/go.mod h1:5ZICS++oFTRPfa1GsBqFDWX/8WamZ/QQOcCzIuU/zLw= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 h1:ySNWu7TPmj5fKFIa1GYvX+Ddxd5ccruqC20aMNuyWDM= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.2/go.mod h1:A+U9luAOwFeB1kseyWCITVg7/NntoPebCFR9pQ4ch9A= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 h1:KSzGGqfk39O+WU3OEyYbx6F7sLDQCqxlOJ+2IksfK6U= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5/go.mod h1:ATs88lXDeQB6CZOgQ5BIl9JbYS+EsCWUSDyff6L/oVo= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 h1:RTO7mmGyedgnNmcPh3yQizNfc6GKoV5iqfdJavuf9vw= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.2/go.mod h1:fBhUZXDin9YYqhcpOMjIcpdik25rVwWyxLdPH1RZd9s= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= -google.golang.org/genai v1.59.0 h1:xp+ydkJFW8hO0hTUaAkr8TrLM9HFP3NYAwFhPd0nDqA= -google.golang.org/genai v1.59.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.60.0 h1:uAkea4tYhCz1LlUmxdiOFAmlrLFaLs8PbXucgZHqHVo= +google.golang.org/genai v1.60.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= From e86c1c436fb025caf79623ec0d94aa5f2c62347d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 09:35:38 +0000 Subject: [PATCH 93/95] chore(deps): bump github.com/ardanlabs/kronk (#282) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.27.4 to 1.27.9 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.27.4...v1.27.9) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.27.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 28 ++++++++++++++-------------- go.sum | 56 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index 9efd1b5c5..3a23194e4 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.27.4 + github.com/ardanlabs/kronk v1.27.9 github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 @@ -44,10 +44,10 @@ require ( github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect @@ -61,7 +61,7 @@ require ( github.com/ebitengine/purego v0.10.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logr/logr v1.4.3 // indirect @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.16.1 // indirect + github.com/hybridgroup/yzma v1.17.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.26 // indirect github.com/klauspost/compress v1.18.6 // indirect @@ -109,17 +109,17 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.52.0 // indirect - golang.org/x/image v0.41.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/image v0.42.0 // indirect + golang.org/x/net v0.56.0 // indirect golang.org/x/sync v0.21.0 // indirect golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/text v0.38.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.283.0 // indirect - google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/api v0.284.0 // indirect + google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index e485708da..cecbcadc5 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= -github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= +github.com/ardanlabs/kronk v1.27.9 h1:ZQXfWq86eq19dHOBvOm9dVUIyevV60hdZy2S5Bp/+mY= +github.com/ardanlabs/kronk v1.27.9/go.mod h1:dLd1F38v+1URf5Vsa/P4ENS9VhZw4vwX7EEhHFAAdkA= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= @@ -60,14 +60,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaY github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 h1:JRseEu/vIDMaWis4bSw0QbXL+cvIGc1XnX076H5ZXLE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= @@ -112,8 +112,8 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= +github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.16.1 h1:t1uA0Jsv5D9YzBa1D4CapK8kZA/uYrgaCHR33brVqjg= -github.com/hybridgroup/yzma v1.16.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.17.1 h1:T841QThcR+LrdEGp5ISGMKIJFUGQHgWXvjXfIIUEDFI= +github.com/hybridgroup/yzma v1.17.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -243,34 +243,34 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= -golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= -golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= -golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/image v0.42.0 h1:1gSs6ehNWXLbkHBIPcWztk3D/6aIA/8hauiAYtlodVY= +golang.org/x/image v0.42.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= -google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= +google.golang.org/api v0.284.0 h1:i+cKTgeQRcRySkP7QTl5PDO7/pAm8EcMFIUMlNbk4Vc= +google.golang.org/api v0.284.0/go.mod h1:AU44fU+XVZOCcd8uLaBIa/ZgzgPf/0qqY3+m7lQaado= google.golang.org/genai v1.60.0 h1:uAkea4tYhCz1LlUmxdiOFAmlrLFaLs8PbXucgZHqHVo= google.golang.org/genai v1.60.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= -google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad h1:cYL1DPJAQr4JMvhfGao0PDXoaf03ifMljAuDyrbMBd0= +google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From 4be1014cc8ada3ebe254933ed74961e6bc897ab5 Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Tue, 16 Jun 2026 07:53:47 +0000 Subject: [PATCH 94/95] Minimize Coder upstream sync diff --- agent.go | 11 + examples/go.mod | 111 ++- examples/go.sum | 238 ++++--- examples/kronk/simple/main.go | 93 +++ examples/kronk/stream/main.go | 181 +++++ go.mod | 129 ++-- go.sum | 297 +++++--- providers/anthropic/anthropic_test.go | 279 ++++---- providers/google/google.go | 2 +- providers/kronk/README.md | 26 + providers/kronk/kronk.go | 147 ++++ providers/kronk/language_model.go | 669 +++++++++++++++++++ providers/kronk/language_model_hooks.go | 269 ++++++++ providers/kronk/options.go | 71 ++ providers/kronk/provider_options.go | 104 +++ providers/openai/openai_test.go | 48 +- providers/openai/provider_options.go | 4 +- providers/openai/responses_language_model.go | 4 +- providers/openai/responses_params_test.go | 27 +- providers/openrouter/language_model_hooks.go | 15 +- providers/openrouter/provider_options.go | 4 +- providers/vercel/language_model_hooks.go | 15 +- providers/vercel/provider_options.go | 6 +- providertests/anthropic_test.go | 6 +- providertests/azure_responses_test.go | 2 +- providertests/common_test.go | 12 +- providertests/google_test.go | 6 +- providertests/image_upload_test.go | 4 +- providertests/object_test.go | 8 +- providertests/openai_responses_test.go | 2 +- providertests/openai_web_search_test.go | 4 +- providertests/provider_registry_test.go | 12 +- schema/schema.go | 4 +- util.go | 4 +- 34 files changed, 2290 insertions(+), 524 deletions(-) create mode 100644 examples/kronk/simple/main.go create mode 100644 examples/kronk/stream/main.go create mode 100644 providers/kronk/README.md create mode 100644 providers/kronk/kronk.go create mode 100644 providers/kronk/language_model.go create mode 100644 providers/kronk/language_model_hooks.go create mode 100644 providers/kronk/options.go create mode 100644 providers/kronk/provider_options.go diff --git a/agent.go b/agent.go index 62e219457..2ce313577 100644 --- a/agent.go +++ b/agent.go @@ -11,6 +11,7 @@ import ( "slices" "sync" + "charm.land/fantasy/jsonrepair" "charm.land/fantasy/schema" "github.com/charmbracelet/x/exp/slice" ) @@ -1042,6 +1043,16 @@ func (a *agent) validateAndRepairToolCall(ctx context.Context, toolCall ToolCall return *repairedToolCall } } + } else { + // Default repair: try jsonrepair for malformed JSON when no + // custom repair function is configured. + if repaired, repairErr := jsonrepair.RepairJSON(toolCall.Input); repairErr == nil && repaired != toolCall.Input { + repairedCall := toolCall + repairedCall.Input = repaired + if validateErr := a.validateToolCall(repairedCall, availableTools, execProviderTools); validateErr == nil { + return repairedCall + } + } } invalidToolCall := toolCall diff --git a/examples/go.mod b/examples/go.mod index 9cf6df70e..16e6e6710 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.3 +go 1.26.4 replace charm.land/fantasy => ../ @@ -19,30 +19,30 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.11.0 // indirect cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect - github.com/ardanlabs/jinja v1.2.0 // indirect - github.com/ardanlabs/kronk v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.17 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect - github.com/aws/smithy-go v1.25.1 // indirect + cloud.google.com/go/storage v1.62.3 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect + github.com/ardanlabs/jinja v1.4.0 // indirect + github.com/ardanlabs/kronk v1.27.4 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.12 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.23 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.22 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 // indirect + github.com/aws/smithy-go v1.27.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -56,12 +56,12 @@ require ( github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/ebitengine/purego v0.10.0 // indirect + github.com/ebitengine/purego v0.10.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 // indirect + github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -70,20 +70,18 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.13.0 // indirect + github.com/hybridgroup/yzma v1.16.1 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/go-i18n v0.4.5 // indirect - github.com/kaptinlin/jsonpointer v0.4.20 // indirect - github.com/kaptinlin/jsonschema v0.7.13 // indirect - github.com/kaptinlin/messageformat-go v0.6.0 // indirect + github.com/kaptinlin/jsonpointer v0.4.26 // indirect + github.com/kaptinlin/jsonschema v0.8.0 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect @@ -93,10 +91,10 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/common v0.68.1 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -104,31 +102,32 @@ require ( github.com/ulikunitz/xz v0.5.15 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.51.0 // indirect + golang.org/x/crypto v0.52.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/net v0.54.0 // indirect + golang.org/x/image v0.41.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.278.0 // indirect - google.golang.org/genai v1.56.0 // indirect - google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 // indirect - google.golang.org/grpc v1.81.0 // indirect + google.golang.org/api v0.283.0 // indirect + google.golang.org/genai v1.59.0 // indirect + google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 806d884b1..87c260441 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -10,64 +10,64 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/logging v1.17.0 h1:rUFekZYwHiKElXCyz3zYBGz4BOeIqzgCKxVLdgrZ5mY= -cloud.google.com/go/logging v1.17.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v0.12.0 h1:wLv2hXvID9zHejLtcPo1B0JBjErnwZCYAPKSTa65xpY= -cloud.google.com/go/longrunning v0.12.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= +cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= +cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.1 h1:Os0G3XbUbjZumkpDUf2Y0rLoXJTCF1kU2kWUujKYXD8= -cloud.google.com/go/storage v1.62.1/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= -cloud.google.com/go/trace v1.15.0 h1:kAYkTwKyYHkGtAGFuu6qaUFRBkOVr+d1Yo44yZtGtgg= -cloud.google.com/go/trace v1.15.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 h1:O2sXMyJh8b7devAGdE+163xtRurt0RVpB6DIzX5vGfg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0/go.mod h1:hEpiGU18xf70qb3jbTcIggWAiEfX/cOIVc2OTe4OegA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0 h1:ZIT85vKP7LBS84XJ0WdJ3dPOX3iz4j3c0+lpajGQMyo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.56.0/go.mod h1:rqP9UEhOXv9WhQ7Gjz+G5y/pf8+BJZW5/Ts0AhE0PwE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 h1:0YP0+/ixwu+Uqeu/FGiBZNQ19huiUxxiPXIc9WsLKuQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0/go.mod h1:6ZZMQhZKDvUvkJw2rc+oDP90tMMzuU/J+5HG1ZmPOmE= -github.com/ardanlabs/jinja v1.2.0 h1:B5di2EVsMkYFhEk1yCnDPTZ4KhqYmwNaNIp8PUWYq+A= -github.com/ardanlabs/jinja v1.2.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.25.2 h1:kw8sDq/yDvy8D9I4/L4yptwmevfnM4hNeGv7mKLCz1s= -github.com/ardanlabs/kronk v1.25.2/go.mod h1:b5Gg4jDqvHDklkeHNB8+7treZRxUiCFsV65zphrTloY= -github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8= -github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= -github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU= -github.com/aws/aws-sdk-go-v2/config v1.32.17/go.mod h1:OXqUMzgXytfoF9JaKkhrOYsyh72t9G+MJH8mMRaexOE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60QbKBiII6wSrXnapxSU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 h1:ieLCO1JxUWuxTZ1cRd0GAaeX7O6cIxnwk7tc1LsQhC4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15/go.mod h1:e3IzZvQ3kAWNykvE0Tr0RDZCMFInMvhku3qNpcIQXhM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 h1:03xatSQO4+AM1lTAbnRg5OK528EUg744nW7F73U8DKw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23/go.mod h1:M8l3mwgx5ToK7wot2sBBce/ojzgnPzZXUV445gTSyE8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 h1:etqBTKY581iwLL/H/S2sVgk3C9lAsTJFeXWFDsDcWOU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0/go.mod h1:L2dcoOgS2VSgbPLvpak2NyUPsO1TBN7M45Z4H7DlRc4= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 h1:TdJ+HdzOBhU8+iVAOGUTU63VXopcumCOF1paFulHWZc= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.11/go.mod h1:R82ZRExE/nheo0N+T8zHPcLRTcH8MGsnR3BiVGX0TwI= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 h1:7byT8HUWrgoRp6sXjxtZwgOKfhss5fW6SkLBtqzgRoE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.17/go.mod h1:xNWknVi4Ezm1vg1QsB/5EWpAJURq22uqd38U8qKvOJc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29h8BvsCoHQEQ6ST9X8w7w= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio= -github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI= -github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= +cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= +cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= +github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= +github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= +github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= +github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= +github.com/aws/aws-sdk-go-v2/config v1.32.23 h1:PYDobtcsJXK6bQe9I8RQk6s19Bz3xa3xRU08Hy1Em3Y= +github.com/aws/aws-sdk-go-v2/config v1.32.23/go.mod h1:QID4dqUQVgEOYPKsPWd1sNWCCR2c5g7o3jeEtIXPOZU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22 h1:SHfH6wyPsEgG7fVsi5rQxWEt7tuIcN2PGhb1mTFv6tE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.22/go.mod h1:54nO8lKD4aQPOntM/VTWjnR+DYzTwx0YkSMZMhAgewQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 h1:b+kcDejJrXc30zU/w8Tc9klISwaO5wh+6T0sMBdDoHM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28/go.mod h1:LnI62O9GnSv6GcuLXxOYqlq0C8EmxMcgnF6m7LdYuOY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 h1:Xf2j7NdVcUKomlZ4iihOP4AZ3Fzlr8h4yKpXeP+OFPg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28/go.mod h1:O8cDo1dW63jU7ki//kRe1z+tLGcpnD1jrouitsQddDw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 h1:KqIfN9kpkKkcBqBbNpNGTIrXO6ExTUvFKvXkC+YAzVo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28/go.mod h1:uxtQiKvLtNS4iXVsH2McVD/ls8FKN/uUhe1hGxPjrw0= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 h1:VkE9FuzTQVjBBrnj4+oCdxCLFIz7aqLYKUCjtvxVcOs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29/go.mod h1:H32Z2Qth9b+9LqjyBsCnozMQ8H2N7YBUDVXwbs0iggg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 h1:axj4mEDletwKmTm/9jR+DkIMmCfcn5vE4jBMAAN+3Vg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28/go.mod h1:3Aaz69M0jqfSHLKqxgolgUBFT4hpwSNc7DzC95orEi8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 h1:YcpVyIPLCbiypN6KSphijN5fC7DDjX114SqA7prnnxg= +github.com/aws/aws-sdk-go-v2/service/signin v1.1.4/go.mod h1:5ZICS++oFTRPfa1GsBqFDWX/8WamZ/QQOcCzIuU/zLw= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 h1:ySNWu7TPmj5fKFIa1GYvX+Ddxd5ccruqC20aMNuyWDM= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.2/go.mod h1:A+U9luAOwFeB1kseyWCITVg7/NntoPebCFR9pQ4ch9A= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 h1:KSzGGqfk39O+WU3OEyYbx6F7sLDQCqxlOJ+2IksfK6U= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5/go.mod h1:ATs88lXDeQB6CZOgQ5BIl9JbYS+EsCWUSDyff6L/oVo= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 h1:RTO7mmGyedgnNmcPh3yQizNfc6GKoV5iqfdJavuf9vw= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.2/go.mod h1:fBhUZXDin9YYqhcpOMjIcpdik25rVwWyxLdPH1RZd9s= +github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= +github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -108,8 +108,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= -github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= +github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= @@ -122,8 +122,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4 h1:2WmHkJINIjgXXYDGik8d3oJvFA3DAwPy00csDJ3vo+o= -github.com/go-json-experiment/json v0.0.0-20260430182902-b6187a392ed4/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -145,34 +145,30 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.15 h1:xolVQTEXusUcAA5UgtyRLjelpFFHWlPQ4XfWGc7MBas= -github.com/googleapis/enterprise-certificate-proxy v0.3.15/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.13.0 h1:itnOCpjZMZ9iSRLgV1iK1dZPtzr2uC+wIyOiQp9S4GI= -github.com/hybridgroup/yzma v1.13.0/go.mod h1:zrzMgv/KVQz23+s6l16b+vJ+9uJVBdWtGcGkwRTMeiQ= +github.com/hybridgroup/yzma v1.16.1 h1:t1uA0Jsv5D9YzBa1D4CapK8kZA/uYrgaCHR33brVqjg= +github.com/hybridgroup/yzma v1.16.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/go-i18n v0.4.5 h1:9tIlo5A0RXth+yZJO2MG7Bhpu/X9PlzQnGz/qyYWNoY= -github.com/kaptinlin/go-i18n v0.4.5/go.mod h1:mU/7BH4molY5lGZYBwBRKAaiJ70dWRHuqmQ0/pFLGno= -github.com/kaptinlin/jsonpointer v0.4.20 h1:otSZZnCVdVo9OwOm+AQhS8ke31CLLQYXmG5Q0GOrXYg= -github.com/kaptinlin/jsonpointer v0.4.20/go.mod h1:Mo7+DX8RlQTFqS4dnYJl0izSP4ob+Rl5xO/mGDETgaU= -github.com/kaptinlin/jsonschema v0.7.13 h1:kahVXTy/rURL0XJjyQ9WELm59wEmXi6IY0TWswQEFvU= -github.com/kaptinlin/jsonschema v0.7.13/go.mod h1:Uh0aUBusnhXDCEXJ2oimL/hx7YTo7F+sKniE+tM0ERc= -github.com/kaptinlin/messageformat-go v0.6.0 h1:D6jiXFsKW4/JG2CMddv/F6Rev9KVbCRKEzzV5QOAcpc= -github.com/kaptinlin/messageformat-go v0.6.0/go.mod h1:NKjwS6e9u7DRhAK+vydjDDwJ7UbdHhYjk/yk2WPuZPs= +github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= +github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= +github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= +github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= @@ -185,8 +181,6 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= -github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -195,15 +189,15 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= -github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= +github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= +github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -222,64 +216,68 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= +go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= +golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.278.0 h1:W7jiRvRi53VYFfZ/HoZjQBtJk7gOFbHD8ot1RzVZU6E= -google.golang.org/api v0.278.0/go.mod h1:B9TqLBwJqVjp1mtt7WeoQwWRwvu/400y5lETOql+giQ= -google.golang.org/genai v1.56.0 h1:IwWrg1K0cn1/WBiPno/dYr0Q6o75NeH/bh3G4JEFERE= -google.golang.org/genai v1.56.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348 h1:JjVGDZYWkJWZcxveJGzfkXC5myDVWAd4dZdgbzrDUv8= -google.golang.org/genproto v0.0.0-20260504160031-60b97b32f348/go.mod h1:95PqD4xM+AdOcBGsmgfaofXsiA37uXDtDufVbntT3TU= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348 h1:U8orV30l6KpDsi9dxU0CoJZGbjS8EEpw+6ba+XwGPQA= -google.golang.org/genproto/googleapis/api v0.0.0-20260504160031-60b97b32f348/go.mod h1:Yzdzr5OOZFgSsEV2D/Xi9NL3bszpXFAg0hFJiRohcD8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348 h1:pfIbyB44sWzHiCpRqIen67ZQnVXSfIxWrqUMk1qwODE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= -google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= +google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= +google.golang.org/genai v1.59.0 h1:xp+ydkJFW8hO0hTUaAkr8TrLM9HFP3NYAwFhPd0nDqA= +google.golang.org/genai v1.59.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= +google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/examples/kronk/simple/main.go b/examples/kronk/simple/main.go new file mode 100644 index 000000000..44919fd4e --- /dev/null +++ b/examples/kronk/simple/main.go @@ -0,0 +1,93 @@ +package main + +// This is a basic example illustrating how to create an agent with a custom +// tool call. + +import ( + "context" + "fmt" + "os" + "time" + + "charm.land/fantasy" + "charm.land/fantasy/providers/kronk" +) + +const modelURL = "Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q8_0.gguf" + +func main() { + if err := run(); err != nil { + fmt.Printf("\nERROR: %s\n", err) + os.Exit(1) + } +} + +func run() error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + + // Create the provider with optional logging. + provider, err := kronk.New( + kronk.WithName("kronk"), + kronk.WithLogger(kronk.FmtLogger), + ) + if err != nil { + return fmt.Errorf("unable to create provider: %w", err) + } + + // Clean up when done. + defer func() { + fmt.Println("\nUnloading Kronk") + if closer, ok := provider.(interface{ Close(context.Context) error }); ok { + if err := closer.Close(context.Background()); err != nil { + fmt.Printf("failed to close provider: %v\n", err) + } + } + }() + + // Get a language model by providing the model URL. + // The provider will download and initialize the model automatically. + model, err := provider.LanguageModel(ctx, modelURL) + if err != nil { + return fmt.Errorf("unable to get language model: %w", err) + } + + // ------------------------------------------------------------------------- + + // Let's make a tool that fetches info about cute dogs. Here's a schema + // for the tool's input. + type cuteDogQuery struct { + Location string `json:"location" description:"The location to search for cute dogs."` + } + + // And here's the implementation of that tool. + fetchCuteDogInfo := func(ctx context.Context, input cuteDogQuery, _ fantasy.ToolCall) (fantasy.ToolResponse, error) { + if input.Location == "Silver Lake, Los Angeles" { + return fantasy.NewTextResponse("Cute dogs are everywhere!"), nil + } + return fantasy.NewTextResponse("No cute dogs found."), nil + } + + // Add the tool. + cuteDogTool := fantasy.NewAgentTool("cute_dog_tool", "Provide up-to-date info on cute dogs.", fetchCuteDogInfo) + + // Equip your agent. + agent := fantasy.NewAgent(model, + fantasy.WithSystemPrompt("You are a moderately helpful, dog-centric assistant."), + fantasy.WithTools(cuteDogTool), + fantasy.WithMaxOutputTokens(2048), + fantasy.WithTemperature(0.7), + fantasy.WithTopP(0.8), + fantasy.WithTopK(20), + ) + + // Put that agent to work! + const prompt = "Find all the cute dogs in Silver Lake, Los Angeles. Use the cute dog tool." + result, err := agent.Generate(ctx, fantasy.AgentCall{Prompt: prompt}) + if err != nil { + return fmt.Errorf("agent generate failed: %w", err) + } + fmt.Println(result.Response.Content.Text()) + + return nil +} diff --git a/examples/kronk/stream/main.go b/examples/kronk/stream/main.go new file mode 100644 index 000000000..e63465919 --- /dev/null +++ b/examples/kronk/stream/main.go @@ -0,0 +1,181 @@ +package main + +// This example demonstrates how to hook into the various parts of a streaming +// tool call. + +import ( + "context" + "fmt" + "math/rand/v2" + "os" + "strings" + "time" + + "charm.land/fantasy" + "charm.land/fantasy/providers/kronk" +) + +const modelURL = "Qwen/Qwen3-8B-GGUF/Qwen3-8B-Q8_0.gguf" + +const systemPrompt = ` +You are moderately helpful assistant with a new puppy named Chuck. Chuck is +moody and ranges from very happy to very annoyed. He's pretty happy-go-lucky, +but new encounters make him pretty uncomfortable. + +You despise emojis and never use them. Same with Markdown. Same with em-dashes. +You prefer "welp" to "well" when starting a sentence (that's just how you were +raised). You also don't use run-on sentences, including entering a comma where +there should be a period. You had a decent education and did well in elementary +school grammar. You grew up in the United States, specifically Kansas City, +Missouri. +` + +// Input for a tool call. The LLM will look at the struct tags and fill out the +// values as necessary. +type dogInteraction struct { + OtherDogName string `json:"dogName" description:"Name of the other dog. Just make something up. All the dogs are named after Japanese cars from the 80s."` +} + +// Here's a tool call. In this case it's a set of random barks. +func letsBark(ctx context.Context, i dogInteraction, _ fantasy.ToolCall) (fantasy.ToolResponse, error) { + var r fantasy.ToolResponse + if rand.Float64() >= 0.5 { + r.Content = randomBarks(1, 3) + } else { + r.Content = randomBarks(5, 10) + } + return r, nil +} + +func main() { + if err := run(); err != nil { + fmt.Printf("\nERROR: %s\n", err) + os.Exit(1) + } +} + +func run() error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + + // Create the provider with optional logging. + provider, err := kronk.New( + kronk.WithName("kronk"), + kronk.WithLogger(kronk.FmtLogger), + ) + if err != nil { + return fmt.Errorf("unable to create provider: %w", err) + } + + // Clean up when done. + defer func() { + fmt.Println("\nUnloading Kronk") + if closer, ok := provider.(interface{ Close(context.Context) error }); ok { + if err := closer.Close(context.Background()); err != nil { + fmt.Printf("failed to close provider: %v\n", err) + } + } + }() + + // Get a language model by providing the model URL. + // The provider will download and initialize the model automatically. + model, err := provider.LanguageModel(ctx, modelURL) + if err != nil { + return fmt.Errorf("unable to get language model: %w", err) + } + + // ------------------------------------------------------------------------- + + // Let's add a tool to our belt. A tool for dogs. + barkTool := fantasy.NewAgentTool( + "bark", + "Have Chuck express his feelings by barking. A few barks means he's happy and many barks means he's not.", + letsBark, + ) + + // Time to make the agent. + agent := fantasy.NewAgent( + model, + fantasy.WithSystemPrompt(systemPrompt), + fantasy.WithTools(barkTool), + ) + + // Alright, let's setup a streaming request! + streamCall := fantasy.AgentStreamCall{ + // The prompt. + Prompt: "what does Chuck say when he is happy", + + // When reasoning starts (Qwen3 models use "thinking" mode). + OnReasoningStart: func(id string, content fantasy.ReasoningContent) error { + fmt.Print("\n[Thinking: ") + return nil + }, + + // When we receive reasoning content. + OnReasoningDelta: func(id, text string) error { + // Print reasoning in a subdued way + fmt.Print(text) + return nil + }, + + // When reasoning ends. + OnReasoningEnd: func(id string, reasoning fantasy.ReasoningContent) error { + fmt.Print("]\n\n") + return nil + }, + + // When we receive a chunk of streaming data. + OnTextDelta: func(id, text string) error { + _, fmtErr := fmt.Print(text) + return fmtErr + }, + + // When tool calls are invoked. + OnToolCall: func(toolCall fantasy.ToolCallContent) error { + fmt.Printf("\n-> Invoking the %s tool with input %s\n", toolCall.ToolName, toolCall.Input) + return nil + }, + + // When a tool call completes. + OnToolResult: func(res fantasy.ToolResultContent) error { + text, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](res.Result) + if !ok { + return fmt.Errorf("failed to cast result to text") + } + _, fmtErr := fmt.Printf("\n-> Using the %s tool: %s", res.ToolName, text.Text) + return fmtErr + }, + + // When a step finishes, such as a tool call or a response from the + // LLM. + OnStepFinish: func(_ fantasy.StepResult) error { + fmt.Print("\n-> Step completed\n") + return nil + }, + } + + fmt.Println("Generating...") + + // Finally, let's stream everything! + _, err = agent.Stream(ctx, streamCall) + if err != nil { + fmt.Fprintf(os.Stderr, "Error generating response: %v\n", err) + os.Exit(1) + } + + return nil +} + +// Return a random number of barks between low and high. +func randomBarks(low, high int) string { + const bark = "ruff" + numBarks := low + rand.IntN(high-low+1) + var barks strings.Builder + for i := range numBarks { + if i > 0 { + barks.WriteString(" ") + } + barks.WriteString(bark) + } + return barks.String() +} diff --git a/go.mod b/go.mod index ebbebfe28..2927fed05 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,11 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.18.2 - github.com/aws/aws-sdk-go-v2 v1.41.4 - github.com/aws/aws-sdk-go-v2/config v1.32.12 - github.com/aws/smithy-go v1.24.2 + cloud.google.com/go/auth v0.20.0 + github.com/ardanlabs/kronk v1.27.9 + github.com/aws/aws-sdk-go-v2 v1.42.0 + github.com/aws/aws-sdk-go-v2/config v1.32.25 + github.com/aws/smithy-go v1.27.2 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -16,66 +17,110 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.6.10 + github.com/kaptinlin/jsonschema v0.8.0 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.51.0 + google.golang.org/genai v1.60.0 ) require ( - cloud.google.com/go v0.116.0 // indirect + cel.dev/expr v0.25.2 // indirect + cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.11.0 // indirect + cloud.google.com/go/monitoring v1.29.0 // indirect + cloud.google.com/go/storage v1.62.3 // 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/aws/protocol/eventstream v1.6.3 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect + github.com/ardanlabs/jinja v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e // indirect + github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/ebitengine/purego v0.10.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect + github.com/felixge/httpsnoop v1.1.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.11 // indirect - github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect + github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/kaptinlin/go-i18n v0.2.3 // indirect - github.com/kaptinlin/jsonpointer v0.4.9 // indirect - github.com/kaptinlin/messageformat-go v0.4.9 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect + github.com/hybridgroup/yzma v1.17.1 // indirect + github.com/jupiterrider/ffi v0.7.0 // indirect + github.com/kaptinlin/jsonpointer v0.4.26 // indirect + github.com/klauspost/compress v1.18.6 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.68.1 // indirect + github.com/prometheus/procfs v0.20.1 // indirect + github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel v1.39.0 // indirect - go.opentelemetry.io/otel/metric v1.39.0 // indirect - go.opentelemetry.io/otel/trace v1.39.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/otel/sdk v1.44.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/net v0.55.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/text v0.37.0 // indirect - golang.org/x/time v0.14.0 // indirect - google.golang.org/api v0.264.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/grpc v1.78.0 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/image v0.42.0 // indirect + golang.org/x/net v0.56.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/text v0.38.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.284.0 // indirect + google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index c38a62627..20ab82abe 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,27 @@ +cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= +cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= -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.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= -cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= +cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= +cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= +cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= +cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= +cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= +cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= +cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= +cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= +cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= 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= @@ -16,36 +30,60 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP 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/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= -github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= -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.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= -github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= -github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= -github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= -github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= +github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.27.9 h1:ZQXfWq86eq19dHOBvOm9dVUIyevV60hdZy2S5Bp/+mY= +github.com/ardanlabs/kronk v1.27.9/go.mod h1:dLd1F38v+1URf5Vsa/P4ENS9VhZw4vwX7EEhHFAAdkA= +github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= +github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= +github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= +github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 h1:JRseEu/vIDMaWis4bSw0QbXL+cvIGc1XnX076H5ZXLE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= +github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= +github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY= @@ -56,23 +94,30 @@ github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9 github.com/charmbracelet/x/exp/strings v0.1.0/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= -github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= -github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= +github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/coder/anthropic-sdk-go v0.0.0-20260415160422-a31d7d0e7067 h1:v1RAkUO21u0QH6UlUueSHMbgFf++BZZW41Rj6LM2eWo= github.com/coder/anthropic-sdk-go v0.0.0-20260415160422-a31d7d0e7067/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= -github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= -github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= -github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= -github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e h1:Lf/gRkoycfOBPa42vU2bbgPurFong6zXeFtPoxholzU= -github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e/go.mod h1:uNVvRXArCGbZ508SxYYTC5v1JWoz2voff5pm25jU1Ok= +github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= +github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= +github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= +github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= +github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= 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= @@ -82,48 +127,74 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -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-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= 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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.11 h1:vAe81Msw+8tKUxi2Dqh/NZMz7475yUvmRIkXr4oN2ao= -github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8= -github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= -github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= +github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hybridgroup/yzma v1.17.1 h1:T841QThcR+LrdEGp5ISGMKIJFUGQHgWXvjXfIIUEDFI= +github.com/hybridgroup/yzma v1.17.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/kaptinlin/go-i18n v0.2.3 h1:jyN/YOXXLcnGRBLdU+a8+6782B97fWE5aQqAHtvvk8Q= -github.com/kaptinlin/go-i18n v0.2.3/go.mod h1:O+Ax4HkMO0Jt4OaP4E4WCx0PAADeWkwk8Jgt9bjAU1w= -github.com/kaptinlin/jsonpointer v0.4.9 h1:o//bYf4PCvnMJIIX8bIg77KB6DO3wBPAabRyPRKh680= -github.com/kaptinlin/jsonpointer v0.4.9/go.mod h1:9y0LgXavlmVE5FSHShY5LRlURJJVhbyVJSRWkilrTqA= -github.com/kaptinlin/jsonschema v0.6.10 h1:CYded7nrwVu7pU1GaIjtd9dSzgqZjh7+LTKFaWqS08I= -github.com/kaptinlin/jsonschema v0.6.10/go.mod h1:ZXZ4K5KrRmCCF1i6dgvBsQifl+WTb8XShKj0NpQNrz8= -github.com/kaptinlin/messageformat-go v0.4.9 h1:FR5j5n4aL4nG0afKn9vvANrKxLu7HjmbhJnw5ogIwAQ= -github.com/kaptinlin/messageformat-go v0.4.9/go.mod h1:qZzrGrlvWDz2KyyvN3dOWcK9PVSRV1BnfnNU+zB/RWc= +github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= +github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= +github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= +github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= +github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= +github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= +github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= +github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -136,48 +207,72 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= +go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= +go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/image v0.42.0 h1:1gSs6ehNWXLbkHBIPcWztk3D/6aIA/8hauiAYtlodVY= +golang.org/x/image v0.42.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.264.0 h1:+Fo3DQXBK8gLdf8rFZ3uLu39JpOnhvzJrLMQSoSYZJM= -google.golang.org/api v0.264.0/go.mod h1:fAU1xtNNisHgOF5JooAs8rRaTkl2rT3uaoNGo9NS3R8= -google.golang.org/genai v1.51.0 h1:IZGuUqgfx40INv3hLFGCbOSGp0qFqm7LVmDghzNIYqg= -google.golang.org/genai v1.51.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 h1:H86B94AW+VfJWDqFeEbBPhEtHzJwJfTbgE2lZa54ZAQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= -google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= -google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/api v0.284.0 h1:i+cKTgeQRcRySkP7QTl5PDO7/pAm8EcMFIUMlNbk4Vc= +google.golang.org/api v0.284.0/go.mod h1:AU44fU+XVZOCcd8uLaBIa/ZgzgPf/0qqY3+m7lQaado= +google.golang.org/genai v1.60.0 h1:uAkea4tYhCz1LlUmxdiOFAmlrLFaLs8PbXucgZHqHVo= +google.golang.org/genai v1.60.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad h1:cYL1DPJAQr4JMvhfGao0PDXoaf03ifMljAuDyrbMBd0= +google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw= +google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 96e61ad54..9bbf1232a 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -2307,138 +2307,55 @@ func TestStream_WebSearchErrorPreservesErrorCode(t *testing.T) { `data: {"type":"message_stop"}` + "\n\n", } - parts := streamAnthropicParts(t, chunks, WebSearchTool(nil)) - - toolResults := streamPartsByType(parts, fantasy.StreamPartTypeToolResult) - sourceParts := streamPartsByType(parts, fantasy.StreamPartTypeSource) - require.Len(t, toolResults, 1) - require.Empty(t, sourceParts) - require.True(t, toolResults[0].ProviderExecuted) - require.Equal(t, "srvtoolu_err", toolResults[0].ID) - require.Equal(t, "web_search", toolResults[0].ToolCallName) - webMeta := requireWebSearchResultMetadata(t, toolResults[0].ProviderMetadata) - require.Equal(t, "max_uses_exceeded", webMeta.ErrorCode) - require.Empty(t, webMeta.Results) -} - -func TestStream_RedactedThinkingEmitsStartAndEnd(t *testing.T) { - t.Parallel() - - parts := streamAnthropicParts(t, []string{ - anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_redacted","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_blob"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), - anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), - }) + server, calls := newAnthropicStreamingServer(chunks) + defer server.Close() - starts := streamPartsByType(parts, fantasy.StreamPartTypeReasoningStart) - ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) - require.Len(t, starts, 1) - require.Len(t, ends, 1) - require.Equal(t, starts[0].ID, ends[0].ID) - require.Equal(t, "redacted_blob", requireReasoningMetadata(t, starts[0].ProviderMetadata).RedactedData) - require.Equal(t, "redacted_blob", requireReasoningMetadata(t, ends[0].ProviderMetadata).RedactedData) -} + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.URL), + ) + require.NoError(t, err) -func TestStream_ThinkingSignaturePresentOnEnd(t *testing.T) { - t.Parallel() + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) - parts := streamAnthropicParts(t, []string{ - anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first thought"}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_123"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), - anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt(), + Tools: []fantasy.Tool{ + WebSearchTool(nil), + }, }) + require.NoError(t, err) - deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) - ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) - require.Len(t, deltas, 2) - require.Equal(t, "first thought", deltas[0].Delta) - require.Equal(t, "sig_123", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) - require.Len(t, ends, 1) - require.Equal(t, "sig_123", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) -} - -func TestStream_NilMetadataDeltaDoesNotEraseSignatureOnEnd(t *testing.T) { - t.Parallel() - - parts := streamAnthropicParts(t, []string{ - anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig_tail","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first"}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_tail"}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"second"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), - anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true }) - deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) - ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) - require.Len(t, deltas, 3) - require.Equal(t, "first", deltas[0].Delta) - require.Len(t, deltas[0].ProviderMetadata, 0) - require.Equal(t, "sig_tail", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) - require.Equal(t, "second", deltas[2].Delta) - require.Len(t, deltas[2].ProviderMetadata, 0) - require.Len(t, ends, 1) - require.Equal(t, "sig_tail", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) -} - -func TestStream_InterleavedThinkingAndRedactedThinking(t *testing.T) { - t.Parallel() - - parts := streamAnthropicParts(t, []string{ - anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_interleaved","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_0"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":1,"content_block":{"type":"thinking","thinking":""}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"thinking_delta","thinking":"reasoning_1"}}`), - anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"signature_delta","signature":"sig_1"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":1}`), - anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":2,"content_block":{"type":"redacted_thinking","data":"redacted_2"}}`), - anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":2}`), - anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), - }) + _ = awaitAnthropicCall(t, calls) - var reasoningParts []fantasy.StreamPart - for _, part := range parts { - switch part.Type { - case fantasy.StreamPartTypeReasoningStart, fantasy.StreamPartTypeReasoningDelta, fantasy.StreamPartTypeReasoningEnd: - reasoningParts = append(reasoningParts, part) + var ( + toolResults []fantasy.StreamPart + sourceParts []fantasy.StreamPart + ) + for _, p := range parts { + switch p.Type { + case fantasy.StreamPartTypeToolResult: + toolResults = append(toolResults, p) + case fantasy.StreamPartTypeSource: + sourceParts = append(sourceParts, p) } } - require.Len(t, reasoningParts, 8) - require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[0].Type) - require.Equal(t, "0", reasoningParts[0].ID) - require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[0].ProviderMetadata).RedactedData) - - require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[1].Type) - require.Equal(t, "0", reasoningParts[1].ID) - require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[1].ProviderMetadata).RedactedData) - - require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[2].Type) - require.Equal(t, "1", reasoningParts[2].ID) - require.Len(t, reasoningParts[2].ProviderMetadata, 0) - - require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[3].Type) - require.Equal(t, "reasoning_1", reasoningParts[3].Delta) - require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[4].Type) - require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[4].ProviderMetadata).Signature) - - require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[5].Type) - require.Equal(t, "1", reasoningParts[5].ID) - require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[5].ProviderMetadata).Signature) - - require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[6].Type) - require.Equal(t, "2", reasoningParts[6].ID) - require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[6].ProviderMetadata).RedactedData) - - require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[7].Type) - require.Equal(t, "2", reasoningParts[7].ID) - require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[7].ProviderMetadata).RedactedData) + require.Len(t, toolResults, 1) + require.Empty(t, sourceParts) + require.True(t, toolResults[0].ProviderExecuted) + require.Equal(t, "srvtoolu_err", toolResults[0].ID) + require.Equal(t, "web_search", toolResults[0].ToolCallName) + webMeta := requireWebSearchResultMetadata(t, toolResults[0].ProviderMetadata) + require.Equal(t, "max_uses_exceeded", webMeta.ErrorCode) + require.Empty(t, webMeta.Results) } func TestGenerate_ToolChoiceNone(t *testing.T) { @@ -2939,6 +2856,126 @@ func TestGenerate_BetaAPI(t *testing.T) { }) } +func TestStream_RedactedThinkingEmitsStartAndEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_redacted","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_blob"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + starts := streamPartsByType(parts, fantasy.StreamPartTypeReasoningStart) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, starts, 1) + require.Len(t, ends, 1) + require.Equal(t, starts[0].ID, ends[0].ID) + require.Equal(t, "redacted_blob", requireReasoningMetadata(t, starts[0].ProviderMetadata).RedactedData) + require.Equal(t, "redacted_blob", requireReasoningMetadata(t, ends[0].ProviderMetadata).RedactedData) +} + +func TestStream_ThinkingSignaturePresentOnEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first thought"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_123"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, deltas, 2) + require.Equal(t, "first thought", deltas[0].Delta) + require.Equal(t, "sig_123", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) + require.Len(t, ends, 1) + require.Equal(t, "sig_123", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) +} + +func TestStream_NilMetadataDeltaDoesNotEraseSignatureOnEnd(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_sig_tail","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"first"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"sig_tail"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"thinking_delta","thinking":"second"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + deltas := streamPartsByType(parts, fantasy.StreamPartTypeReasoningDelta) + ends := streamPartsByType(parts, fantasy.StreamPartTypeReasoningEnd) + require.Len(t, deltas, 3) + require.Equal(t, "first", deltas[0].Delta) + require.Len(t, deltas[0].ProviderMetadata, 0) + require.Equal(t, "sig_tail", requireReasoningMetadata(t, deltas[1].ProviderMetadata).Signature) + require.Equal(t, "second", deltas[2].Delta) + require.Len(t, deltas[2].ProviderMetadata, 0) + require.Len(t, ends, 1) + require.Equal(t, "sig_tail", requireReasoningMetadata(t, ends[0].ProviderMetadata).Signature) +} + +func TestStream_InterleavedThinkingAndRedactedThinking(t *testing.T) { + t.Parallel() + + parts := streamAnthropicParts(t, []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_interleaved","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"redacted_thinking","data":"redacted_0"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":1,"content_block":{"type":"thinking","thinking":""}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"thinking_delta","thinking":"reasoning_1"}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":1,"delta":{"type":"signature_delta","signature":"sig_1"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":1}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":2,"content_block":{"type":"redacted_thinking","data":"redacted_2"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":2}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + }) + + var reasoningParts []fantasy.StreamPart + for _, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeReasoningStart, fantasy.StreamPartTypeReasoningDelta, fantasy.StreamPartTypeReasoningEnd: + reasoningParts = append(reasoningParts, part) + } + } + + require.Len(t, reasoningParts, 8) + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[0].Type) + require.Equal(t, "0", reasoningParts[0].ID) + require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[0].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[1].Type) + require.Equal(t, "0", reasoningParts[1].ID) + require.Equal(t, "redacted_0", requireReasoningMetadata(t, reasoningParts[1].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[2].Type) + require.Equal(t, "1", reasoningParts[2].ID) + require.Len(t, reasoningParts[2].ProviderMetadata, 0) + + require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[3].Type) + require.Equal(t, "reasoning_1", reasoningParts[3].Delta) + require.Equal(t, fantasy.StreamPartTypeReasoningDelta, reasoningParts[4].Type) + require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[4].ProviderMetadata).Signature) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[5].Type) + require.Equal(t, "1", reasoningParts[5].ID) + require.Equal(t, "sig_1", requireReasoningMetadata(t, reasoningParts[5].ProviderMetadata).Signature) + + require.Equal(t, fantasy.StreamPartTypeReasoningStart, reasoningParts[6].Type) + require.Equal(t, "2", reasoningParts[6].ID) + require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[6].ProviderMetadata).RedactedData) + + require.Equal(t, fantasy.StreamPartTypeReasoningEnd, reasoningParts[7].Type) + require.Equal(t, "2", reasoningParts[7].ID) + require.Equal(t, "redacted_2", requireReasoningMetadata(t, reasoningParts[7].ProviderMetadata).RedactedData) +} + func TestStream_BetaAPI(t *testing.T) { t.Parallel() diff --git a/providers/google/google.go b/providers/google/google.go index 85585eaee..6fb1e3e20 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -255,7 +255,7 @@ func (g languageModel) prepareParams(call fantasy.Call) (*genai.GenerateContentC Type: fantasy.CallWarningTypeOther, Message: "The 'thinking_budget' option can not be under 128 and will be set to 128 by default", }) - providerOptions.ThinkingConfig.ThinkingBudget = fantasy.Opt(int64(128)) + providerOptions.ThinkingConfig.ThinkingBudget = new(int64(128)) } if providerOptions.ThinkingConfig.ThinkingLevel != nil && diff --git a/providers/kronk/README.md b/providers/kronk/README.md new file mode 100644 index 000000000..0e60403d2 --- /dev/null +++ b/providers/kronk/README.md @@ -0,0 +1,26 @@ +# Kronk + +> [!IMPORTANT] +> The Kronk provider for Fantasy is considered experimental! +> The API and behavior can change until we consider it stable. + +[Kronk][kronk] is a Go package by [ArdanLabs][ardanlabs] that uses [yzma][yzma] +under the hood to provide hardware accelerated local inference with +[llama.cpp][llama.cpp] directly integrated into your applications. +Kronk provides a high-level API that feels similar to using an OpenAI compatible +API. + +When using the Kronk provider in Fantasy, you only need to specify the model you +want to use and it'll be automatically downloaded in your machine and used for +inference. + +To see which models are available for you, see the [Kronk Catalog][catalog]. + +Examples on how to use it are available in [`examples/kronk`][examples]. + +[kronk]: https://github.com/ardanlabs/kronk +[ardanlabs]: https://github.com/ardanlabs +[yzma]: https://github.com/hybridgroup/yzma +[llama.cpp]: https://github.com/ggml-org/llama.cpp +[catalog]: https://github.com/ardanlabs/kronk_catalogs +[examples]: https://github.com/charmbracelet/fantasy/tree/main/examples/kronk diff --git a/providers/kronk/kronk.go b/providers/kronk/kronk.go new file mode 100644 index 000000000..6c698f7f1 --- /dev/null +++ b/providers/kronk/kronk.go @@ -0,0 +1,147 @@ +// Package kronk provides an implementation of the fantasy AI SDK for local +// models using the Kronk SDK. +package kronk + +import ( + "context" + "fmt" + "sync" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk" + "github.com/ardanlabs/kronk/sdk/kronk/model" + "github.com/ardanlabs/kronk/sdk/tools/libs" + "github.com/ardanlabs/kronk/sdk/tools/models" +) + +const ( + // Name is the name of the Kronk provider. + Name = "kronk" +) + +type provider struct { + options options + mu sync.Mutex + kronks map[string]*kronk.Kronk +} + +// New creates a new Kronk provider with the given options. +func New(opts ...Option) (fantasy.Provider, error) { + providerOptions := options{ + languageModelOptions: make([]LanguageModelOption, 0), + } + + for _, o := range opts { + o(&providerOptions) + } + + if providerOptions.name == "" { + providerOptions.name = Name + } + + p := provider{ + options: providerOptions, + kronks: make(map[string]*kronk.Kronk), + } + + return &p, nil +} + +// Name implements fantasy.Provider. +func (p *provider) Name() string { + return p.options.name +} + +// LanguageModel implements fantasy.Provider. +// The modelURL parameter should be a URL to a GGUF model file (e.g., from Hugging Face). +func (p *provider) LanguageModel(ctx context.Context, modelURL string) (fantasy.LanguageModel, error) { + p.mu.Lock() + defer p.mu.Unlock() + + if krn, ok := p.kronks[modelURL]; ok { + opts := append(p.options.languageModelOptions, WithLanguageModelObjectMode(p.options.objectMode)) + return newLanguageModel(modelURL, p.options.name, krn, opts...), nil + } + + mp, err := p.installSystem(ctx, modelURL) + if err != nil { + return nil, fmt.Errorf("failed to install system: %w", err) + } + + krn, err := p.newKronk(mp) + if err != nil { + return nil, fmt.Errorf("failed to create kronk instance: %w", err) + } + + p.kronks[modelURL] = krn + + opts := append(p.options.languageModelOptions, WithLanguageModelObjectMode(p.options.objectMode)) + + return newLanguageModel(modelURL, p.options.name, krn, opts...), nil +} + +// Close unloads all Kronk instances. Call this when done with the provider. +func (p *provider) Close(ctx context.Context) error { + p.mu.Lock() + defer p.mu.Unlock() + + var errs []error + + for url, krn := range p.kronks { + if err := krn.Unload(ctx); err != nil { + errs = append(errs, fmt.Errorf("failed to unload model %s: %w", url, err)) + } + + delete(p.kronks, url) + } + + if len(errs) > 0 { + return errs[0] + } + + return nil +} + +func (p *provider) installSystem(ctx context.Context, modelSource string) (models.Path, error) { + logger := p.options.logger + if logger == nil { + logger = func(context.Context, string, ...any) {} + } + + lbs, err := libs.New() + if err != nil { + return models.Path{}, fmt.Errorf("unable to create libs: %w", err) + } + + if _, err := lbs.Download(ctx, libs.Logger(logger)); err != nil { + return models.Path{}, fmt.Errorf("unable to install llama.cpp: %w", err) + } + + mdls, err := models.New() + if err != nil { + return models.Path{}, fmt.Errorf("unable to create models: %w", err) + } + + mp, err := mdls.Download(ctx, models.Logger(logger), modelSource) + if err != nil { + return models.Path{}, fmt.Errorf("unable to install model: %w", err) + } + + return mp, nil +} + +func (p *provider) newKronk(mp models.Path) (*kronk.Kronk, error) { + if err := kronk.Init(); err != nil { + return nil, fmt.Errorf("unable to init kronk: %w", err) + } + + cfg := p.options.modelConfig + cfg.ModelFiles = mp.ModelFiles + + krn, err := kronk.New(model.WithConfig(cfg)) + if err != nil { + return nil, fmt.Errorf("unable to create inference model: %w", err) + } + + return krn, nil +} diff --git a/providers/kronk/language_model.go b/providers/kronk/language_model.go new file mode 100644 index 000000000..dba0adce8 --- /dev/null +++ b/providers/kronk/language_model.go @@ -0,0 +1,669 @@ +package kronk + +import ( + "context" + "encoding/json" + "errors" + "io" + + "charm.land/fantasy" + "charm.land/fantasy/object" + "github.com/ardanlabs/kronk/sdk/kronk" + "github.com/ardanlabs/kronk/sdk/kronk/model" + xjson "github.com/charmbracelet/x/json" + "github.com/google/uuid" +) + +type languageModel struct { + provider string + modelID string + kronk *kronk.Kronk + objectMode fantasy.ObjectMode + prepareCallFunc LanguageModelPrepareCallFunc + mapFinishReasonFunc LanguageModelMapFinishReasonFunc + toPromptFunc LanguageModelToPromptFunc +} + +// LanguageModelOption is a function that configures a languageModel. +type LanguageModelOption func(*languageModel) + +// WithLanguageModelPrepareCallFunc sets the prepare call function for the language model. +func WithLanguageModelPrepareCallFunc(fn LanguageModelPrepareCallFunc) LanguageModelOption { + return func(l *languageModel) { + l.prepareCallFunc = fn + } +} + +// WithLanguageModelMapFinishReasonFunc sets the map finish reason function for the language model. +func WithLanguageModelMapFinishReasonFunc(fn LanguageModelMapFinishReasonFunc) LanguageModelOption { + return func(l *languageModel) { + l.mapFinishReasonFunc = fn + } +} + +// WithLanguageModelToPromptFunc sets the to prompt function for the language model. +func WithLanguageModelToPromptFunc(fn LanguageModelToPromptFunc) LanguageModelOption { + return func(l *languageModel) { + l.toPromptFunc = fn + } +} + +// WithLanguageModelObjectMode sets the object generation mode. +func WithLanguageModelObjectMode(om fantasy.ObjectMode) LanguageModelOption { + return func(l *languageModel) { + l.objectMode = om + } +} + +func newLanguageModel(modelID string, provider string, krn *kronk.Kronk, opts ...LanguageModelOption) *languageModel { + lm := languageModel{ + modelID: modelID, + provider: provider, + kronk: krn, + objectMode: fantasy.ObjectModeAuto, + prepareCallFunc: DefaultPrepareCallFunc, + mapFinishReasonFunc: DefaultMapFinishReasonFunc, + toPromptFunc: DefaultToPrompt, + } + + for _, o := range opts { + o(&lm) + } + + return &lm +} + +type streamToolCall struct { + id string + name string + arguments string + hasFinished bool +} + +// Model implements fantasy.LanguageModel. +func (l *languageModel) Model() string { + return l.modelID +} + +// Provider implements fantasy.LanguageModel. +func (l *languageModel) Provider() string { + return l.provider +} + +func (l *languageModel) prepareDocument(call fantasy.Call) (model.D, []fantasy.CallWarning, error) { + messages, warnings := l.toPromptFunc(call.Prompt, l.provider, l.modelID) + + if call.TopK != nil { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeUnsupportedSetting, + Setting: "top_k", + }) + } + + d := model.D{ + "messages": messages, + } + + if call.MaxOutputTokens != nil { + d["max_tokens"] = *call.MaxOutputTokens + } + + if call.Temperature != nil { + d["temperature"] = *call.Temperature + } + + if call.TopP != nil { + d["top_p"] = *call.TopP + } + + if call.FrequencyPenalty != nil { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeUnsupportedSetting, + Setting: "frequency_penalty", + Details: "frequency_penalty is not supported by Kronk", + }) + } + + if call.PresencePenalty != nil { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeUnsupportedSetting, + Setting: "presence_penalty", + Details: "presence_penalty is not supported by Kronk", + }) + } + + optionsWarnings, err := l.prepareCallFunc(l, d, call) + if err != nil { + return nil, nil, err + } + + if len(optionsWarnings) > 0 { + warnings = append(warnings, optionsWarnings...) + } + + if len(call.Tools) > 0 { + tools, toolWarnings := toKronkTools(call.Tools) + d["tools"] = tools + warnings = append(warnings, toolWarnings...) + } + + return d, warnings, nil +} + +// Generate implements fantasy.LanguageModel. +func (l *languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantasy.Response, error) { + d, warnings, err := l.prepareDocument(call) + if err != nil { + return nil, err + } + + ch, err := l.kronk.ChatStreaming(ctx, d) + if err != nil { + return nil, toProviderErr(err) + } + + var lastResponse model.ChatResponse + var fullContent string + + for resp := range ch { + lastResponse = resp + + if len(resp.Choices) > 0 && resp.Choices[0].Delta != nil { + switch resp.Choices[0].FinishReason() { + case model.FinishReasonError: + return nil, &fantasy.Error{Title: "model error", Message: resp.Choices[0].Delta.Content} + + case model.FinishReasonStop, model.FinishReasonTool: + // Final response already contains full accumulated content in Delta.Content, + // so we use it directly instead of continuing to accumulate. + fullContent = resp.Choices[0].Delta.Content + + default: + fullContent += resp.Choices[0].Delta.Content + } + } + } + + if len(lastResponse.Choices) == 0 { + return nil, &fantasy.Error{Title: "no response", Message: "no response generated"} + } + + choice := lastResponse.Choices[0] + var content []fantasy.Content + if choice.Delta != nil { + content = make([]fantasy.Content, 0, 1+len(choice.Delta.ToolCalls)) + } + + if fullContent != "" { + content = append(content, fantasy.TextContent{ + Text: fullContent, + }) + } + + if choice.Delta != nil { + for _, tc := range choice.Delta.ToolCalls { + // Marshal the underlying map directly, not the ToolCallArguments type + // which has a custom MarshalJSON that double-encodes to a JSON string. + argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) + + content = append(content, fantasy.ToolCallContent{ + ProviderExecuted: false, + ToolCallID: tc.ID, + ToolName: tc.Function.Name, + Input: string(argsJSON), + }) + } + } + + usage := fantasy.Usage{} + if lastResponse.Usage != nil { + usage = fantasy.Usage{ + InputTokens: int64(lastResponse.Usage.PromptTokens), + OutputTokens: int64(lastResponse.Usage.CompletionTokens), + TotalTokens: int64(lastResponse.Usage.PromptTokens + lastResponse.Usage.CompletionTokens), + ReasoningTokens: int64(lastResponse.Usage.ReasoningTokens), + } + } + + mappedFinishReason := l.mapFinishReasonFunc(choice.FinishReason()) + if choice.Delta != nil && len(choice.Delta.ToolCalls) > 0 { + mappedFinishReason = fantasy.FinishReasonToolCalls + } + + providerMetadata := fantasy.ProviderMetadata{} + if lastResponse.Usage != nil { + providerMetadata = fantasy.ProviderMetadata{ + Name: &ProviderMetadata{ + TokensPerSecond: lastResponse.Usage.TokensPerSecond, + OutputTokens: int64(lastResponse.Usage.OutputTokens), + }, + } + } + + resp := fantasy.Response{ + Content: content, + Usage: usage, + FinishReason: mappedFinishReason, + ProviderMetadata: providerMetadata, + Warnings: warnings, + } + + return &resp, nil +} + +// Stream implements fantasy.LanguageModel. +func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.StreamResponse, error) { + d, warnings, err := l.prepareDocument(call) + if err != nil { + return nil, err + } + + ch, err := l.kronk.ChatStreaming(ctx, d) + if err != nil { + return nil, toProviderErr(err) + } + + isActiveText := false + isActiveReasoning := false + toolCalls := make(map[int]streamToolCall) + + providerMetadata := fantasy.ProviderMetadata{ + Name: &ProviderMetadata{}, + } + + var usage fantasy.Usage + var finishReason string + + return func(yield func(fantasy.StreamPart) bool) { + if len(warnings) > 0 { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeWarnings, + Warnings: warnings, + }) { + return + } + } + + toolIndex := 0 + for resp := range ch { + if len(resp.Choices) == 0 { + continue + } + + choice := resp.Choices[0] + if choice.Delta == nil { + continue + } + + if resp.Usage != nil { + usage = fantasy.Usage{ + InputTokens: int64(resp.Usage.PromptTokens), + OutputTokens: int64(resp.Usage.CompletionTokens), + TotalTokens: int64(resp.Usage.PromptTokens + resp.Usage.CompletionTokens), + ReasoningTokens: int64(resp.Usage.ReasoningTokens), + } + + if pm, ok := providerMetadata[Name]; ok { + if metadata, ok := pm.(*ProviderMetadata); ok { + metadata.TokensPerSecond = resp.Usage.TokensPerSecond + metadata.OutputTokens = int64(resp.Usage.OutputTokens) + } + } + } + + if choice.FinishReason() != "" { + finishReason = choice.FinishReason() + } + + switch choice.FinishReason() { + case model.FinishReasonError: + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: &fantasy.Error{Title: "model error", Message: choice.Delta.Content}, + }) + return + + case model.FinishReasonTool: + if isActiveReasoning { + isActiveReasoning = false + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningEnd, + ID: "reasoning-0", + }) { + return + } + } + + if isActiveText { + isActiveText = false + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeTextEnd, + ID: "0", + }) { + return + } + } + + for _, tc := range choice.Delta.ToolCalls { + argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) + argsStr := string(argsJSON) + + toolID := tc.ID + if toolID == "" { + toolID = uuid.NewString() + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputStart, + ID: toolID, + ToolCallName: tc.Function.Name, + }) { + return + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputDelta, + ID: toolID, + Delta: argsStr, + }) { + return + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputEnd, + ID: toolID, + }) { + return + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolCall, + ID: toolID, + ToolCallName: tc.Function.Name, + ToolCallInput: argsStr, + }) { + return + } + + toolCalls[toolIndex] = streamToolCall{ + id: toolID, + name: tc.Function.Name, + arguments: argsStr, + hasFinished: true, + } + toolIndex++ + } + + default: + if choice.Delta.Reasoning != "" { + if !isActiveReasoning { + isActiveReasoning = true + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningStart, + ID: "reasoning-0", + }) { + return + } + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningDelta, + ID: "reasoning-0", + Delta: choice.Delta.Reasoning, + }) { + return + } + } + + hasToolCalls := len(choice.Delta.ToolCalls) > 0 + hasContent := choice.Delta.Content != "" + + if isActiveReasoning && (hasContent || hasToolCalls) { + isActiveReasoning = false + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningEnd, + ID: "reasoning-0", + }) { + return + } + } + + if hasContent { + if !isActiveText { + isActiveText = true + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeTextStart, + ID: "0", + }) { + return + } + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeTextDelta, + ID: "0", + Delta: choice.Delta.Content, + }) { + return + } + } + + if hasToolCalls && isActiveText { + isActiveText = false + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeTextEnd, + ID: "0", + }) { + return + } + } + + for _, tc := range choice.Delta.ToolCalls { + argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) + argsStr := string(argsJSON) + + switch existingTC, ok := toolCalls[toolIndex]; ok { + case true: + if existingTC.hasFinished { + continue + } + + existingTC.arguments += argsStr + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputDelta, + ID: existingTC.id, + Delta: argsStr, + }) { + return + } + + toolCalls[toolIndex] = existingTC + + if xjson.IsValid(existingTC.arguments) { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputEnd, + ID: existingTC.id, + }) { + return + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolCall, + ID: existingTC.id, + ToolCallName: existingTC.name, + ToolCallInput: existingTC.arguments, + }) { + return + } + + existingTC.hasFinished = true + toolCalls[toolIndex] = existingTC + } + + case false: + toolID := tc.ID + if toolID == "" { + toolID = uuid.NewString() + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputStart, + ID: toolID, + ToolCallName: tc.Function.Name, + }) { + return + } + + toolCalls[toolIndex] = streamToolCall{ + id: toolID, + name: tc.Function.Name, + arguments: argsStr, + } + + if argsStr != "" && argsStr != "null" { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputDelta, + ID: toolID, + Delta: argsStr, + }) { + return + } + + if xjson.IsValid(argsStr) { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputEnd, + ID: toolID, + }) { + return + } + + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolCall, + ID: toolID, + ToolCallName: tc.Function.Name, + ToolCallInput: argsStr, + }) { + return + } + + stc := toolCalls[toolIndex] + stc.hasFinished = true + toolCalls[toolIndex] = stc + } + } + + toolIndex++ + } + } + } + } + + if isActiveReasoning { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningEnd, + ID: "reasoning-0", + }) { + return + } + } + + if isActiveText { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeTextEnd, + ID: "0", + }) { + return + } + } + + mappedFinishReason := l.mapFinishReasonFunc(finishReason) + if len(toolCalls) > 0 { + mappedFinishReason = fantasy.FinishReasonToolCalls + } + + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeFinish, + Usage: usage, + FinishReason: mappedFinishReason, + ProviderMetadata: providerMetadata, + }) + }, nil +} + +// GenerateObject implements fantasy.LanguageModel. +func (l *languageModel) GenerateObject(ctx context.Context, call fantasy.ObjectCall) (*fantasy.ObjectResponse, error) { + switch l.objectMode { + case fantasy.ObjectModeText: + return object.GenerateWithText(ctx, l, call) + + case fantasy.ObjectModeTool: + return object.GenerateWithTool(ctx, l, call) + + default: + return object.GenerateWithTool(ctx, l, call) + } +} + +// StreamObject implements fantasy.LanguageModel. +func (l *languageModel) StreamObject(ctx context.Context, call fantasy.ObjectCall) (fantasy.ObjectStreamResponse, error) { + switch l.objectMode { + case fantasy.ObjectModeTool: + return object.StreamWithTool(ctx, l, call) + + case fantasy.ObjectModeText: + return object.StreamWithText(ctx, l, call) + + default: + return object.StreamWithTool(ctx, l, call) + } +} + +func toKronkTools(tools []fantasy.Tool) ([]model.D, []fantasy.CallWarning) { + var kronkTools []model.D + var warnings []fantasy.CallWarning + + for _, tool := range tools { + if tool.GetType() == fantasy.ToolTypeFunction { + ft, ok := tool.(fantasy.FunctionTool) + if !ok { + continue + } + + kronkTools = append(kronkTools, model.D{ + "type": "function", + "function": model.D{ + "name": ft.Name, + "description": ft.Description, + "parameters": ft.InputSchema, + }, + }) + + continue + } + + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeUnsupportedTool, + Tool: tool, + Message: "tool is not supported", + }) + } + + return kronkTools, warnings +} + +func toProviderErr(err error) error { + if err == nil { + return nil + } + + if errors.Is(err, io.EOF) { + return nil + } + + return &fantasy.ProviderError{ + Title: "kronk error", + Message: err.Error(), + Cause: err, + } +} diff --git a/providers/kronk/language_model_hooks.go b/providers/kronk/language_model_hooks.go new file mode 100644 index 000000000..a824f791d --- /dev/null +++ b/providers/kronk/language_model_hooks.go @@ -0,0 +1,269 @@ +package kronk + +import ( + "encoding/base64" + "fmt" + "strings" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +// LanguageModelPrepareCallFunc is a function that prepares the call for the language model. +type LanguageModelPrepareCallFunc func(lm fantasy.LanguageModel, d model.D, call fantasy.Call) ([]fantasy.CallWarning, error) + +// LanguageModelMapFinishReasonFunc is a function that maps the finish reason for the language model. +type LanguageModelMapFinishReasonFunc func(finishReason string) fantasy.FinishReason + +// LanguageModelToPromptFunc is a function that handles converting fantasy prompts to Kronk SDK messages. +type LanguageModelToPromptFunc func(prompt fantasy.Prompt, provider, modelID string) ([]model.D, []fantasy.CallWarning) + +// DefaultPrepareCallFunc is the default implementation for preparing a call to the language model. +func DefaultPrepareCallFunc(_ fantasy.LanguageModel, d model.D, call fantasy.Call) ([]fantasy.CallWarning, error) { + if call.ProviderOptions == nil { + return nil, nil + } + + var warnings []fantasy.CallWarning + providerOptions := &ProviderOptions{} + if v, ok := call.ProviderOptions[Name]; ok { + providerOptions, ok = v.(*ProviderOptions) + if !ok { + return nil, &fantasy.Error{Title: "invalid argument", Message: "kronk provider options should be *kronk.ProviderOptions"} + } + } + + if providerOptions.TopK != nil { + d["top_k"] = *providerOptions.TopK + } + + if providerOptions.RepeatPenalty != nil { + d["repeat_penalty"] = *providerOptions.RepeatPenalty + } + + if providerOptions.Seed != nil { + d["seed"] = *providerOptions.Seed + } + + if providerOptions.MinP != nil { + d["min_p"] = *providerOptions.MinP + } + + if providerOptions.NumPredict != nil { + d["num_predict"] = *providerOptions.NumPredict + } + + if providerOptions.Stop != nil { + d["stop"] = providerOptions.Stop + } + + return warnings, nil +} + +// DefaultMapFinishReasonFunc is the default implementation for mapping finish reasons. +func DefaultMapFinishReasonFunc(finishReason string) fantasy.FinishReason { + switch finishReason { + case string(model.FinishReasonStop): + return fantasy.FinishReasonStop + + case string(model.FinishReasonTool): + return fantasy.FinishReasonToolCalls + + case string(model.FinishReasonError): + return fantasy.FinishReasonError + + default: + return fantasy.FinishReasonUnknown + } +} + +// DefaultToPrompt is the default implementation for converting fantasy prompts to Kronk SDK messages. +func DefaultToPrompt(prompt fantasy.Prompt, _ string, _ string) ([]model.D, []fantasy.CallWarning) { + var messages []model.D + var warnings []fantasy.CallWarning + + for _, msg := range prompt { + switch msg.Role { + case fantasy.MessageRoleSystem: + for _, c := range msg.Content { + if c.GetType() == fantasy.ContentTypeText { + textPart, ok := fantasy.AsMessagePart[fantasy.TextPart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "system message text part does not have the right type", + }) + + continue + } + + messages = append(messages, model.TextMessage(model.RoleSystem, textPart.Text)) + } + } + + case fantasy.MessageRoleUser: + var content []model.D + for _, c := range msg.Content { + switch c.GetType() { + case fantasy.ContentTypeText: + textPart, ok := fantasy.AsMessagePart[fantasy.TextPart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "user message text part does not have the right type", + }) + + continue + } + + content = append(content, model.D{ + "type": "text", + "text": textPart.Text, + }) + + case fantasy.ContentTypeFile: + filePart, ok := fantasy.AsMessagePart[fantasy.FilePart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "user message file part does not have the right type", + }) + + continue + } + + switch { + case strings.HasPrefix(filePart.MediaType, "image/"): + base64Encoded := base64.StdEncoding.EncodeToString(filePart.Data) + data := "data:" + filePart.MediaType + ";base64," + base64Encoded + content = append(content, model.D{ + "type": "image_url", + "image_url": model.D{ + "url": data, + }, + }) + + default: + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("file part media type %s not supported", filePart.MediaType), + }) + } + } + } + + switch { + case len(content) == 1 && content[0]["type"] == "text": + messages = append(messages, model.TextMessage(model.RoleUser, content[0]["text"].(string))) + + case len(content) > 0: + messages = append(messages, model.D{ + "role": model.RoleUser, + "content": content, + }) + } + + case fantasy.MessageRoleAssistant: + var textContent string + var toolCalls []model.D + + for _, c := range msg.Content { + switch c.GetType() { + case fantasy.ContentTypeText: + textPart, ok := fantasy.AsMessagePart[fantasy.TextPart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "assistant message text part does not have the right type", + }) + + continue + } + + textContent += textPart.Text + + case fantasy.ContentTypeToolCall: + toolCallPart, ok := fantasy.AsMessagePart[fantasy.ToolCallPart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "assistant message tool part does not have the right type", + }) + + continue + } + + toolCalls = append(toolCalls, model.D{ + "id": toolCallPart.ToolCallID, + "type": "function", + "function": model.D{ + "name": toolCallPart.ToolName, + "arguments": toolCallPart.Input, + }, + }) + } + } + + assistantMsg := model.D{ + "role": model.RoleAssistant, + } + + if textContent != "" { + assistantMsg["content"] = textContent + } + + if len(toolCalls) > 0 { + assistantMsg["tool_calls"] = toolCalls + } + + if textContent != "" || len(toolCalls) > 0 { + messages = append(messages, assistantMsg) + } + + case fantasy.MessageRoleTool: + for _, c := range msg.Content { + if c.GetType() != fantasy.ContentTypeToolResult { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool message can only have tool result content", + }) + + continue + } + + toolResultPart, ok := fantasy.AsMessagePart[fantasy.ToolResultPart](c) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool message result part does not have the right type", + }) + + continue + } + + var resultContent string + switch toolResultPart.Output.GetType() { + case fantasy.ToolResultContentTypeText: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](toolResultPart.Output) + if ok { + resultContent = output.Text + } + + case fantasy.ToolResultContentTypeError: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](toolResultPart.Output) + if ok { + resultContent = output.Error.Error() + } + } + + messages = append(messages, model.D{ + "role": "tool", + "content": resultContent, + "tool_call_id": toolResultPart.ToolCallID, + }) + } + } + } + + return messages, warnings +} diff --git a/providers/kronk/options.go b/providers/kronk/options.go new file mode 100644 index 000000000..747920465 --- /dev/null +++ b/providers/kronk/options.go @@ -0,0 +1,71 @@ +package kronk + +import ( + "context" + "fmt" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +// Option defines a function that configures Kronk provider options. +type Option func(*options) + +// Logger is the function signature for logging download progress. +type Logger func(ctx context.Context, msg string, args ...any) + +type options struct { + name string + modelConfig model.Config + logger Logger + objectMode fantasy.ObjectMode + languageModelOptions []LanguageModelOption +} + +// WithName sets the name for the Kronk provider. +func WithName(name string) Option { + return func(o *options) { + o.name = name + } +} + +// WithModelConfig sets additional model configuration options. +func WithModelConfig(cfg model.Config) Option { + return func(o *options) { + o.modelConfig = cfg + } +} + +// WithLogger sets the logger function for download progress. +func WithLogger(logger Logger) Option { + return func(o *options) { + o.logger = logger + } +} + +// WithLanguageModelOptions sets the language model options for the Kronk provider. +func WithLanguageModelOptions(opts ...LanguageModelOption) Option { + return func(o *options) { + o.languageModelOptions = append(o.languageModelOptions, opts...) + } +} + +// WithObjectMode sets the object generation mode. +func WithObjectMode(om fantasy.ObjectMode) Option { + return func(o *options) { + o.objectMode = om + } +} + +// FmtLogger is a simple logger that prints to stdout using fmt.Printf. +func FmtLogger(_ context.Context, msg string, args ...any) { + fmt.Printf("%s:", msg) + + for i := 0; i < len(args); i += 2 { + if i+1 < len(args) { + fmt.Printf(" %v[%v]", args[i], args[i+1]) + } + } + + fmt.Println() +} diff --git a/providers/kronk/provider_options.go b/providers/kronk/provider_options.go new file mode 100644 index 000000000..217242ea4 --- /dev/null +++ b/providers/kronk/provider_options.go @@ -0,0 +1,104 @@ +package kronk + +import ( + "encoding/json" + + "charm.land/fantasy" +) + +// Global type identifiers for Kronk-specific provider data. +const ( + TypeProviderOptions = Name + ".options" + TypeProviderMetadata = Name + ".metadata" +) + +// Register Kronk provider-specific types with the global registry. +func init() { + fantasy.RegisterProviderType(TypeProviderOptions, func(data []byte) (fantasy.ProviderOptionsData, error) { + var v ProviderOptions + if err := json.Unmarshal(data, &v); err != nil { + return nil, err + } + return &v, nil + }) + + fantasy.RegisterProviderType(TypeProviderMetadata, func(data []byte) (fantasy.ProviderOptionsData, error) { + var v ProviderMetadata + if err := json.Unmarshal(data, &v); err != nil { + return nil, err + } + return &v, nil + }) +} + +// ProviderMetadata represents additional metadata from Kronk provider. +type ProviderMetadata struct { + TokensPerSecond float64 `json:"tokens_per_second"` + OutputTokens int64 `json:"output_tokens"` +} + +// Options implements the ProviderOptionsData interface. +func (*ProviderMetadata) Options() {} + +// MarshalJSON implements custom JSON marshaling with type info for ProviderMetadata. +func (m ProviderMetadata) MarshalJSON() ([]byte, error) { + type plain ProviderMetadata + return fantasy.MarshalProviderType(TypeProviderMetadata, plain(m)) +} + +// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderMetadata. +func (m *ProviderMetadata) UnmarshalJSON(data []byte) error { + type plain ProviderMetadata + var p plain + if err := fantasy.UnmarshalProviderType(data, &p); err != nil { + return err + } + *m = ProviderMetadata(p) + return nil +} + +// ProviderOptions represents additional options for Kronk provider. +type ProviderOptions struct { + TopK *int64 `json:"top_k"` + RepeatPenalty *float64 `json:"repeat_penalty"` + Seed *int64 `json:"seed"` + MinP *float64 `json:"min_p"` + NumPredict *int64 `json:"num_predict"` + Stop []string `json:"stop"` +} + +// Options implements the ProviderOptionsData interface. +func (*ProviderOptions) Options() {} + +// MarshalJSON implements custom JSON marshaling with type info for ProviderOptions. +func (o ProviderOptions) MarshalJSON() ([]byte, error) { + type plain ProviderOptions + return fantasy.MarshalProviderType(TypeProviderOptions, plain(o)) +} + +// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderOptions. +func (o *ProviderOptions) UnmarshalJSON(data []byte) error { + type plain ProviderOptions + var p plain + if err := fantasy.UnmarshalProviderType(data, &p); err != nil { + return err + } + *o = ProviderOptions(p) + return nil +} + +// NewProviderOptions creates new provider options for Kronk. +func NewProviderOptions(opts *ProviderOptions) fantasy.ProviderOptions { + return fantasy.ProviderOptions{ + Name: opts, + } +} + +// ParseOptions parses provider options from a map. +func ParseOptions(data map[string]any) (*ProviderOptions, error) { + var options ProviderOptions + if err := fantasy.ParseOptions(data, &options); err != nil { + return nil, err + } + return &options, nil +} diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 57bff08b5..7199154ef 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -948,7 +948,7 @@ func TestDoGenerate(t *testing.T) { result, err := model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - LogProbs: fantasy.Opt(true), + LogProbs: new(true), }), }) @@ -1069,8 +1069,8 @@ func TestDoGenerate(t *testing.T) { LogitBias: map[string]int64{ "50256": -100, }, - ParallelToolCalls: fantasy.Opt(false), - User: fantasy.Opt("test-user-id"), + ParallelToolCalls: new(false), + User: new("test-user-id"), }), }) @@ -1110,7 +1110,7 @@ func TestDoGenerate(t *testing.T) { Prompt: testPrompt, ProviderOptions: NewProviderOptions( &ProviderOptions{ - ReasoningEffort: ReasoningEffortOption(ReasoningEffortLow), + ReasoningEffort: new(ReasoningEffortLow), }, ), }) @@ -1150,7 +1150,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - TextVerbosity: fantasy.Opt("low"), + TextVerbosity: new("low"), }), }) @@ -1611,7 +1611,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - MaxCompletionTokens: fantasy.Opt(int64(255)), + MaxCompletionTokens: new(int64(255)), }), }) @@ -1695,7 +1695,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - Store: fantasy.Opt(true), + Store: new(true), }), }) @@ -1777,7 +1777,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - PromptCacheKey: fantasy.Opt("test-cache-key-123"), + PromptCacheKey: new("test-cache-key-123"), }), }) @@ -1816,7 +1816,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - SafetyIdentifier: fantasy.Opt("test-safety-identifier-123"), + SafetyIdentifier: new("test-safety-identifier-123"), }), }) @@ -1888,7 +1888,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("flex"), + ServiceTier: new("flex"), }), }) @@ -1925,7 +1925,7 @@ func TestDoGenerate(t *testing.T) { result, err := model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("flex"), + ServiceTier: new("flex"), }), }) @@ -1959,7 +1959,7 @@ func TestDoGenerate(t *testing.T) { _, err = model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("priority"), + ServiceTier: new("priority"), }), }) @@ -1996,7 +1996,7 @@ func TestDoGenerate(t *testing.T) { result, err := model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("priority"), + ServiceTier: new("priority"), }), }) @@ -2890,7 +2890,7 @@ func TestDoStream(t *testing.T) { _, err = model.Stream(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - Store: fantasy.Opt(true), + Store: new(true), }), }) @@ -2980,7 +2980,7 @@ func TestDoStream(t *testing.T) { _, err = model.Stream(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("flex"), + ServiceTier: new("flex"), }), }) @@ -3023,7 +3023,7 @@ func TestDoStream(t *testing.T) { _, err = model.Stream(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: NewProviderOptions(&ProviderOptions{ - ServiceTier: fantasy.Opt("priority"), + ServiceTier: new("priority"), }), }) @@ -4070,7 +4070,7 @@ func TestResponsesGenerate_StoreOption(t *testing.T) { Prompt: testPrompt, ProviderOptions: fantasy.ProviderOptions{ Name: &ResponsesProviderOptions{ - Store: fantasy.Opt(true), + Store: new(true), }, }, }) @@ -4094,8 +4094,8 @@ func TestResponsesGenerate_PreviousResponseIDOption(t *testing.T) { Prompt: testPrompt, ProviderOptions: fantasy.ProviderOptions{ Name: &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_prev_123"), - Store: fantasy.Opt(true), + PreviousResponseID: new("resp_prev_123"), + Store: new(true), }, }, }) @@ -4142,7 +4142,7 @@ func TestResponsesGenerate_StateChainingAcrossTurns(t *testing.T) { first, err := model.Generate(context.Background(), fantasy.Call{ Prompt: testPrompt, ProviderOptions: fantasy.ProviderOptions{ - Name: &ResponsesProviderOptions{Store: fantasy.Opt(true)}, + Name: &ResponsesProviderOptions{Store: new(true)}, }, }) require.NoError(t, err) @@ -4183,7 +4183,7 @@ func TestResponsesGenerate_StateChainingAcrossTurns(t *testing.T) { }, ProviderOptions: fantasy.ProviderOptions{ Name: &ResponsesProviderOptions{ - Store: fantasy.Opt(true), + Store: new(true), PreviousResponseID: &meta.ResponseID, }, }, @@ -5019,7 +5019,7 @@ func TestResponsesStream_StoreOption(t *testing.T) { Prompt: testPrompt, ProviderOptions: fantasy.ProviderOptions{ Name: &ResponsesProviderOptions{ - Store: fantasy.Opt(true), + Store: new(true), }, }, }) @@ -5052,8 +5052,8 @@ func TestResponsesStream_PreviousResponseIDOption(t *testing.T) { Prompt: testPrompt, ProviderOptions: fantasy.ProviderOptions{ Name: &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_prev_456"), - Store: fantasy.Opt(true), + PreviousResponseID: new("resp_prev_456"), + Store: new(true), }, }, }) diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index 27a64a6ef..0e5e8336f 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -150,8 +150,10 @@ func (o *ProviderFileOptions) UnmarshalJSON(data []byte) error { } // ReasoningEffortOption creates a pointer to a ReasoningEffort value. +// +//go:fix inline func ReasoningEffortOption(e ReasoningEffort) *ReasoningEffort { - return &e + return new(e) } // NewProviderOptions creates new provider options for OpenAI. diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 1680217e5..afbbdffea 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -1444,8 +1444,8 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( case "response.output_text.annotation.added": added := event.AsResponseOutputTextAnnotationAdded() // The Annotation field is typed as `any` in the SDK; - // it deserializes as map[string]interface{} from JSON. - annotationMap, ok := added.Annotation.(map[string]interface{}) + // it deserializes as map[string]any from JSON. + annotationMap, ok := added.Annotation.(map[string]any) if !ok { break } diff --git a/providers/openai/responses_params_test.go b/providers/openai/responses_params_test.go index 800eff6ba..94ea54fd7 100644 --- a/providers/openai/responses_params_test.go +++ b/providers/openai/responses_params_test.go @@ -22,12 +22,12 @@ func TestPrepareParams_Store(t *testing.T) { }{ { name: "store true", - opts: &ResponsesProviderOptions{Store: fantasy.Opt(true)}, + opts: &ResponsesProviderOptions{Store: new(true)}, wantStore: true, }, { name: "store false", - opts: &ResponsesProviderOptions{Store: fantasy.Opt(false)}, + opts: &ResponsesProviderOptions{Store: new(false)}, wantStore: false, }, { @@ -43,7 +43,6 @@ func TestPrepareParams_Store(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() @@ -66,8 +65,8 @@ func TestPrepareParams_PreviousResponseID(t *testing.T) { t.Parallel() params, warnings, err := lm.prepareParams(testCall(prompt, &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_abc123"), - Store: fantasy.Opt(true), + PreviousResponseID: new("resp_abc123"), + Store: new(true), })) require.NoError(t, err) require.Empty(t, warnings) @@ -88,7 +87,7 @@ func TestPrepareParams_PreviousResponseID(t *testing.T) { t.Parallel() params, warnings, err := lm.prepareParams(testCall(prompt, &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt(""), + PreviousResponseID: new(""), })) require.NoError(t, err) require.Empty(t, warnings) @@ -101,8 +100,8 @@ func TestPrepareParams_PreviousResponseID_Validation(t *testing.T) { lm := testResponsesLM() opts := &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_abc123"), - Store: fantasy.Opt(true), + PreviousResponseID: new("resp_abc123"), + Store: new(true), } t.Run("rejects with assistant messages", func(t *testing.T) { @@ -157,7 +156,7 @@ func TestPrepareParams_PreviousResponseID_Validation(t *testing.T) { _, _, err := lm.prepareParams(testCall(fantasy.Prompt{ testTextMessage(fantasy.MessageRoleUser, "hello"), }, &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_abc123"), + PreviousResponseID: new("resp_abc123"), })) require.EqualError(t, err, previousResponseIDStoreError) }) @@ -168,8 +167,8 @@ func TestPrepareParams_PreviousResponseID_Validation(t *testing.T) { _, _, err := lm.prepareParams(testCall(fantasy.Prompt{ testTextMessage(fantasy.MessageRoleUser, "hello"), }, &ResponsesProviderOptions{ - PreviousResponseID: fantasy.Opt("resp_abc123"), - Store: fantasy.Opt(false), + PreviousResponseID: new("resp_abc123"), + Store: new(false), })) require.EqualError(t, err, previousResponseIDStoreError) }) @@ -227,7 +226,6 @@ func TestValidatePreviousResponseIDPrompt(t *testing.T) { } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() @@ -306,16 +304,15 @@ func TestPrepareParams_SkipsProviderExecutedToolReferences(t *testing.T) { }{ { name: "store true", - opts: &ResponsesProviderOptions{Store: fantasy.Opt(true)}, + opts: &ResponsesProviderOptions{Store: new(true)}, }, { name: "store false", - opts: &ResponsesProviderOptions{Store: fantasy.Opt(false)}, + opts: &ResponsesProviderOptions{Store: new(false)}, }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index acb518e83..18218322f 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -446,10 +446,13 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta Usage: openrouterUsage, } + // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + return fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -481,10 +484,14 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] // we do this here because the acc does not add prompt details completionTokenDetails := usage.CompletionTokensDetails promptTokenDetails := usage.PromptTokensDetails + + // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + aiUsage := fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/openrouter/provider_options.go b/providers/openrouter/provider_options.go index a97a2658c..5ef7f9dd4 100644 --- a/providers/openrouter/provider_options.go +++ b/providers/openrouter/provider_options.go @@ -195,8 +195,10 @@ type ReasoningData struct { } // ReasoningEffortOption creates a pointer to a ReasoningEffort value for OpenRouter. +// +//go:fix inline func ReasoningEffortOption(e ReasoningEffort) *ReasoningEffort { - return &e + return new(e) } // NewProviderOptions creates new provider options for OpenRouter. diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index e3b829210..377dfd094 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -490,10 +490,13 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta Provider: provider, } + // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + return fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -521,10 +524,14 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] completionTokenDetails := usage.CompletionTokensDetails promptTokenDetails := usage.PromptTokensDetails + + // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. + inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + aiUsage := fantasy.Usage{ - InputTokens: usage.PromptTokens, + InputTokens: inputTokens, OutputTokens: usage.CompletionTokens, - TotalTokens: usage.TotalTokens, + TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/vercel/provider_options.go b/providers/vercel/provider_options.go index 046ba940d..f554c3f96 100644 --- a/providers/vercel/provider_options.go +++ b/providers/vercel/provider_options.go @@ -69,6 +69,8 @@ type GatewayProviderOptions struct { Order []string `json:"order,omitempty"` // Models is the list of fallback models to try if the primary model fails. Models []string `json:"models,omitempty"` + // ZeroDataRetention control whether zero data retention is enforced. + ZeroDataRetention *bool `json:"zeroDataRetention,omitempty"` } // BYOKCredential represents a single provider credential for BYOK. @@ -170,8 +172,10 @@ type ReasoningData struct { } // ReasoningEffortOption creates a pointer to a ReasoningEffort value. +// +//go:fix inline func ReasoningEffortOption(e ReasoningEffort) *ReasoningEffort { - return &e + return new(e) } // NewProviderOptions creates new provider options for Vercel. diff --git a/providertests/anthropic_test.go b/providertests/anthropic_test.go index 940ec477d..f0ee72667 100644 --- a/providertests/anthropic_test.go +++ b/providertests/anthropic_test.go @@ -177,7 +177,7 @@ func TestAnthropicWebSearch(t *testing.T) { result, err := agent.Generate(t.Context(), fantasy.AgentCall{ Prompt: "What is the current population of Tokyo? Cite your source.", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) @@ -222,7 +222,7 @@ func TestAnthropicWebSearch(t *testing.T) { // Turn 1: initial query triggers web search. result, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Prompt: "What is the current population of Tokyo? Cite your source.", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) @@ -266,7 +266,7 @@ func TestAnthropicWebSearch(t *testing.T) { result2, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Messages: history, Prompt: "How does that compare to Osaka?", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) diff --git a/providertests/azure_responses_test.go b/providertests/azure_responses_test.go index 8b3945ba4..b7c89084b 100644 --- a/providertests/azure_responses_test.go +++ b/providertests/azure_responses_test.go @@ -47,7 +47,7 @@ func TestAzureResponsesWithSummaryThinking(t *testing.T) { openai.IncludeReasoningEncryptedContent, }, ReasoningEffort: openai.ReasoningEffortOption(openai.ReasoningEffortHigh), - ReasoningSummary: fantasy.Opt("auto"), + ReasoningSummary: new("auto"), }, } var pairs []builderPair diff --git a/providertests/common_test.go b/providertests/common_test.go index 6878761ff..f13c93a92 100644 --- a/providertests/common_test.go +++ b/providertests/common_test.go @@ -70,7 +70,7 @@ func testSimple(t *testing.T, pair builderPair) { result, err := agent.Generate(t.Context(), fantasy.AgentCall{ Prompt: "Say hi in Portuguese", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") @@ -90,7 +90,7 @@ func testSimple(t *testing.T, pair builderPair) { result, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Prompt: "Say hi in Portuguese", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") @@ -149,7 +149,7 @@ func testTool(t *testing.T, pair builderPair) { result, err := agent.Generate(t.Context(), fantasy.AgentCall{ Prompt: "What's the weather in Florence,Italy?", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") @@ -170,7 +170,7 @@ func testTool(t *testing.T, pair builderPair) { result, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Prompt: "What's the weather in Florence,Italy?", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") @@ -255,7 +255,7 @@ func testMultiTool(t *testing.T, pair builderPair) { result, err := agent.Generate(t.Context(), fantasy.AgentCall{ Prompt: "Add and multiply the number 2 and 3", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") @@ -277,7 +277,7 @@ func testMultiTool(t *testing.T, pair builderPair) { result, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Prompt: "Add and multiply the number 2 and 3", ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), PrepareStep: pair.prepareStep, }) require.NoError(t, err, "failed to generate") diff --git a/providertests/google_test.go b/providertests/google_test.go index d49e13a2a..cbd9fec8b 100644 --- a/providertests/google_test.go +++ b/providertests/google_test.go @@ -41,8 +41,8 @@ func TestGoogleThinking(t *testing.T) { gemini2Opts := fantasy.ProviderOptions{ google.Name: &google.ProviderOptions{ ThinkingConfig: &google.ThinkingConfig{ - ThinkingBudget: fantasy.Opt(int64(100)), - IncludeThoughts: fantasy.Opt(true), + ThinkingBudget: new(int64(100)), + IncludeThoughts: new(true), }, }, } @@ -50,7 +50,7 @@ func TestGoogleThinking(t *testing.T) { google.Name: &google.ProviderOptions{ ThinkingConfig: &google.ThinkingConfig{ ThinkingLevel: fantasy.Opt(google.ThinkingLevelHigh), - IncludeThoughts: fantasy.Opt(true), + IncludeThoughts: new(true), }, }, } diff --git a/providertests/image_upload_test.go b/providertests/image_upload_test.go index cf7fad7ca..5ec3ea4f3 100644 --- a/providertests/image_upload_test.go +++ b/providertests/image_upload_test.go @@ -90,7 +90,7 @@ func TestImageUploadAgent(t *testing.T) { Prompt: "Describe the image briefly in English.", Files: []fantasy.FilePart{file}, ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) got := result.Response.Content.Text() @@ -136,7 +136,7 @@ func TestImageUploadAgentStreaming(t *testing.T) { Prompt: "Describe the image briefly in English.", Files: []fantasy.FilePart{file}, ProviderOptions: pair.providerOptions, - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) got := result.Response.Content.Text() diff --git a/providertests/object_test.go b/providertests/object_test.go index f5e9b791e..5a4c17e59 100644 --- a/providertests/object_test.go +++ b/providertests/object_test.go @@ -104,7 +104,7 @@ func testSimpleObject(t *testing.T, pair builderPair) { Schema: schema, SchemaName: "Person", SchemaDescription: "A person with name, age, and city", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), ProviderOptions: pair.providerOptions, }) require.NoError(t, err, "failed to generate object") @@ -127,7 +127,7 @@ func testSimpleObject(t *testing.T, pair builderPair) { Schema: schema, SchemaName: "Person", SchemaDescription: "A person with name, age, and city", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), ProviderOptions: pair.providerOptions, }) require.NoError(t, err, "failed to create object stream") @@ -277,7 +277,7 @@ func testComplexObject(t *testing.T, pair builderPair) { Schema: schema, SchemaName: "Book", SchemaDescription: "A book with title, author, genres, and publication year", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), ProviderOptions: pair.providerOptions, }) require.NoError(t, err, "failed to generate object") @@ -300,7 +300,7 @@ func testComplexObject(t *testing.T, pair builderPair) { Schema: schema, SchemaName: "Book", SchemaDescription: "A book with title, author, genres, and publication year", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), ProviderOptions: pair.providerOptions, }) require.NoError(t, err, "failed to create object stream") diff --git a/providertests/openai_responses_test.go b/providertests/openai_responses_test.go index db85f73d4..38ad7ea7a 100644 --- a/providertests/openai_responses_test.go +++ b/providertests/openai_responses_test.go @@ -40,7 +40,7 @@ func TestOpenAIResponsesWithSummaryThinking(t *testing.T) { openai.IncludeReasoningEncryptedContent, }, ReasoningEffort: openai.ReasoningEffortOption(openai.ReasoningEffortHigh), - ReasoningSummary: fantasy.Opt("auto"), + ReasoningSummary: new("auto"), }, } var pairs []builderPair diff --git a/providertests/openai_web_search_test.go b/providertests/openai_web_search_test.go index 1fe4418fa..8e8eb50e2 100644 --- a/providertests/openai_web_search_test.go +++ b/providertests/openai_web_search_test.go @@ -47,7 +47,7 @@ func TestOpenAIWebSearch(t *testing.T) { result, err := agent.Generate(t.Context(), fantasy.AgentCall{ Prompt: "What is the current population of Tokyo? Cite your source.", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) @@ -96,7 +96,7 @@ func TestOpenAIWebSearch(t *testing.T) { // Turn 1: initial query triggers web search. result, err := agent.Stream(t.Context(), fantasy.AgentStreamCall{ Prompt: "What is the current population of Tokyo? Cite your source.", - MaxOutputTokens: fantasy.Opt(int64(4000)), + MaxOutputTokens: new(int64(4000)), }) require.NoError(t, err) diff --git a/providertests/provider_registry_test.go b/providertests/provider_registry_test.go index 9340e50b6..c0f3f848e 100644 --- a/providertests/provider_registry_test.go +++ b/providertests/provider_registry_test.go @@ -20,7 +20,7 @@ func TestProviderRegistry_Serialization_OpenAIOptions(t *testing.T) { fantasy.TextPart{Text: "hi"}, }, ProviderOptions: fantasy.ProviderOptions{ - openai.Name: &openai.ProviderOptions{User: fantasy.Opt("tester")}, + openai.Name: &openai.ProviderOptions{User: new("tester")}, }, } @@ -60,8 +60,8 @@ func TestProviderRegistry_Serialization_OpenAIResponses(t *testing.T) { }, ProviderOptions: fantasy.ProviderOptions{ openai.Name: &openai.ResponsesProviderOptions{ - PromptCacheKey: fantasy.Opt("cache-key-1"), - ParallelToolCalls: fantasy.Opt(true), + PromptCacheKey: new("cache-key-1"), + ParallelToolCalls: new(true), }, }, } @@ -215,7 +215,7 @@ func TestProviderRegistry_Serialization_OpenRouterOptions(t *testing.T) { ProviderOptions: fantasy.ProviderOptions{ openrouter.Name: &openrouter.ProviderOptions{ IncludeUsage: &includeUsage, - User: fantasy.Opt("test-user"), + User: new("test-user"), }, }, } @@ -245,7 +245,7 @@ func TestProviderRegistry_Serialization_OpenAICompatOptions(t *testing.T) { }, ProviderOptions: fantasy.ProviderOptions{ openaicompat.Name: &openaicompat.ProviderOptions{ - User: fantasy.Opt("test-user"), + User: new("test-user"), ReasoningEffort: &effort, }, }, @@ -276,7 +276,7 @@ func TestProviderRegistry_MultiProvider(t *testing.T) { fantasy.TextPart{Text: "test"}, }, ProviderOptions: fantasy.ProviderOptions{ - openai.Name: &openai.ProviderOptions{User: fantasy.Opt("user1")}, + openai.Name: &openai.ProviderOptions{User: new("user1")}, anthropic.Name: &anthropic.ProviderOptions{ SendReasoning: &sendReasoning, }, diff --git a/schema/schema.go b/schema/schema.go index c1cc46d2b..92ccd7b34 100644 --- a/schema/schema.go +++ b/schema/schema.go @@ -122,8 +122,8 @@ func generateSchemaRecursive(t reflect.Type, visited map[reflect.Type]bool) Sche Type: "object", Properties: make(map[string]*Schema), } - for i := range t.NumField() { - field := t.Field(i) + for field := range t.Fields() { + field := field if !field.IsExported() { continue diff --git a/util.go b/util.go index 7bb9f48ff..74f02ede3 100644 --- a/util.go +++ b/util.go @@ -3,8 +3,10 @@ package fantasy import "github.com/go-viper/mapstructure/v2" // Opt creates a pointer to the given value. +// +//go:fix inline func Opt[T any](v T) *T { - return &v + return new(v) } // ParseOptions parses the given options map into the provided struct. From 0ceada310a21db1fd02c9d0861b7ab0a0d8932f0 Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Wed, 17 Jun 2026 04:51:04 +0000 Subject: [PATCH 95/95] fix(bedrock): mirror request region when prefixing inference profiles The cross-region inference-profile prefix for legacy (un-qualified) Bedrock model IDs is chosen from resolveRegion, which must match the region the inner Anthropic Bedrock provider actually signs the request for. The inner provider resolves that region two different ways depending on auth mode: - API key / skip-auth: cmp.Or(bedrockRegion, "us-east-1") via bedrockBasicAuthConfig; the default credential chain is never consulted, so AWS_DEFAULT_REGION, shared-config profiles, and IMDS are ignored. - default credential chain: cmp.Or(bedrockRegion, cfg.Region) from config.LoadDefaultConfig (AWS_REGION -> AWS_DEFAULT_REGION -> profile -> IMDS). Previously resolveRegion only consulted explicit/AWS_REGION, so on the default credential chain it computed us-east-1 (-> "us.") while the request targeted a region sourced from AWS_DEFAULT_REGION/profile/IMDS, producing a prefix/region mismatch that Bedrock rejects. Naively adding AWS_DEFAULT_REGION to resolveRegion would instead break the API-key path, which never consults those sources. Thread the auth mode (useDefaultChain) and context through normalizeModelID so the prefix mirrors the request region for both paths: the default chain now falls back to config.LoadDefaultConfig only when no explicit/AWS_REGION value is set, and the API-key/skip-auth path keeps its static us-east-1 default. --- providers/bedrock/bedrock.go | 17 +++++++++++++-- providers/bedrock/modelid.go | 36 +++++++++++++++++++++++++++---- providers/bedrock/modelid_test.go | 34 +++++++++++++++++++++++------ 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/providers/bedrock/bedrock.go b/providers/bedrock/bedrock.go index ab780a592..695174f18 100644 --- a/providers/bedrock/bedrock.go +++ b/providers/bedrock/bedrock.go @@ -14,12 +14,18 @@ import ( type options struct { region string skipAuth bool + hasAPIKey bool anthropicOptions []anthropic.Option } type provider struct { inner fantasy.Provider region string + // useDefaultChain reports whether the inner Anthropic Bedrock provider will + // resolve the request region via the AWS default credential chain (rather + // than the static API-key/skip-auth config). It mirrors the inner provider's + // auth-mode decision so model-ID region prefixing matches the request. + useDefaultChain bool } const ( @@ -57,7 +63,11 @@ func New(opts ...Option) (fantasy.Provider, error) { if err != nil { return nil, err } - return &provider{inner: inner, region: region}, nil + // Mirror the inner Anthropic Bedrock provider's auth-mode decision + // (skipAuth || apiKey != "") so legacy model-ID region prefixing resolves the + // region the same way the request is signed for. + useDefaultChain := !o.skipAuth && !o.hasAPIKey + return &provider{inner: inner, region: region, useDefaultChain: useDefaultChain}, nil } func (p *provider) Name() string { @@ -65,12 +75,15 @@ func (p *provider) Name() string { } func (p *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.LanguageModel, error) { - return p.inner.LanguageModel(ctx, normalizeModelID(modelID, p.region)) + return p.inner.LanguageModel(ctx, normalizeModelID(ctx, modelID, p.region, p.useDefaultChain)) } // WithAPIKey sets the access token for the Bedrock provider. func WithAPIKey(apiKey string) Option { return func(o *options) { + // Track the final auth mode (last write wins, matching the inner + // anthropic provider) so model-ID region resolution can mirror it. + o.hasAPIKey = apiKey != "" o.anthropicOptions = append(o.anthropicOptions, anthropic.WithAPIKey(apiKey)) } } diff --git a/providers/bedrock/modelid.go b/providers/bedrock/modelid.go index cc3100d8f..c974f1866 100644 --- a/providers/bedrock/modelid.go +++ b/providers/bedrock/modelid.go @@ -2,11 +2,14 @@ package bedrock import ( "cmp" + "context" "os" "strings" + + "github.com/aws/aws-sdk-go-v2/config" ) -func normalizeModelID(modelID, explicitRegion string) string { +func normalizeModelID(ctx context.Context, modelID, explicitRegion string, useDefaultChain bool) string { if modelID == "" { return modelID } @@ -16,11 +19,36 @@ func normalizeModelID(modelID, explicitRegion string) string { if !strings.HasPrefix(modelID, "anthropic.") { return modelID } - return regionInferenceProfilePrefix(resolveRegion(explicitRegion)) + modelID + return regionInferenceProfilePrefix(resolveRegion(ctx, explicitRegion, useDefaultChain)) + modelID } -func resolveRegion(explicitRegion string) string { - return cmp.Or(strings.TrimSpace(explicitRegion), strings.TrimSpace(os.Getenv("AWS_REGION")), "us-east-1") +// resolveRegion returns the region used to choose the cross-region +// inference-profile prefix for a legacy (un-qualified) Bedrock model ID. It must +// mirror the region the inner Anthropic Bedrock provider actually signs the +// request for, otherwise the prefix and the request target diverge and Bedrock +// rejects the call. +// +// The inner provider (see providers/anthropic/anthropic.go LanguageModel) +// resolves the request region differently depending on the auth mode: +// +// - API key / skip-auth: cmp.Or(bedrockRegion, "us-east-1") via +// bedrockBasicAuthConfig. The default credential chain is never consulted, +// so AWS_DEFAULT_REGION, shared-config profiles, and IMDS are ignored. +// - default credential chain: cmp.Or(bedrockRegion, cfg.Region) where +// cfg.Region comes from config.LoadDefaultConfig (AWS_REGION -> +// AWS_DEFAULT_REGION -> shared config profile -> IMDS). +// +// bedrockRegion above is the explicit WithRegion value or AWS_REGION. We only +// reach for the default credential chain when the caller actually relies on it; +// doing so on the API-key path would prefix for a region the request never uses. +func resolveRegion(ctx context.Context, explicitRegion string, useDefaultChain bool) string { + region := cmp.Or(strings.TrimSpace(explicitRegion), strings.TrimSpace(os.Getenv("AWS_REGION"))) + if region == "" && useDefaultChain { + if cfg, err := config.LoadDefaultConfig(ctx); err == nil { + region = strings.TrimSpace(cfg.Region) + } + } + return cmp.Or(region, "us-east-1") } func regionInferenceProfilePrefix(region string) string { diff --git a/providers/bedrock/modelid_test.go b/providers/bedrock/modelid_test.go index 80d6cf0da..3f5d2cd62 100644 --- a/providers/bedrock/modelid_test.go +++ b/providers/bedrock/modelid_test.go @@ -14,11 +14,13 @@ func TestNormalizeModelID(t *testing.T) { const legacyModel = "anthropic.claude-haiku-4-5-20251001-v1:0" tests := []struct { - name string - envRegion string - explicitRegion string - modelID string - want string + name string + envRegion string + defaultRegion string + explicitRegion string + useDefaultChain bool + modelID string + want string }{ { name: "qualified us passes through", @@ -80,6 +82,25 @@ func TestNormalizeModelID(t *testing.T) { modelID: legacyModel, want: "us." + legacyModel, }, + { + // On the default credential chain we mirror the inner provider's + // config.LoadDefaultConfig, which honours AWS_DEFAULT_REGION when + // AWS_REGION is unset. The prefix must follow the request region. + name: "default chain reads AWS_DEFAULT_REGION", + defaultRegion: "eu-west-1", + useDefaultChain: true, + modelID: legacyModel, + want: "eu." + legacyModel, + }, + { + // The API-key/skip-auth path uses bedrockBasicAuthConfig, which never + // consults the default chain, so AWS_DEFAULT_REGION must NOT influence + // the prefix (it would otherwise diverge from the signed region). + name: "api key path ignores AWS_DEFAULT_REGION", + defaultRegion: "eu-west-1", + modelID: legacyModel, + want: "us." + legacyModel, + }, { name: "non anthropic models pass through", modelID: "amazon.nova-pro-v1:0", @@ -96,7 +117,8 @@ func TestNormalizeModelID(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { t.Setenv("AWS_REGION", tt.envRegion) - require.Equal(t, tt.want, normalizeModelID(tt.modelID, tt.explicitRegion)) + t.Setenv("AWS_DEFAULT_REGION", tt.defaultRegion) + require.Equal(t, tt.want, normalizeModelID(t.Context(), tt.modelID, tt.explicitRegion, tt.useDefaultChain)) }) } }