diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 1595e87..11d89f5 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,18 +1,18 @@ lockVersion: 2.0.0 id: 9eea3e30-2722-4060-973b-57b7f1f75dc0 management: - docChecksum: a4856b1e808016b05e626a4211fa4836 + docChecksum: c050da62049642cf923daa8e729828b7 docVersion: 1.0.0 speakeasyVersion: 1.787.0 generationVersion: 2.914.0 - releaseVersion: 0.5.13 - configChecksum: ab397b01a76ca27839ba5d1bd39aa247 + releaseVersion: 0.5.14 + configChecksum: c92b7d7e51c3215679813d3e25c9ae74 repoURL: https://github.com/OpenRouterTeam/go-sdk.git installationURL: https://github.com/OpenRouterTeam/go-sdk persistentEdits: - generation_id: 226db354-eac5-4efa-bb7d-3daa6c0339d5 - pristine_commit_hash: 4d2fcceb45553f9bf1f52630c21f408bf504a058 - pristine_tree_hash: 75c84d9b5796ddb06f3c58bdc6a4344ca0d7d950 + generation_id: 096b20cb-f032-4ffa-9fdd-086fe507c38b + pristine_commit_hash: c10e6efea5f9eba795226daf0bd5ec7737428ed0 + pristine_tree_hash: 7b2d4bed6b0a245d4a8d1f55ad44041c450b3a81 features: go: acceptHeaders: 2.81.2 @@ -5253,6 +5253,22 @@ trackedFiles: id: 712e15346453 last_write_checksum: sha1:65871b7e693b715e99d93b54d1843537c2b9e888 pristine_git_object: 39f2fbf6affa3fd2e19f92968f61054fe71a7751 + docs/models/operations/classifierdimensions.mdx: + id: 0e13027e144d + last_write_checksum: sha1:7d26be647684087570cafc387bd7663805b153c5 + pristine_git_object: 6d7eb45a54b710920154fed7e76c95b263257698 + docs/models/operations/classifierfilters.mdx: + id: 7dcacabae6f4 + last_write_checksum: sha1:21f142c68d0eddd972620a8efa9d619bbf1ca4c1 + pristine_git_object: 27444c7ed3b29934c3b78023a2eafe14c1bec236 + docs/models/operations/classifierfiltersfilter.mdx: + id: "805837007825" + last_write_checksum: sha1:d475efa63b745f2e3def5f374a83ac7fa1555a62 + pristine_git_object: 3e1d7650916edd9017d19fdba0c1617db4c47e66 + docs/models/operations/classifierfiltersvalue.mdx: + id: eacff5c94b38 + last_write_checksum: sha1:bae7523e75d8edb8431d6fdad7f811ff953fce3e + pristine_git_object: 54ff9545e7ba8b8e4c1e76a6e310ab67ec0396d2 docs/models/operations/content.mdx: id: 3885c021e578 last_write_checksum: sha1:d0aceb45ff8cb9b61a0faebc658e64517e943ba2 @@ -5843,8 +5859,8 @@ trackedFiles: pristine_git_object: 659d18b72ce69dc25154b5cf55e1263af9e3f60f docs/models/operations/queryanalyticsrequest.mdx: id: 50fcaf5b025e - last_write_checksum: sha1:feaa0e510900fc0077efae83cc56c53d857f60e0 - pristine_git_object: 8ad86667db7e7d616597def9707dcce02e8ebbe7 + last_write_checksum: sha1:1c495c3b7bef1271690b5070474726bfb3c02df0 + pristine_git_object: 8d6ace3112333960951ccae0b977d350515b311a docs/models/operations/queryanalyticsresponse.mdx: id: a18e01100431 last_write_checksum: sha1:a2ff32188d201b1639f8b7a78593cce56ed77630 @@ -5969,6 +5985,10 @@ trackedFiles: id: 0888b2d6aa69 last_write_checksum: sha1:efa8053a39967602bfb1b215ea99d0a587c4a4eb pristine_git_object: d49671626c7db20101e9244c8654915246316046 + docs/models/operations/valueclassifierfilters.mdx: + id: e1cf822fc2d4 + last_write_checksum: sha1:1e6cfaa6cfbd4a695200eea3ace4c533af1c8158 + pristine_git_object: 794e16250e8ce6aece37d3b89f928a9889dd7ad7 docs/models/operations/valuetype.mdx: id: 33042f33bbd6 last_write_checksum: sha1:c2e724a77717cc21744da7b84a3021f3e9e218e4 @@ -8715,8 +8735,8 @@ trackedFiles: pristine_git_object: 8003a65d349c0b5b3c17fe2727ae857157e437b2 models/operations/queryanalytics.go: id: 988cd2db88c0 - last_write_checksum: sha1:c31b906edf5ec2c62a413e206359818051881f28 - pristine_git_object: 1f0da2df36153104274dc17fa6724694b4f74c1f + last_write_checksum: sha1:b324fc552de581215c15e0b7f37bfe69283aba62 + pristine_git_object: 9e02c3ae41008679ef5fa366386252a37ac67ffc models/operations/sendchatcompletionrequest.go: id: 9da92c1f7b53 last_write_checksum: sha1:71b2e7bd747a68d78fbc663d101b0f037e608759 @@ -8823,8 +8843,8 @@ trackedFiles: pristine_git_object: 3dc1d1bf3c5e7387b73f1bbb0b6b456dd5e7ee9d openrouter.go: id: 207ad004b774 - last_write_checksum: sha1:b6425e7aa6186f50f549fe7a1568627475132710 - pristine_git_object: b730a7764113205898c19e64dc71bb7e7b5f3e40 + last_write_checksum: sha1:bf3cc0edd8b972df0b92a77db5bd502c30affe48 + pristine_git_object: 850475ebdbd1ea2fed2d23ddb9ff589ddf13f687 optionalnullable/optionalnullable.go: id: ce60f259ead3 last_write_checksum: sha1:d6aff1a420c31e025ea21d46cf056e305ae76fe8 @@ -10394,4 +10414,6 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 -releaseNotes: "## Go SDK Changes:\n* `OpenRouter.Byok.Update()`: `response.Data.Provider` **Changed** (Breaking ⚠️)\n* `OpenRouter.Datasets.GetRankingsDaily()`: `request` **Changed** (Breaking ⚠️)\n* `OpenRouter.Beta.Responses.Send()`: \n * `request.ResponsesRequest` **Changed** (Breaking ⚠️)\n * `response` **Changed** (Breaking ⚠️)\n* `OpenRouter.Tts.CreateSpeech()`: \n * `request.Request.Provider.Options` **Changed** (Breaking ⚠️)\n* `OpenRouter.Stt.CreateTranscription()`: \n * `request.Request` **Changed** (Breaking ⚠️)\n * `response` **Changed**\n* `OpenRouter.Byok.List()`: \n * `request.Provider` **Changed** (Breaking ⚠️)\n * `response.Data[].Provider` **Changed** (Breaking ⚠️)\n* `OpenRouter.Byok.Create()`: \n * `request.Request.Provider` **Changed** (Breaking ⚠️)\n * `response.Data.Provider` **Changed** (Breaking ⚠️)\n* `OpenRouter.Byok.Get()`: `response.Data.Provider` **Changed** (Breaking ⚠️)\n* `OpenRouter.VideoGeneration.Generate()`: \n * `request.Request.Provider.Options` **Changed** (Breaking ⚠️)\n* `OpenRouter.Presets.CreatePresetsResponses()`: `request.ResponsesRequest` **Changed** (Breaking ⚠️)\n* `OpenRouter.Images.Generate()`: \n * `request.Request.Provider.Options` **Changed** (Breaking ⚠️)\n * `response.[].Data.union(image_generation.text_chunk)` **Added**\n * `error.status[413]` **Added**\n* `OpenRouter.Generations.GetGeneration()`: `response.Data.ProviderResponses[].RoutedServiceTier` **Added**\n* `OpenRouter.Chat.Send()`: \n * `request.ChatRequest` **Changed**\n * `response` **Changed**\n* `OpenRouter.Models.List()`: `request.Request` **Changed**\n* `OpenRouter.Presets.CreatePresetsChatCompletions()`: `request.ChatRequest` **Changed**\n* `OpenRouter.Presets.CreatePresetsMessages()`: \n * `request.MessagesRequest.Plugins[].union(pareto-router).PriceSource` **Added**\n* `OpenRouter.Stt.CreateTranscriptionMultipart()`: **Added**\n* `OpenRouter.Generations.SubmitFeedback()`: **Added**\n" +releaseNotes: | + ## Go SDK Changes: + * `OpenRouter.Beta.Analytics.QueryAnalytics()`: `request.Request` **Changed** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 625c1a8..09eb4f3 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -36,7 +36,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true go: - version: 0.5.13 + version: 0.5.14 additionalDependencies: {} baseErrorName: OpenRouterError clientServerStatusCodesAsErrors: true diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 16e41f6..ca5fc2a 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -23878,6 +23878,78 @@ paths: start: '2025-01-01T00:00:00Z' schema: properties: + classifier_dimensions: + description: >- + Group results by custom classifier tags, breaking down metrics by the specified dimension values. Requires an active classifier on the workspace. + properties: + classifier_id: + description: UUID of the classifier whose tags to group by. + example: 550e8400-e29b-41d4-a716-446655440000 + format: uuid + type: string + dimension_names: + items: + description: >- + Classifier dimension name (snake_case identifier). When exactly one name is provided, the response uses it as the column key; with multiple names or none, the response uses `clf_dimension_name`/`clf_dimension_value` columns. + example: department + type: string + maxItems: 10 + type: array + include_nulls: + description: >- + When true, also include generations that have no tag from this classifier. Defaults to false, which returns only classified generations. + type: boolean + required: + - classifier_id + type: object + classifier_filters: + description: >- + Filter results to generations with specific classifier tag values. Can be combined with classifier_dimensions (must use the same classifier_id) or used independently with standard dimensions. + properties: + classifier_id: + description: >- + UUID of the classifier whose tags to filter by. Must match classifier_dimensions.classifier_id when both are specified. + example: 550e8400-e29b-41d4-a716-446655440000 + format: uuid + type: string + filters: + items: + properties: + field: + description: >- + Classifier dimension name to filter on (snake_case identifier, e.g. "department", "work_type"). + example: department + type: string + operator: + description: >- + Filter operator. Only equality/set operators are supported (eq, neq, in, not_in) — ordered comparisons are not available because classification values are strings. + example: eq + type: string + value: + anyOf: + - type: string + - format: double + type: number + - items: + anyOf: + - type: string + - format: double + type: number + type: array + description: Filter value. Use a scalar (string or number) for eq/neq, or an array for in/not_in. + example: Engineering + required: + - field + - operator + - value + type: object + maxItems: 10 + minItems: 1 + type: array + required: + - classifier_id + - filters + type: object dimensions: items: description: Dimension to group by (up to 2). Use the /meta endpoint for available dimensions. diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 914b5a1..1507218 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,8 +2,8 @@ speakeasyVersion: 1.787.0 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:28804b43e74c65b0de7086a3117a905af102d151b16136cbb3447f61f9a65715 - sourceBlobDigest: sha256:4177479c5d051e87aa544e3ab1b73f7bb8d932572926340e3546fbd14208066b + sourceRevisionDigest: sha256:ab65ae6a6a56ca31121446556eb45dd872551d99c50d2d98cef495b531db8175 + sourceBlobDigest: sha256:3776627eace307c1391fa34cb579a23fd8df3daa4cf1293549db53f231cd45d0 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: openrouter: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:28804b43e74c65b0de7086a3117a905af102d151b16136cbb3447f61f9a65715 - sourceBlobDigest: sha256:4177479c5d051e87aa544e3ab1b73f7bb8d932572926340e3546fbd14208066b + sourceRevisionDigest: sha256:ab65ae6a6a56ca31121446556eb45dd872551d99c50d2d98cef495b531db8175 + sourceBlobDigest: sha256:3776627eace307c1391fa34cb579a23fd8df3daa4cf1293549db53f231cd45d0 codeSamplesNamespace: open-router-chat-completions-api-go-code-samples - codeSamplesRevisionDigest: sha256:4b8ab998dc76253e129002029fe0d77f0a987267857636bd7f2ea776acac2103 + codeSamplesRevisionDigest: sha256:26bb8423fa2b942936d039a5b16a0c3ae74e4f85ca2f716bbe71dba8f0aeeb18 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.787.0 diff --git a/OVERVIEW.md b/OVERVIEW.md index dd7caba..8c2eb61 100644 --- a/OVERVIEW.md +++ b/OVERVIEW.md @@ -117,7 +117,7 @@ go get github.com/OpenRouterTeam/go-sdk For beta releases, pin an explicit version: ```bash -go get github.com/OpenRouterTeam/go-sdk@v0.5.13 +go get github.com/OpenRouterTeam/go-sdk@v0.5.14 ``` **Requirements:** Go 1.25 or higher diff --git a/README.md b/README.md index d1c58c2..8ce681d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ To learn more, see the [API Reference](https://openrouter.ai/docs/sdks/go/api-re > This SDK is in **beta**. Pin to a specific version to avoid unexpected breaking changes: > > ```bash -> go get github.com/OpenRouterTeam/go-sdk@v0.5.13 +> go get github.com/OpenRouterTeam/go-sdk@v0.5.14 > ``` diff --git a/RELEASES.md b/RELEASES.md index e53d927..a97ab19 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -178,4 +178,14 @@ Based on: ### Generated - [go v0.5.13] . ### Releases -- [Go v0.5.13] https://github.com/OpenRouterTeam/go-sdk/releases/tag/v0.5.13 - . \ No newline at end of file +- [Go v0.5.13] https://github.com/OpenRouterTeam/go-sdk/releases/tag/v0.5.13 - . + +## 2026-07-10 20:13:50 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v0.5.14] . +### Releases +- [Go v0.5.14] https://github.com/OpenRouterTeam/go-sdk/releases/tag/v0.5.14 - . \ No newline at end of file diff --git a/doc.go b/doc.go index d699a2a..0ca94c1 100644 --- a/doc.go +++ b/doc.go @@ -6,7 +6,7 @@ provider selection, and unified billing. This SDK is in beta. Pin to a specific module version to avoid unexpected breaking changes: - go get github.com/OpenRouterTeam/go-sdk@v0.5.13 + go get github.com/OpenRouterTeam/go-sdk@v0.5.14 For full API documentation, visit: https://openrouter.ai/docs/client-sdks/go/overview diff --git a/docs/models/operations/classifierdimensions.mdx b/docs/models/operations/classifierdimensions.mdx new file mode 100644 index 0000000..6d7eb45 --- /dev/null +++ b/docs/models/operations/classifierdimensions.mdx @@ -0,0 +1,14 @@ +--- +title: "ClassifierDimensions" +--- + +Group results by custom classifier tags, breaking down metrics by the specified dimension values. Requires an active classifier on the workspace. + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `ClassifierID` | `string` | :heavy_check_mark: | UUID of the classifier whose tags to group by. | 550e8400-e29b-41d4-a716-446655440000 | +| `DimensionNames` | []`string` | :heavy_minus_sign: | N/A | | +| `IncludeNulls` | `*bool` | :heavy_minus_sign: | When true, also include generations that have no tag from this classifier. Defaults to false, which returns only classified generations. | | \ No newline at end of file diff --git a/docs/models/operations/classifierfilters.mdx b/docs/models/operations/classifierfilters.mdx new file mode 100644 index 0000000..27444c7 --- /dev/null +++ b/docs/models/operations/classifierfilters.mdx @@ -0,0 +1,13 @@ +--- +title: "ClassifierFilters" +--- + +Filter results to generations with specific classifier tag values. Can be combined with classifier_dimensions (must use the same classifier_id) or used independently with standard dimensions. + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| `ClassifierID` | `string` | :heavy_check_mark: | UUID of the classifier whose tags to filter by. Must match classifier_dimensions.classifier_id when both are specified. | 550e8400-e29b-41d4-a716-446655440000 | +| `Filters` | [][operations.ClassifierFiltersFilter](../../models/operations/classifierfiltersfilter.mdx) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/classifierfiltersfilter.mdx b/docs/models/operations/classifierfiltersfilter.mdx new file mode 100644 index 0000000..3e1d765 --- /dev/null +++ b/docs/models/operations/classifierfiltersfilter.mdx @@ -0,0 +1,11 @@ +--- +title: "ClassifierFiltersFilter" +--- + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Field` | `string` | :heavy_check_mark: | Classifier dimension name to filter on (snake_case identifier, e.g. "department", "work_type"). | department | +| `Operator` | `string` | :heavy_check_mark: | Filter operator. Only equality/set operators are supported (eq, neq, in, not_in) — ordered comparisons are not available because classification values are strings. | eq | +| `Value` | [operations.ClassifierFiltersValue](../../models/operations/classifierfiltersvalue.mdx) | :heavy_check_mark: | Filter value. Use a scalar (string or number) for eq/neq, or an array for in/not_in. | Engineering | \ No newline at end of file diff --git a/docs/models/operations/classifierfiltersvalue.mdx b/docs/models/operations/classifierfiltersvalue.mdx new file mode 100644 index 0000000..54ff954 --- /dev/null +++ b/docs/models/operations/classifierfiltersvalue.mdx @@ -0,0 +1,41 @@ +--- +title: "ClassifierFiltersValue" +--- + +Filter value. Use a scalar (string or number) for eq/neq, or an array for in/not_in. + + +## Supported Types + +### + +```go +classifierFiltersValue := operations.CreateClassifierFiltersValueStr(string{/* values here */}) +``` + +### + +```go +classifierFiltersValue := operations.CreateClassifierFiltersValueNumber(float64{/* values here */}) +``` + +### + +```go +classifierFiltersValue := operations.CreateClassifierFiltersValueArrayOfValueClassifierFilters([]operations.ValueClassifierFilters{/* values here */}) +``` + +## Union Discrimination + +Use the `Type` field to determine which variant is active, then access the corresponding field: + +```go +switch classifierFiltersValue.Type { + case operations.ClassifierFiltersValueTypeStr: + // classifierFiltersValue.Str is populated + case operations.ClassifierFiltersValueTypeNumber: + // classifierFiltersValue.Number is populated + case operations.ClassifierFiltersValueTypeArrayOfValueClassifierFilters: + // classifierFiltersValue.ArrayOfValueClassifierFilters is populated +} +``` diff --git a/docs/models/operations/queryanalyticsrequest.mdx b/docs/models/operations/queryanalyticsrequest.mdx index 8ad8666..8d6ace3 100644 --- a/docs/models/operations/queryanalyticsrequest.mdx +++ b/docs/models/operations/queryanalyticsrequest.mdx @@ -6,6 +6,8 @@ title: "QueryAnalyticsRequest" | Field | Type | Required | Description | Example | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ClassifierDimensions` | [*operations.ClassifierDimensions](../../models/operations/classifierdimensions.mdx) | :heavy_minus_sign: | Group results by custom classifier tags, breaking down metrics by the specified dimension values. Requires an active classifier on the workspace. | | +| `ClassifierFilters` | [*operations.ClassifierFilters](../../models/operations/classifierfilters.mdx) | :heavy_minus_sign: | Filter results to generations with specific classifier tag values. Can be combined with classifier_dimensions (must use the same classifier_id) or used independently with standard dimensions. | | | `Dimensions` | []`string` | :heavy_minus_sign: | N/A | | | `Filters` | [][operations.Filter](../../models/operations/filter.mdx) | :heavy_minus_sign: | N/A | | | `Granularity` | `*string` | :heavy_minus_sign: | Time granularity | day | diff --git a/docs/models/operations/valueclassifierfilters.mdx b/docs/models/operations/valueclassifierfilters.mdx new file mode 100644 index 0000000..794e162 --- /dev/null +++ b/docs/models/operations/valueclassifierfilters.mdx @@ -0,0 +1,30 @@ +--- +title: "ValueClassifierFilters" +--- + +## Supported Types + +### + +```go +valueClassifierFilters := operations.CreateValueClassifierFiltersStr(string{/* values here */}) +``` + +### + +```go +valueClassifierFilters := operations.CreateValueClassifierFiltersNumber(float64{/* values here */}) +``` + +## Union Discrimination + +Use the `Type` field to determine which variant is active, then access the corresponding field: + +```go +switch valueClassifierFilters.Type { + case operations.ValueClassifierFiltersTypeStr: + // valueClassifierFilters.Str is populated + case operations.ValueClassifierFiltersTypeNumber: + // valueClassifierFilters.Number is populated +} +``` diff --git a/example_test.go b/example_test.go index 0de5e00..8e5ec8d 100644 --- a/example_test.go +++ b/example_test.go @@ -18,7 +18,7 @@ func ExampleNew() { openrouter.WithSecurity("your-api-key"), ) fmt.Println(sdk.SDKVersion) - // Output: 0.5.13 + // Output: 0.5.14 } // Example demonstrates basic usage of the OpenRouter SDK for chat completions. diff --git a/examples/README.md b/examples/README.md index b1c05d8..8dfe0b5 100644 --- a/examples/README.md +++ b/examples/README.md @@ -43,7 +43,7 @@ cd ../generation && go run . Each example pins a released SDK version in `go.mod`: ```go -require github.com/OpenRouterTeam/go-sdk v0.5.13 +require github.com/OpenRouterTeam/go-sdk v0.5.14 ``` This should match the version in [README.md](../README.md) and `.speakeasy/gen.lock` `releaseVersion`. CI runs `scripts/bump-examples.sh` after releases to keep these in sync. @@ -51,7 +51,7 @@ This should match the version in [README.md](../README.md) and `.speakeasy/gen.l To use a different version: ```bash -go get github.com/OpenRouterTeam/go-sdk@v0.5.13 +go get github.com/OpenRouterTeam/go-sdk@v0.5.14 go run . ``` diff --git a/models/operations/queryanalytics.go b/models/operations/queryanalytics.go index 1f0da2d..9e02c3a 100644 --- a/models/operations/queryanalytics.go +++ b/models/operations/queryanalytics.go @@ -9,6 +9,303 @@ import ( "time" ) +// ClassifierDimensions - Group results by custom classifier tags, breaking down metrics by the specified dimension values. Requires an active classifier on the workspace. +type ClassifierDimensions struct { + // UUID of the classifier whose tags to group by. + ClassifierID string `json:"classifier_id"` + DimensionNames []string `json:"dimension_names,omitzero"` + // When true, also include generations that have no tag from this classifier. Defaults to false, which returns only classified generations. + IncludeNulls *bool `json:"include_nulls,omitzero"` +} + +func (c ClassifierDimensions) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(c, "", false) +} + +func (c *ClassifierDimensions) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &c, "", false, nil); err != nil { + return err + } + return nil +} + +func (c *ClassifierDimensions) GetClassifierID() string { + if c == nil { + return "" + } + return c.ClassifierID +} + +func (c *ClassifierDimensions) GetDimensionNames() []string { + if c == nil { + return nil + } + return c.DimensionNames +} + +func (c *ClassifierDimensions) GetIncludeNulls() *bool { + if c == nil { + return nil + } + return c.IncludeNulls +} + +type ValueClassifierFiltersType string + +const ( + ValueClassifierFiltersTypeStr ValueClassifierFiltersType = "str" + ValueClassifierFiltersTypeNumber ValueClassifierFiltersType = "number" +) + +type ValueClassifierFilters struct { + Str *string `queryParam:"inline" union:"member"` + Number *float64 `queryParam:"inline" union:"member"` + + Type ValueClassifierFiltersType +} + +func CreateValueClassifierFiltersStr(str string) ValueClassifierFilters { + typ := ValueClassifierFiltersTypeStr + + return ValueClassifierFilters{ + Str: &str, + Type: typ, + } +} + +func CreateValueClassifierFiltersNumber(number float64) ValueClassifierFilters { + typ := ValueClassifierFiltersTypeNumber + + return ValueClassifierFilters{ + Number: &number, + Type: typ, + } +} + +func (u *ValueClassifierFilters) UnmarshalJSON(data []byte) error { + + var candidates []utils.UnionCandidate + + // Collect all valid candidates + var str string = "" + if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil { + candidates = append(candidates, utils.UnionCandidate{ + Type: ValueClassifierFiltersTypeStr, + Value: &str, + }) + } + + var number float64 = float64(0) + if err := utils.UnmarshalJSON(data, &number, "", true, nil); err == nil { + candidates = append(candidates, utils.UnionCandidate{ + Type: ValueClassifierFiltersTypeNumber, + Value: &number, + }) + } + + if len(candidates) == 0 { + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ValueClassifierFilters", string(data)) + } + + // Pick the best candidate using multi-stage filtering + best := utils.PickBestUnionCandidate(candidates, data) + if best == nil { + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ValueClassifierFilters", string(data)) + } + + // Set the union type and value based on the best candidate + u.Type = best.Type.(ValueClassifierFiltersType) + switch best.Type { + case ValueClassifierFiltersTypeStr: + u.Str = best.Value.(*string) + return nil + case ValueClassifierFiltersTypeNumber: + u.Number = best.Value.(*float64) + return nil + } + + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ValueClassifierFilters", string(data)) +} + +func (u ValueClassifierFilters) MarshalJSON() ([]byte, error) { + if u.Str != nil { + return utils.MarshalJSON(u.Str, "", true) + } + + if u.Number != nil { + return utils.MarshalJSON(u.Number, "", true) + } + + return nil, errors.New("could not marshal union type ValueClassifierFilters: all fields are null") +} + +type ClassifierFiltersValueType string + +const ( + ClassifierFiltersValueTypeStr ClassifierFiltersValueType = "str" + ClassifierFiltersValueTypeNumber ClassifierFiltersValueType = "number" + ClassifierFiltersValueTypeArrayOfValueClassifierFilters ClassifierFiltersValueType = "arrayOfValueClassifierFilters" +) + +// ClassifierFiltersValue - Filter value. Use a scalar (string or number) for eq/neq, or an array for in/not_in. +type ClassifierFiltersValue struct { + Str *string `queryParam:"inline" union:"member"` + Number *float64 `queryParam:"inline" union:"member"` + ArrayOfValueClassifierFilters []ValueClassifierFilters `queryParam:"inline" union:"member"` + + Type ClassifierFiltersValueType +} + +func CreateClassifierFiltersValueStr(str string) ClassifierFiltersValue { + typ := ClassifierFiltersValueTypeStr + + return ClassifierFiltersValue{ + Str: &str, + Type: typ, + } +} + +func CreateClassifierFiltersValueNumber(number float64) ClassifierFiltersValue { + typ := ClassifierFiltersValueTypeNumber + + return ClassifierFiltersValue{ + Number: &number, + Type: typ, + } +} + +func CreateClassifierFiltersValueArrayOfValueClassifierFilters(arrayOfValueClassifierFilters []ValueClassifierFilters) ClassifierFiltersValue { + typ := ClassifierFiltersValueTypeArrayOfValueClassifierFilters + + return ClassifierFiltersValue{ + ArrayOfValueClassifierFilters: arrayOfValueClassifierFilters, + Type: typ, + } +} + +func (u *ClassifierFiltersValue) UnmarshalJSON(data []byte) error { + + var candidates []utils.UnionCandidate + + // Collect all valid candidates + var str string = "" + if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil { + candidates = append(candidates, utils.UnionCandidate{ + Type: ClassifierFiltersValueTypeStr, + Value: &str, + }) + } + + var number float64 = float64(0) + if err := utils.UnmarshalJSON(data, &number, "", true, nil); err == nil { + candidates = append(candidates, utils.UnionCandidate{ + Type: ClassifierFiltersValueTypeNumber, + Value: &number, + }) + } + + var arrayOfValueClassifierFilters []ValueClassifierFilters = []ValueClassifierFilters{} + if err := utils.UnmarshalJSON(data, &arrayOfValueClassifierFilters, "", true, nil); err == nil { + candidates = append(candidates, utils.UnionCandidate{ + Type: ClassifierFiltersValueTypeArrayOfValueClassifierFilters, + Value: arrayOfValueClassifierFilters, + }) + } + + if len(candidates) == 0 { + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ClassifierFiltersValue", string(data)) + } + + // Pick the best candidate using multi-stage filtering + best := utils.PickBestUnionCandidate(candidates, data) + if best == nil { + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ClassifierFiltersValue", string(data)) + } + + // Set the union type and value based on the best candidate + u.Type = best.Type.(ClassifierFiltersValueType) + switch best.Type { + case ClassifierFiltersValueTypeStr: + u.Str = best.Value.(*string) + return nil + case ClassifierFiltersValueTypeNumber: + u.Number = best.Value.(*float64) + return nil + case ClassifierFiltersValueTypeArrayOfValueClassifierFilters: + u.ArrayOfValueClassifierFilters = best.Value.([]ValueClassifierFilters) + return nil + } + + return fmt.Errorf("could not unmarshal `%s` into any supported union types for ClassifierFiltersValue", string(data)) +} + +func (u ClassifierFiltersValue) MarshalJSON() ([]byte, error) { + if u.Str != nil { + return utils.MarshalJSON(u.Str, "", true) + } + + if u.Number != nil { + return utils.MarshalJSON(u.Number, "", true) + } + + if u.ArrayOfValueClassifierFilters != nil { + return utils.MarshalJSON(u.ArrayOfValueClassifierFilters, "", true) + } + + return nil, errors.New("could not marshal union type ClassifierFiltersValue: all fields are null") +} + +type ClassifierFiltersFilter struct { + // Classifier dimension name to filter on (snake_case identifier, e.g. "department", "work_type"). + Field string `json:"field"` + // Filter operator. Only equality/set operators are supported (eq, neq, in, not_in) — ordered comparisons are not available because classification values are strings. + Operator string `json:"operator"` + // Filter value. Use a scalar (string or number) for eq/neq, or an array for in/not_in. + Value ClassifierFiltersValue `json:"value"` +} + +func (c *ClassifierFiltersFilter) GetField() string { + if c == nil { + return "" + } + return c.Field +} + +func (c *ClassifierFiltersFilter) GetOperator() string { + if c == nil { + return "" + } + return c.Operator +} + +func (c *ClassifierFiltersFilter) GetValue() ClassifierFiltersValue { + if c == nil { + return ClassifierFiltersValue{} + } + return c.Value +} + +// ClassifierFilters - Filter results to generations with specific classifier tag values. Can be combined with classifier_dimensions (must use the same classifier_id) or used independently with standard dimensions. +type ClassifierFilters struct { + // UUID of the classifier whose tags to filter by. Must match classifier_dimensions.classifier_id when both are specified. + ClassifierID string `json:"classifier_id"` + Filters []ClassifierFiltersFilter `json:"filters"` +} + +func (c *ClassifierFilters) GetClassifierID() string { + if c == nil { + return "" + } + return c.ClassifierID +} + +func (c *ClassifierFilters) GetFilters() []ClassifierFiltersFilter { + if c == nil { + return []ClassifierFiltersFilter{} + } + return c.Filters +} + type Value2Type string const ( @@ -317,8 +614,12 @@ func (t *TimeRange) GetStart() time.Time { } type QueryAnalyticsRequest struct { - Dimensions []string `json:"dimensions,omitzero"` - Filters []Filter `json:"filters,omitzero"` + // Group results by custom classifier tags, breaking down metrics by the specified dimension values. Requires an active classifier on the workspace. + ClassifierDimensions *ClassifierDimensions `json:"classifier_dimensions,omitzero"` + // Filter results to generations with specific classifier tag values. Can be combined with classifier_dimensions (must use the same classifier_id) or used independently with standard dimensions. + ClassifierFilters *ClassifierFilters `json:"classifier_filters,omitzero"` + Dimensions []string `json:"dimensions,omitzero"` + Filters []Filter `json:"filters,omitzero"` // Time granularity Granularity *string `json:"granularity,omitzero"` // Maximum rows per distinct combination of dimensions. When omitted on time-series queries (granularity + dimensions), auto-computed to avoid truncating time windows. Explicit values override the default and may truncate time buckets if set lower than the number of buckets in the range. Ignored when no dimensions are specified. @@ -341,6 +642,20 @@ func (q *QueryAnalyticsRequest) UnmarshalJSON(data []byte) error { return nil } +func (q *QueryAnalyticsRequest) GetClassifierDimensions() *ClassifierDimensions { + if q == nil { + return nil + } + return q.ClassifierDimensions +} + +func (q *QueryAnalyticsRequest) GetClassifierFilters() *ClassifierFilters { + if q == nil { + return nil + } + return q.ClassifierFilters +} + func (q *QueryAnalyticsRequest) GetDimensions() []string { if q == nil { return nil diff --git a/openrouter.go b/openrouter.go index b730a77..850475e 100644 --- a/openrouter.go +++ b/openrouter.go @@ -199,9 +199,9 @@ func WithTimeout(timeout time.Duration) SDKOption { // New creates a new instance of the SDK with the provided options func New(opts ...SDKOption) *OpenRouter { sdk := &OpenRouter{ - SDKVersion: "0.5.13", + SDKVersion: "0.5.14", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 0.5.13 2.914.0 1.0.0 github.com/OpenRouterTeam/go-sdk", + UserAgent: "speakeasy-sdk/go 0.5.14 2.914.0 1.0.0 github.com/OpenRouterTeam/go-sdk", Globals: globals.Globals{}, ServerList: ServerList, },