From 3963d2c259028b7b0a2ba83036ac463ae5b538ff Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:33:33 +0530 Subject: [PATCH 1/9] Require workspace_id on workspace-scoped operations Work in progress from 2026-10-01, committed as found. The shared WorkspaceIdQuery parameter becomes required and a uuid, and replaces the inline workspace_id query parameters it duplicated. It is added to the guardrail, API key, config, feedback, logs, MCP server, MCP integration, model and model pricing operations that did not carry it. build.py --check and check.py pass. lint.py fails on one path-params finding, but that predates this change: it came in with PR #3. Co-Authored-By: Claude Opus 5.5 --- openapi.yaml | 131 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 93 insertions(+), 38 deletions(-) diff --git a/openapi.yaml b/openapi.yaml index 3b5180c..bd5a985 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -243,16 +243,14 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/guardrails/create-guardrail + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' get: operationId: listGuardrails tags: - Guardrails parameters: - - name: workspace_id - in: query - schema: - type: string - format: uuid + - $ref: '#/components/parameters/WorkspaceIdQuery' - name: page_size in: query schema: @@ -307,6 +305,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -344,6 +343,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' requestBody: required: true content: @@ -387,6 +387,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -469,6 +470,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/guardrails/bulk-sync-guardrail-mcp-servers + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' get: operationId: listGuardrailMcpServers tags: @@ -508,6 +511,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/guardrails/list-guardrail-mcp-servers + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -573,6 +578,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/guardrails/upsert-guardrail-mcp-server + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -1625,6 +1632,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -1650,6 +1658,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -3245,6 +3254,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/configs/list-configs + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' post: tags: - Configs @@ -3290,6 +3301,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/configs/create-config + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -3304,6 +3317,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -3329,6 +3343,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -3393,6 +3408,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' requestBody: required: true content: @@ -3447,6 +3463,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -3539,6 +3556,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/feedback/create-feedback + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -3552,6 +3571,7 @@ paths: schema: type: string format: uuid + - $ref: '#/components/parameters/WorkspaceIdQuery' tags: - Feedback requestBody: @@ -3903,10 +3923,7 @@ paths: name: page_size schema: type: integer - - in: query - name: workspace_id - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -3985,6 +4002,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/providers/post-providers + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -3993,10 +4012,7 @@ paths: tags: - Providers parameters: - - in: query - name: workspace_id - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' - in: path name: slug schema: @@ -4021,10 +4037,7 @@ paths: tags: - Providers parameters: - - in: query - name: workspace_id - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' - in: path name: slug schema: @@ -4077,10 +4090,7 @@ paths: tags: - Providers parameters: - - in: query - name: workspace_id - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' - in: path name: slug schema: @@ -4447,15 +4457,14 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/mcp-servers-create + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' get: operationId: McpServers_list tags: - MCP Servers parameters: - - name: workspace_id - in: query - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' - name: current_page in: query schema: @@ -4522,6 +4531,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/mcp-servers-retrieve + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' put: operationId: McpServers_update tags: @@ -4546,6 +4557,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/mcp-servers-update + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' delete: operationId: McpServers_delete tags: @@ -4565,6 +4578,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/mcp-servers-delete + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -4594,6 +4609,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/mcp-servers-test + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -4631,6 +4648,7 @@ paths: - prompt - resource - resource_template + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -4671,6 +4689,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/capabilities/mcp-server-capabilities-bulk-update + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -4703,6 +4723,7 @@ paths: in: query schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -4742,6 +4763,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/mcp-servers/user-access/mcp-server-user-access-bulk-update + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed @@ -4761,10 +4784,7 @@ paths: in: query schema: type: string - - name: workspace_id - in: query - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' - name: current_page in: query schema: @@ -4803,10 +4823,7 @@ paths: schema: type: string format: uuid - - name: workspace_id - in: query - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -4910,6 +4927,7 @@ paths: - user - service required: true + - $ref: '#/components/parameters/WorkspaceIdQuery' requestBody: content: application/json: @@ -4960,10 +4978,7 @@ paths: in: query schema: type: integer - - name: workspace_id - in: query - schema: - type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5002,6 +5017,7 @@ paths: type: string format: uuid required: true + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5031,6 +5047,7 @@ paths: type: string format: uuid required: true + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5060,6 +5077,7 @@ paths: type: string format: uuid required: true + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5098,6 +5116,7 @@ paths: type: string format: uuid required: true + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5156,6 +5175,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/usage-limit-policies/create-usage-limits-policy + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' get: tags: - Usage Limit Policies @@ -5231,6 +5252,7 @@ paths: schema: type: boolean default: false + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5262,6 +5284,7 @@ paths: operationId: updateUsageLimitsPolicy parameters: - $ref: '#/components/parameters/PolicyUsageLimitsId' + - $ref: '#/components/parameters/WorkspaceIdQuery' requestBody: required: true content: @@ -5303,6 +5326,7 @@ paths: operationId: deleteUsageLimitsPolicy parameters: - $ref: '#/components/parameters/PolicyUsageLimitsId' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5363,6 +5387,7 @@ paths: minimum: 1 maximum: 100 - $ref: '#/components/parameters/CurrentPage' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5399,6 +5424,7 @@ paths: parameters: - $ref: '#/components/parameters/PolicyUsageLimitsId' - $ref: '#/components/parameters/UsageLimitsPolicyEntityId' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5461,6 +5487,8 @@ paths: text_digest: '' x-mint: href: /aigw/api-reference/rate-limit-policies/create-rate-limits-policy + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' get: tags: - Rate Limit Policies @@ -5548,6 +5576,7 @@ paths: - active - archived default: active + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5579,6 +5608,7 @@ paths: operationId: updateRateLimitsPolicy parameters: - $ref: '#/components/parameters/RateLimitsPolicyId' + - $ref: '#/components/parameters/WorkspaceIdQuery' requestBody: required: true content: @@ -5620,6 +5650,7 @@ paths: operationId: deleteRateLimitsPolicy parameters: - $ref: '#/components/parameters/RateLimitsPolicyId' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5679,6 +5710,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5757,6 +5789,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5841,6 +5874,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -5937,6 +5971,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6021,6 +6056,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6099,6 +6135,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6183,6 +6220,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6261,6 +6299,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6339,6 +6378,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6424,6 +6464,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6504,6 +6545,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6595,6 +6637,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6688,6 +6731,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6761,6 +6805,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6839,6 +6884,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6916,6 +6962,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -6994,6 +7041,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7069,6 +7117,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7139,6 +7188,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7216,6 +7266,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7302,6 +7353,7 @@ paths: - 'true' - 'false' default: 'true' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7377,6 +7429,7 @@ paths: - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -7451,6 +7504,7 @@ paths: required: true schema: type: string + - $ref: '#/components/parameters/WorkspaceIdQuery' responses: '200': description: '' @@ -8130,9 +8184,10 @@ components: WorkspaceIdQuery: name: workspace_id in: query - required: false + required: true schema: type: string + format: uuid schemas: ModelPricingConfig: type: object From 879ea5a7a33ec7511be36c34e2d64a74cd7f6f05 Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:37:20 +0530 Subject: [PATCH 2/9] Port the Anthropic integration, WIF auth and integration tags Structure only, from Portkey-AI/openapi 4d58839 and 3107701: - AnthropicConfiguration, a new provider in the integration create, update and detail schemas - provider_auth_type (apiKey, oauthClientCredentials, wif) and the OAuth and workload-identity fields on OpenAIConfiguration - a nullable string-map `tags` on the create and update requests, and a `tags` filter on GET /integrations The Anthropic entries in the three oneOfs are written as allOf: [$ref] beside a title rather than title beside $ref, as their siblings are, so they label the same way without adding to the no-$ref-siblings baseline. Properties that already existed keep their shape; the build added empty description keys to them, and those were taken back out. Co-Authored-By: Claude Opus 5.5 --- build-report.txt | 2 +- openapi.yaml | 116 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/build-report.txt b/build-report.txt index 224924c..cd0a2b4 100644 --- a/build-report.txt +++ b/build-report.txt @@ -2,7 +2,7 @@ Generated by scripts/build.py from openapi.yaml. operations 188 paths 122 -schemas 446 +schemas 447 tags 43 docs URLs 188 diff --git a/openapi.yaml b/openapi.yaml index bd5a985..12e7d52 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -3624,6 +3624,11 @@ paths: - organisation - all default: all + - in: query + name: tags + schema: + type: string + description: '' responses: '200': description: '' @@ -14856,6 +14861,9 @@ components: oneOf: - $ref: '#/components/schemas/OpenAIConfiguration' title: OpenAI + - title: Anthropic + allOf: + - $ref: '#/components/schemas/AnthropicConfiguration' - $ref: '#/components/schemas/AzureOpenAIConfiguration' title: Azure OpenAI - $ref: '#/components/schemas/BedrockConfiguration' @@ -14874,6 +14882,12 @@ components: title: Cortex - $ref: '#/components/schemas/CustomHostConfiguration' title: Custom Base URL + tags: + type: object + additionalProperties: + type: string + nullable: true + description: '' create_default_provider: type: boolean default: true @@ -14901,6 +14915,9 @@ components: oneOf: - $ref: '#/components/schemas/OpenAIConfiguration' title: OpenAI + - title: Anthropic + allOf: + - $ref: '#/components/schemas/AnthropicConfiguration' - $ref: '#/components/schemas/AzureOpenAIConfiguration' title: Azure OpenAI - $ref: '#/components/schemas/BedrockConfiguration' @@ -14919,6 +14936,12 @@ components: title: Cortex - $ref: '#/components/schemas/CustomHostConfiguration' title: Custom Base URL + tags: + type: object + additionalProperties: + type: string + nullable: true + description: '' secret_mappings: type: array items: @@ -14937,6 +14960,9 @@ components: oneOf: - $ref: '#/components/schemas/OpenAIConfiguration' title: OpenAI + - title: Anthropic + allOf: + - $ref: '#/components/schemas/AnthropicConfiguration' - $ref: '#/components/schemas/AzureOpenAIConfiguration' title: Azure OpenAI - $ref: '#/components/schemas/BedrockConfiguration' @@ -15094,10 +15120,49 @@ components: OpenAIConfiguration: type: object properties: + provider_auth_type: + type: string + enum: + - apiKey + - oauthClientCredentials + - wif + default: apiKey + description: '' openai_organization: type: string openai_project: type: string + oauth_token_endpoint: + type: string + description: '' + oauth_client_id: + type: string + description: '' + oauth_client_secret: + type: string + description: '' + oauth_scope: + type: string + description: '' + wif_identity_source: + type: string + enum: + - configuredIdp + default: configuredIdp + description: '' + oauth_audience: + type: string + description: '' + openai_identity_provider_id: + type: string + description: '' + openai_service_account_id: + type: string + description: '' + is_key_required: + type: boolean + default: true + description: '' AzureOpenAIConfiguration: type: object required: @@ -19149,3 +19214,54 @@ components: type: string tags: $ref: '#/components/schemas/DeploymentTags' + AnthropicConfiguration: + type: object + description: '' + properties: + provider_auth_type: + type: string + enum: + - apiKey + - wif + default: apiKey + description: '' + anthropic_inspect_stream_for_overloaded_error: + type: boolean + description: '' + oauth_token_endpoint: + type: string + description: '' + oauth_client_id: + type: string + description: '' + oauth_client_secret: + type: string + description: '' + oauth_scope: + type: string + description: '' + wif_identity_source: + type: string + enum: + - configuredIdp + default: configuredIdp + description: '' + oauth_audience: + type: string + description: '' + anthropic_federation_rule_id: + type: string + description: '' + anthropic_organization_id: + type: string + description: '' + anthropic_service_account_id: + type: string + description: '' + anthropic_workspace_id: + type: string + description: '' + is_key_required: + type: boolean + default: true + description: '' From 8e6a0d913c3701b9abb004a2620baddf87be75d5 Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:38:17 +0530 Subject: [PATCH 3/9] Port the deployment and workspace analytics filters, and three new groups Structure only, from Portkey-AI/openapi 66c520a and f76bb1a: - deployment_id, include_all_workspaces and exclude_workspace_slugs on all 22 analytics operations, in upstream's positions - GET /analytics/groups/a2a, /mcp and /workspaces, on the control plane like the other analytics groups (Vrushank, 2026-11-02). They also carry WorkspaceIdQuery, as every other analytics operation here does; upstream has no such parameter. Like upstream, they do not take the two workspace-inclusion filters. The three new operations have no operationId upstream, as none of the analytics operations do, so the operation-operationId baseline goes from 45 to 48. Inventing one would create an SDK contract key nobody chose; the build gave them method-and-path docs URLs instead. Co-Authored-By: Claude Opus 5.5 --- .spectral-baseline.json | 2 +- _project/hrefs.yaml | 3 + _project/planes.yaml | 7 + build-report.txt | 17 +- docs-navigation.json | 5 +- openapi.yaml | 330 +++++++++++++++++++++++++++++++++++++++ overlays/docs-prose.yaml | 24 +++ 7 files changed, 379 insertions(+), 9 deletions(-) diff --git a/.spectral-baseline.json b/.spectral-baseline.json index 943b706..233b461 100644 --- a/.spectral-baseline.json +++ b/.spectral-baseline.json @@ -3,7 +3,7 @@ "counts": { "array-items": 4, "no-$ref-siblings": 64, - "operation-operationId": 45, + "operation-operationId": 48, "operation-success-response": 1 } } diff --git a/_project/hrefs.yaml b/_project/hrefs.yaml index 96199e1..b9ecf74 100644 --- a/_project/hrefs.yaml +++ b/_project/hrefs.yaml @@ -212,4 +212,7 @@ hrefs: PUT /deployments/{deploymentId}: /aigw/api-reference/deployments/update-deployment DELETE /deployments/{deploymentId}: /aigw/api-reference/deployments/delete-deployment GET /deployments/{deploymentId}/ping: /aigw/api-reference/deployments/ping-deployment + GET /analytics/groups/a2a: /aigw/api-reference/analytics/groups/get-analytics-groups-a2a + GET /analytics/groups/mcp: /aigw/api-reference/analytics/groups/get-analytics-groups-mcp + GET /analytics/groups/workspaces: /aigw/api-reference/analytics/groups/get-analytics-groups-workspaces pinned: [] diff --git a/_project/planes.yaml b/_project/planes.yaml index 2075552..60adcdd 100644 --- a/_project/planes.yaml +++ b/_project/planes.yaml @@ -28,6 +28,10 @@ # (Integrations, MCP Integrations, Secret References, # Org Guardrails, Deployments) and written out here # as the paths those capabilities cover +# vrushank.2026-11-02 -- ported from Portkey-AI/openapi after the base +# linkage closed (upstream commits up to adfd74b); +# the plane was decided by Vrushank, not read off +# Portkey's server overrides # Tags whose operations are deliberately not all on one plane. `check.py` fails # on any other tag that spans two, because the split was decided by capability @@ -60,6 +64,9 @@ control-plane: "/analytics/groups/ai-models": inherited "/analytics/groups/metadata/{metadataKey}": inherited "/analytics/groups/provider": inherited + "/analytics/groups/a2a": vrushank.2026-11-02 + "/analytics/groups/mcp": vrushank.2026-11-02 + "/analytics/groups/workspaces": vrushank.2026-11-02 "/analytics/groups/users": inherited "/analytics/summary/cache": inherited "/api-keys": inherited diff --git a/build-report.txt b/build-report.txt index cd0a2b4..61d338f 100644 --- a/build-report.txt +++ b/build-report.txt @@ -1,22 +1,22 @@ Generated by scripts/build.py from openapi.yaml. -operations 188 -paths 122 +operations 191 +paths 125 schemas 447 tags 43 -docs URLs 188 +docs URLs 191 x-mint.href on every operation, from _project/hrefs.yaml. These are public URLs: the build re-derives each one and fails if it has moved, because a tag rename changes them silently and links point at them. -prose 0 written of 420 fields +prose 0 written of 426 fields Authored in overlays/docs-prose.yaml under the grounding gate and merged into openapi.yaml by this script. Every prose field here is stripped and reapplied on each build, so nothing reaches the published document without passing that gate. -servers 1 root + 69 path override(s) +servers 1 root + 72 path override(s) Every URL comes from _project/servers.yaml; which plane a path is on comes from _project/planes.yaml. Edit a host there and rebuild. The first entry in a plane is the one Mintlify builds its sample from; @@ -25,7 +25,7 @@ servers 1 root + 69 path override(s) gateway 53 path(s) https://aigw.portkey.ai/v1 -- Managed https://self-hosted-gateway-url.example.com/v1 -- Self-hosted -- replace with your own gateway host - control-plane 51 path(s) + control-plane 54 path(s) https://api.apps.paloaltonetworks.com/ai_gw/v2 -- Managed admin 14 path(s) https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 -- Managed @@ -48,7 +48,7 @@ components pruned this run 0 null defaults dropped this run 0 -operations lacking operationId 45 +operations lacking operationId 48 Inherited gaps, not introduced here. operationId values are never renamed, and inventing them is not the same as recovering them, so they are reported for engineering rather than filled in. Phase 2. @@ -73,10 +73,13 @@ operations lacking operationId 45 GET /analytics/graphs/tokens GET /analytics/graphs/users GET /analytics/graphs/users/requests + GET /analytics/groups/a2a GET /analytics/groups/ai-models + GET /analytics/groups/mcp GET /analytics/groups/metadata/{metadataKey} GET /analytics/groups/provider GET /analytics/groups/users + GET /analytics/groups/workspaces GET /analytics/summary/cache GET /api-keys GET /api-keys/{id} diff --git a/docs-navigation.json b/docs-navigation.json index 871d26c..0b7f1ca 100644 --- a/docs-navigation.json +++ b/docs-navigation.json @@ -568,7 +568,10 @@ "GET /analytics/groups/users", "GET /analytics/groups/ai-models", "GET /analytics/groups/provider", - "GET /analytics/groups/metadata/{metadataKey}" + "GET /analytics/groups/metadata/{metadataKey}", + "GET /analytics/groups/a2a", + "GET /analytics/groups/mcp", + "GET /analytics/groups/workspaces" ] }, { diff --git a/openapi.yaml b/openapi.yaml index 12e7d52..917246b 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -5694,6 +5694,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -5712,6 +5714,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -5773,6 +5776,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -5791,6 +5796,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -5858,6 +5864,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -5876,6 +5884,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -5955,6 +5964,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -5973,6 +5984,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6040,6 +6052,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6058,6 +6072,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6119,6 +6134,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6137,6 +6154,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6204,6 +6222,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6222,6 +6242,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6283,6 +6304,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6301,6 +6324,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6362,6 +6386,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6380,6 +6406,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6463,9 +6490,12 @@ paths: - $ref: '#/components/parameters/VirtualKeys' - $ref: '#/components/parameters/Configs' - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6529,6 +6559,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6547,6 +6579,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6621,6 +6654,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6639,6 +6674,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6715,6 +6751,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6733,6 +6771,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6789,6 +6828,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6807,6 +6848,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6868,6 +6910,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6886,6 +6930,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -6946,6 +6991,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -6964,6 +7011,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7025,6 +7073,8 @@ paths: - Analytics > Graphs parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7043,6 +7093,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7101,6 +7152,8 @@ paths: - Analytics > Summary parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7119,6 +7172,7 @@ paths: - $ref: '#/components/parameters/ApiKeyIds' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7170,6 +7224,8 @@ paths: - Analytics > Groups parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7190,6 +7246,7 @@ paths: - $ref: '#/components/parameters/PageSize' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7248,6 +7305,8 @@ paths: - Analytics > Groups parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7268,6 +7327,7 @@ paths: - $ref: '#/components/parameters/PageSize' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7324,6 +7384,8 @@ paths: - Analytics > Groups parameters: - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7344,6 +7406,7 @@ paths: - $ref: '#/components/parameters/PageSize' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/OrderBy' - $ref: '#/components/parameters/OrderByType' - name: columns @@ -7411,6 +7474,8 @@ paths: type: string required: true - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/IncludeAllWorkspaces' + - $ref: '#/components/parameters/ExcludeWorkspaceSlugs' - $ref: '#/components/parameters/TimeOfGenerationMin' - $ref: '#/components/parameters/TimeOfGenerationMax' - $ref: '#/components/parameters/TotalUnitsMin' @@ -7431,6 +7496,7 @@ paths: - $ref: '#/components/parameters/PageSize' - $ref: '#/components/parameters/Metadata' - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' - $ref: '#/components/parameters/TraceId' - $ref: '#/components/parameters/SpanId' - $ref: '#/components/parameters/PromptSlug' @@ -7971,6 +8037,252 @@ paths: servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 description: Managed + /analytics/groups/a2a: + get: + tags: + - Analytics > Groups + summary: '' + parameters: + - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/TimeOfGenerationMin' + - $ref: '#/components/parameters/TimeOfGenerationMax' + - $ref: '#/components/parameters/TotalUnitsMin' + - $ref: '#/components/parameters/TotalUnitsMax' + - $ref: '#/components/parameters/CostMin' + - $ref: '#/components/parameters/CostMax' + - $ref: '#/components/parameters/PromptTokenMin' + - $ref: '#/components/parameters/PromptTokenMax' + - $ref: '#/components/parameters/CompletionTokenMin' + - $ref: '#/components/parameters/CompletionTokenMax' + - $ref: '#/components/parameters/StatusCode' + - $ref: '#/components/parameters/WeightedFeedbackMin' + - $ref: '#/components/parameters/WeightedFeedbackMax' + - $ref: '#/components/parameters/VirtualKeys' + - $ref: '#/components/parameters/Configs' + - $ref: '#/components/parameters/ApiKeyIds' + - $ref: '#/components/parameters/CurrentPage' + - $ref: '#/components/parameters/PageSize' + - $ref: '#/components/parameters/Metadata' + - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' + - $ref: '#/components/parameters/TraceId' + - $ref: '#/components/parameters/SpanId' + - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' + responses: + '200': + description: '' + headers: + Content-Type: + schema: + type: string + content: + application/json: + schema: + type: object + properties: + object: + type: string + enum: + - list + total: + type: integer + description: '' + data: + type: array + items: + type: object + properties: + name: + type: string + description: '' + requests: + type: integer + description: '' + object: + type: string + description: '' + enum: + - analytics-group + required: + - object + - data + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/analytics/groups/get-analytics-groups-a2a + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 + description: Managed + /analytics/groups/mcp: + get: + tags: + - Analytics > Groups + summary: '' + parameters: + - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/TimeOfGenerationMin' + - $ref: '#/components/parameters/TimeOfGenerationMax' + - $ref: '#/components/parameters/TotalUnitsMin' + - $ref: '#/components/parameters/TotalUnitsMax' + - $ref: '#/components/parameters/CostMin' + - $ref: '#/components/parameters/CostMax' + - $ref: '#/components/parameters/PromptTokenMin' + - $ref: '#/components/parameters/PromptTokenMax' + - $ref: '#/components/parameters/CompletionTokenMin' + - $ref: '#/components/parameters/CompletionTokenMax' + - $ref: '#/components/parameters/StatusCode' + - $ref: '#/components/parameters/WeightedFeedbackMin' + - $ref: '#/components/parameters/WeightedFeedbackMax' + - $ref: '#/components/parameters/VirtualKeys' + - $ref: '#/components/parameters/Configs' + - $ref: '#/components/parameters/ApiKeyIds' + - $ref: '#/components/parameters/CurrentPage' + - $ref: '#/components/parameters/PageSize' + - $ref: '#/components/parameters/Metadata' + - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' + - $ref: '#/components/parameters/TraceId' + - $ref: '#/components/parameters/SpanId' + - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' + responses: + '200': + description: '' + headers: + Content-Type: + schema: + type: string + content: + application/json: + schema: + type: object + properties: + object: + type: string + enum: + - list + total: + type: integer + description: '' + data: + type: array + items: + type: object + properties: + name: + type: string + description: '' + requests: + type: integer + description: '' + object: + type: string + description: '' + enum: + - analytics-group + required: + - object + - data + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/analytics/groups/get-analytics-groups-mcp + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 + description: Managed + /analytics/groups/workspaces: + get: + tags: + - Analytics > Groups + summary: '' + parameters: + - $ref: '#/components/parameters/WorkspaceSlug' + - $ref: '#/components/parameters/TimeOfGenerationMin' + - $ref: '#/components/parameters/TimeOfGenerationMax' + - $ref: '#/components/parameters/TotalUnitsMin' + - $ref: '#/components/parameters/TotalUnitsMax' + - $ref: '#/components/parameters/CostMin' + - $ref: '#/components/parameters/CostMax' + - $ref: '#/components/parameters/PromptTokenMin' + - $ref: '#/components/parameters/PromptTokenMax' + - $ref: '#/components/parameters/CompletionTokenMin' + - $ref: '#/components/parameters/CompletionTokenMax' + - $ref: '#/components/parameters/StatusCode' + - $ref: '#/components/parameters/WeightedFeedbackMin' + - $ref: '#/components/parameters/WeightedFeedbackMax' + - $ref: '#/components/parameters/VirtualKeys' + - $ref: '#/components/parameters/Configs' + - $ref: '#/components/parameters/ApiKeyIds' + - $ref: '#/components/parameters/CurrentPage' + - $ref: '#/components/parameters/PageSize' + - $ref: '#/components/parameters/Metadata' + - $ref: '#/components/parameters/AiOrgModel' + - $ref: '#/components/parameters/DeploymentId' + - $ref: '#/components/parameters/TraceId' + - $ref: '#/components/parameters/SpanId' + - $ref: '#/components/parameters/PromptSlug' + - $ref: '#/components/parameters/WorkspaceIdQuery' + responses: + '200': + description: '' + headers: + Content-Type: + schema: + type: string + content: + application/json: + schema: + type: object + properties: + object: + type: string + enum: + - list + total: + type: integer + description: '' + is_quota_exceeded: + type: boolean + description: '' + data: + type: array + items: + type: object + properties: + workspace_slug: + type: string + description: '' + requests: + type: integer + description: '' + cost: + type: number + description: '' + object: + type: string + description: '' + enum: + - analytics-group + required: + - object + - data + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/analytics/groups/get-analytics-groups-workspaces + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 + description: Managed components: securitySchemes: Authorization: @@ -8193,6 +8505,24 @@ components: schema: type: string format: uuid + DeploymentId: + in: query + name: deployment_id + schema: + type: string + description: '' + ExcludeWorkspaceSlugs: + in: query + name: exclude_workspace_slugs + schema: + type: string + description: '' + IncludeAllWorkspaces: + in: query + name: include_all_workspaces + schema: + type: boolean + description: '' schemas: ModelPricingConfig: type: object diff --git a/overlays/docs-prose.yaml b/overlays/docs-prose.yaml index 04ac356..dd4cac0 100644 --- a/overlays/docs-prose.yaml +++ b/overlays/docs-prose.yaml @@ -1644,3 +1644,27 @@ actions: claims: [] origin_kind: human text_digest: '' +- target: $.paths['/analytics/groups/a2a'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/analytics/groups/mcp'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/analytics/groups/workspaces'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' From 8dbfcc78a79709929d084e9cd938f30732aa89ec Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:38:50 +0530 Subject: [PATCH 4/9] Rename the thread message create operation to createThreadMessage From Portkey-AI/openapi 8938f71. POST /threads/{thread_id}/messages and the incoming POST /messages were both createMessage upstream; this frees the name for the Messages API, as upstream did. The docs URL is pinned at assistants/create-message rather than moved to the derived create-thread-message. The page is published and links point at it; adopting the new URL is a docs migration, done with --apply-hrefs when docs are ready. The operationId change itself does reach SDKs. Co-Authored-By: Claude Opus 5.5 --- _project/hrefs.yaml | 6 +++++- openapi.yaml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/_project/hrefs.yaml b/_project/hrefs.yaml index b9ecf74..4dee4ae 100644 --- a/_project/hrefs.yaml +++ b/_project/hrefs.yaml @@ -215,4 +215,8 @@ hrefs: GET /analytics/groups/a2a: /aigw/api-reference/analytics/groups/get-analytics-groups-a2a GET /analytics/groups/mcp: /aigw/api-reference/analytics/groups/get-analytics-groups-mcp GET /analytics/groups/workspaces: /aigw/api-reference/analytics/groups/get-analytics-groups-workspaces -pinned: [] +pinned: + # Vrushank, 2026-11-02: operationId renamed createMessage -> createThreadMessage + # (Portkey-AI/openapi 8938f71) so POST /messages can take createMessage. The + # page was already published; the URL stays where links point at it. + - POST /threads/{thread_id}/messages diff --git a/openapi.yaml b/openapi.yaml index 917246b..9b1b6c3 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2148,7 +2148,7 @@ paths: x-mint: href: /aigw/api-reference/assistants/list-messages post: - operationId: createMessage + operationId: createThreadMessage tags: - Assistants parameters: From dbb53dd6e014f84b32661fb879f56073843a605a Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:39:42 +0530 Subject: [PATCH 5/9] Port the Egress Allowlist API, on the admin plane Structure only, from Portkey-AI/openapi 8f91369: list, create, get, update and delete on /egress-allowlist, and their four schemas. On the admin plane by Vrushank's call, 2026-11-02. The upstream tag is "Egress-Allowlist"; it ships as "Egress Allowlist", following the Title Case convention in tags-map.yaml, in the Administration group. The build stamped five docs URLs and stubbed the overlay. Co-Authored-By: Claude Opus 5.5 --- _project/hrefs.yaml | 10 +- _project/planes.yaml | 4 + build-report.txt | 16 +-- docs-navigation.json | 14 +++ openapi.yaml | 260 +++++++++++++++++++++++++++++++++++++++ overlays/docs-prose.yaml | 43 +++++++ tags-map.yaml | 5 + 7 files changed, 340 insertions(+), 12 deletions(-) diff --git a/_project/hrefs.yaml b/_project/hrefs.yaml index 4dee4ae..dba401d 100644 --- a/_project/hrefs.yaml +++ b/_project/hrefs.yaml @@ -215,8 +215,10 @@ hrefs: GET /analytics/groups/a2a: /aigw/api-reference/analytics/groups/get-analytics-groups-a2a GET /analytics/groups/mcp: /aigw/api-reference/analytics/groups/get-analytics-groups-mcp GET /analytics/groups/workspaces: /aigw/api-reference/analytics/groups/get-analytics-groups-workspaces + GET /egress-allowlist: /aigw/api-reference/egress-allowlist/list-egress-allowlist + POST /egress-allowlist: /aigw/api-reference/egress-allowlist/create-egress-allowlist-entry + GET /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/get-egress-allowlist-entry + PUT /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/update-egress-allowlist-entry + DELETE /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/delete-egress-allowlist-entry pinned: - # Vrushank, 2026-11-02: operationId renamed createMessage -> createThreadMessage - # (Portkey-AI/openapi 8938f71) so POST /messages can take createMessage. The - # page was already published; the URL stays where links point at it. - - POST /threads/{thread_id}/messages +- POST /threads/{thread_id}/messages diff --git a/_project/planes.yaml b/_project/planes.yaml index 60adcdd..5bdfc8a 100644 --- a/_project/planes.yaml +++ b/_project/planes.yaml @@ -124,6 +124,10 @@ admin: "/deployments/{deploymentId}": vrushank.2026-09-15 "/deployments/{deploymentId}/ping": vrushank.2026-09-15 + # Ported from Portkey-AI/openapi 8f91369. An admin API (Vrushank, 2026-11-02). + "/egress-allowlist": vrushank.2026-11-02 + "/egress-allowlist/{egressAllowlistId}": vrushank.2026-11-02 + # The org-level guardrails, which the API serves at the same suffix as the # control-plane ones. The `/admin/v2` in these keys is the server prefix, moved # here because a document cannot hold two paths spelled `/guardrails`. diff --git a/build-report.txt b/build-report.txt index 61d338f..2760ce6 100644 --- a/build-report.txt +++ b/build-report.txt @@ -1,22 +1,22 @@ Generated by scripts/build.py from openapi.yaml. -operations 191 -paths 125 -schemas 447 -tags 43 +operations 196 +paths 127 +schemas 451 +tags 44 -docs URLs 191 +docs URLs 196 x-mint.href on every operation, from _project/hrefs.yaml. These are public URLs: the build re-derives each one and fails if it has moved, because a tag rename changes them silently and links point at them. -prose 0 written of 426 fields +prose 0 written of 437 fields Authored in overlays/docs-prose.yaml under the grounding gate and merged into openapi.yaml by this script. Every prose field here is stripped and reapplied on each build, so nothing reaches the published document without passing that gate. -servers 1 root + 72 path override(s) +servers 1 root + 74 path override(s) Every URL comes from _project/servers.yaml; which plane a path is on comes from _project/planes.yaml. Edit a host there and rebuild. The first entry in a plane is the one Mintlify builds its sample from; @@ -27,7 +27,7 @@ servers 1 root + 72 path override(s) https://self-hosted-gateway-url.example.com/v1 -- Self-hosted -- replace with your own gateway host control-plane 54 path(s) https://api.apps.paloaltonetworks.com/ai_gw/v2 -- Managed - admin 14 path(s) + admin 16 path(s) https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 -- Managed admin-in-path 4 path(s) https://api.apps.paloaltonetworks.com/ai_gw -- Managed diff --git a/docs-navigation.json b/docs-navigation.json index 0b7f1ca..5726eea 100644 --- a/docs-navigation.json +++ b/docs-navigation.json @@ -480,6 +480,20 @@ "GET /deployments/{deploymentId}/ping" ] }, + { + "group": "Egress Allowlist", + "openapi": { + "source": "https://raw.githubusercontent.com/PaloAltoNetworks/openapi/refs/heads/main/openapi.yaml", + "directory": "api-reference" + }, + "pages": [ + "GET /egress-allowlist", + "POST /egress-allowlist", + "GET /egress-allowlist/{egressAllowlistId}", + "PUT /egress-allowlist/{egressAllowlistId}", + "DELETE /egress-allowlist/{egressAllowlistId}" + ] + }, { "group": "Org Guardrails", "openapi": { diff --git a/openapi.yaml b/openapi.yaml index 9b1b6c3..4af739b 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -91,6 +91,8 @@ tags: description: '' - name: Deployments description: '' +- name: Egress Allowlist + description: '' - name: Org Guardrails description: '' - name: Rate Limit Policies @@ -8283,6 +8285,200 @@ paths: servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed + /egress-allowlist: + get: + operationId: listEgressAllowlist + summary: '' + tags: + - Egress Allowlist + parameters: + - in: query + name: search + schema: + type: string + minLength: 1 + maxLength: 255 + description: '' + - in: query + name: current_page + schema: + type: integer + minimum: 0 + default: 0 + description: '' + - in: query + name: page_size + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + description: '' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + object: + type: string + enum: + - list + total: + type: integer + data: + type: array + items: + $ref: '#/components/schemas/EgressAllowlistEntry' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/egress-allowlist/list-egress-allowlist + post: + operationId: createEgressAllowlistEntry + summary: '' + tags: + - Egress Allowlist + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateEgressAllowlistRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + id: + type: string + format: uuid + domain: + type: string + description: '' + object: + type: string + enum: + - egress-allowlist + '400': + description: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/egress-allowlist/create-egress-allowlist-entry + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 + description: Managed + /egress-allowlist/{egressAllowlistId}: + get: + operationId: getEgressAllowlistEntry + summary: '' + tags: + - Egress Allowlist + parameters: + - in: path + name: egressAllowlistId + required: true + schema: + type: string + format: uuid + description: '' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/EgressAllowlistEntry' + '404': + description: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/egress-allowlist/get-egress-allowlist-entry + put: + operationId: updateEgressAllowlistEntry + summary: '' + tags: + - Egress Allowlist + parameters: + - in: path + name: egressAllowlistId + required: true + schema: + type: string + format: uuid + description: '' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateEgressAllowlistRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + '400': + description: '' + '404': + description: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/egress-allowlist/update-egress-allowlist-entry + delete: + operationId: deleteEgressAllowlistEntry + summary: '' + tags: + - Egress Allowlist + parameters: + - in: path + name: egressAllowlistId + required: true + schema: + type: string + format: uuid + description: '' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + '404': + description: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/egress-allowlist/delete-egress-allowlist-entry + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 + description: Managed components: securitySchemes: Authorization: @@ -19595,3 +19791,67 @@ components: type: boolean default: true description: '' + CreateEgressAllowlistRequest: + type: object + required: + - domain + properties: + domain: + $ref: '#/components/schemas/EgressAllowlistDomain' + description: + type: string + nullable: true + maxLength: 500 + EgressAllowlistDomain: + type: string + minLength: 1 + maxLength: 255 + description: '' + EgressAllowlistEntry: + type: object + properties: + id: + type: string + format: uuid + organisation_id: + type: string + format: uuid + domain: + type: string + description: + type: string + nullable: true + status: + type: string + enum: + - active + created_by: + type: string + format: uuid + nullable: true + created_at: + type: string + format: date-time + last_updated_at: + type: string + format: date-time + object: + type: string + enum: + - egress-allowlist + UpdateEgressAllowlistRequest: + type: object + description: '' + minProperties: 1 + anyOf: + - required: + - domain + - required: + - description + properties: + domain: + $ref: '#/components/schemas/EgressAllowlistDomain' + description: + type: string + nullable: true + maxLength: 500 diff --git a/overlays/docs-prose.yaml b/overlays/docs-prose.yaml index dd4cac0..b0e66bc 100644 --- a/overlays/docs-prose.yaml +++ b/overlays/docs-prose.yaml @@ -1668,3 +1668,46 @@ actions: claims: [] origin_kind: human text_digest: '' +- target: $.tags[?(@.name=='Egress Allowlist')] + update: + description: '' +- target: $.paths['/egress-allowlist'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/egress-allowlist'].post + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/egress-allowlist/{egressAllowlistId}'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/egress-allowlist/{egressAllowlistId}'].put + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/egress-allowlist/{egressAllowlistId}'].delete + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' diff --git a/tags-map.yaml b/tags-map.yaml index 7d9c0e9..014d27e 100644 --- a/tags-map.yaml +++ b/tags-map.yaml @@ -179,6 +179,11 @@ tags: - from: Usage Limits Policies to: Usage Limit Policies group: administration + # From Portkey-AI/openapi 8f91369, after the base linkage closed, where it + # is "Egress-Allowlist". No `from`: it was never in the base. Renamed to the + # Title Case, space-separated convention above. + - to: Egress Allowlist + group: administration # --- Observability ----------------------------------------------------- - from: Analytics > Graphs From 01eefab0856ff673e78935d39a2c5d276332a9ad Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:40:39 +0530 Subject: [PATCH 6/9] Port the Access Policies API, on the control plane Structure only, from Portkey-AI/openapi 2bc08ce and its follow-up 700ece6: list, create, get, update and delete on /policies/access, the AccessPolicyId parameter and nine schemas. On the control plane beside the rate and usage limit policies, by Vrushank's call, 2026-11-02, and in the Administration navigation group. GET /policies/access takes WorkspaceIdQuery upstream as well, so it is required here like everywhere else that carries it. Co-Authored-By: Claude Opus 5.5 --- _project/hrefs.yaml | 5 + _project/planes.yaml | 3 + build-report.txt | 16 +- docs-navigation.json | 14 + openapi.yaml | 545 +++++++++++++++++++++++++++++++++++++++ overlays/docs-prose.yaml | 43 +++ tags-map.yaml | 4 + 7 files changed, 622 insertions(+), 8 deletions(-) diff --git a/_project/hrefs.yaml b/_project/hrefs.yaml index dba401d..2997d32 100644 --- a/_project/hrefs.yaml +++ b/_project/hrefs.yaml @@ -220,5 +220,10 @@ hrefs: GET /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/get-egress-allowlist-entry PUT /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/update-egress-allowlist-entry DELETE /egress-allowlist/{egressAllowlistId}: /aigw/api-reference/egress-allowlist/delete-egress-allowlist-entry + POST /policies/access: /aigw/api-reference/access-policies/create-access-policy + GET /policies/access: /aigw/api-reference/access-policies/list-access-policies + GET /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/get-access-policy + PUT /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/update-access-policy + DELETE /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/delete-access-policy pinned: - POST /threads/{thread_id}/messages diff --git a/_project/planes.yaml b/_project/planes.yaml index 5bdfc8a..3b18775 100644 --- a/_project/planes.yaml +++ b/_project/planes.yaml @@ -90,6 +90,9 @@ control-plane: "/mcp-servers/{mcpServerId}/user-access": inherited "/model-configs/pricing/{provider}/{model}": classification.yaml "/models/{model}": classification.yaml + # Ported from Portkey-AI/openapi 2bc08ce and 700ece6 (Vrushank, 2026-11-02). + "/policies/access": vrushank.2026-11-02 + "/policies/access/{accessPolicyId}": vrushank.2026-11-02 "/policies/rate-limits": classification.yaml "/policies/rate-limits/{rateLimitsPolicyId}": classification.yaml "/policies/usage-limits": classification.yaml diff --git a/build-report.txt b/build-report.txt index 2760ce6..6cce28a 100644 --- a/build-report.txt +++ b/build-report.txt @@ -1,22 +1,22 @@ Generated by scripts/build.py from openapi.yaml. -operations 196 -paths 127 -schemas 451 -tags 44 +operations 201 +paths 129 +schemas 460 +tags 45 -docs URLs 196 +docs URLs 201 x-mint.href on every operation, from _project/hrefs.yaml. These are public URLs: the build re-derives each one and fails if it has moved, because a tag rename changes them silently and links point at them. -prose 0 written of 437 fields +prose 0 written of 448 fields Authored in overlays/docs-prose.yaml under the grounding gate and merged into openapi.yaml by this script. Every prose field here is stripped and reapplied on each build, so nothing reaches the published document without passing that gate. -servers 1 root + 74 path override(s) +servers 1 root + 76 path override(s) Every URL comes from _project/servers.yaml; which plane a path is on comes from _project/planes.yaml. Edit a host there and rebuild. The first entry in a plane is the one Mintlify builds its sample from; @@ -25,7 +25,7 @@ servers 1 root + 74 path override(s) gateway 53 path(s) https://aigw.portkey.ai/v1 -- Managed https://self-hosted-gateway-url.example.com/v1 -- Self-hosted -- replace with your own gateway host - control-plane 54 path(s) + control-plane 56 path(s) https://api.apps.paloaltonetworks.com/ai_gw/v2 -- Managed admin 16 path(s) https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 -- Managed diff --git a/docs-navigation.json b/docs-navigation.json index 5726eea..e39470e 100644 --- a/docs-navigation.json +++ b/docs-navigation.json @@ -465,6 +465,20 @@ "POST /api-keys/{id}/rotate" ] }, + { + "group": "Access Policies", + "openapi": { + "source": "https://raw.githubusercontent.com/PaloAltoNetworks/openapi/refs/heads/main/openapi.yaml", + "directory": "api-reference" + }, + "pages": [ + "POST /policies/access", + "GET /policies/access", + "GET /policies/access/{accessPolicyId}", + "PUT /policies/access/{accessPolicyId}", + "DELETE /policies/access/{accessPolicyId}" + ] + }, { "group": "Deployments", "openapi": { diff --git a/openapi.yaml b/openapi.yaml index 4af739b..a3c876a 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -89,6 +89,8 @@ tags: description: '' - name: API Keys description: '' +- name: Access Policies + description: '' - name: Deployments description: '' - name: Egress Allowlist @@ -8479,6 +8481,266 @@ paths: servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/admin/v2 description: Managed + /policies/access: + post: + tags: + - Access Policies + summary: '' + description: '' + operationId: createAccessPolicy + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAccessPolicyRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + id: + type: string + format: uuid + object: + type: string + enum: + - access + '400': + description: '' + '401': + description: '' + '403': + description: '' + '404': + description: '' + '409': + description: '' + '500': + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/access-policies/create-access-policy + get: + tags: + - Access Policies + summary: '' + description: '' + operationId: listAccessPolicies + parameters: + - $ref: '#/components/parameters/WorkspaceIdQuery' + - name: effect + in: query + description: '' + required: false + schema: + type: string + enum: + - allow + - deny + - name: enabled + in: query + description: '' + required: false + schema: + type: boolean + - name: user_id + in: query + description: '' + required: false + schema: + type: string + maxLength: 36 + - name: agent_id + in: query + description: '' + required: false + schema: + type: string + maxLength: 36 + - name: server_id + in: query + description: '' + required: false + schema: + type: string + maxLength: 100 + - name: search + in: query + description: '' + required: false + schema: + type: string + maxLength: 64 + - name: created_by + in: query + description: '' + required: false + schema: + type: string + maxLength: 255 + - name: start_time + in: query + description: '' + required: false + schema: + type: string + format: date-time + - name: end_time + in: query + description: '' + required: false + schema: + type: string + format: date-time + - $ref: '#/components/parameters/PageSize' + - $ref: '#/components/parameters/CurrentPage' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + object: + type: string + enum: + - list + total: + type: integer + data: + type: array + items: + $ref: '#/components/schemas/AccessPolicyListItem' + '400': + description: '' + '401': + description: '' + '403': + description: '' + '500': + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/access-policies/list-access-policies + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 + description: Managed + /policies/access/{accessPolicyId}: + get: + tags: + - Access Policies + summary: '' + description: '' + operationId: getAccessPolicy + parameters: + - $ref: '#/components/parameters/AccessPolicyId' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AccessPolicy' + '400': + description: '' + '401': + description: '' + '403': + description: '' + '404': + description: '' + '500': + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/access-policies/get-access-policy + put: + tags: + - Access Policies + summary: '' + description: '' + operationId: updateAccessPolicy + parameters: + - $ref: '#/components/parameters/AccessPolicyId' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateAccessPolicyRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + '400': + description: '' + '401': + description: '' + '403': + description: '' + '404': + description: '' + '409': + description: '' + '500': + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/access-policies/update-access-policy + delete: + tags: + - Access Policies + summary: '' + description: '' + operationId: deleteAccessPolicy + parameters: + - $ref: '#/components/parameters/AccessPolicyId' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + '400': + description: '' + '401': + description: '' + '403': + description: '' + '404': + description: '' + '500': + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/access-policies/delete-access-policy + servers: + - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 + description: Managed components: securitySchemes: Authorization: @@ -8719,6 +8981,14 @@ components: schema: type: boolean description: '' + AccessPolicyId: + name: accessPolicyId + in: path + required: true + description: '' + schema: + type: string + format: uuid schemas: ModelPricingConfig: type: object @@ -19855,3 +20125,278 @@ components: type: string nullable: true maxLength: 500 + AccessPolicyListItem: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + nullable: true + enabled: + type: boolean + effect: + type: string + enum: + - allow + - deny + allow_all_users: + type: boolean + description: '' + allow_all_agents: + type: boolean + description: '' + target_server_count: + type: integer + description: '' + target_provider_count: + type: integer + description: '' + version: + type: integer + status: + type: string + enum: + - active + workspace_id: + type: string + format: uuid + organisation_id: + type: string + format: uuid + created_by: + type: string + nullable: true + created_at: + type: string + format: date-time + last_updated_at: + type: string + format: date-time + object: + type: string + enum: + - access + CreateAccessPolicyRequest: + type: object + required: + - name + - subjects + - targets + properties: + workspace_id: + type: string + description: '' + name: + type: string + minLength: 1 + maxLength: 64 + description: '' + description: + type: string + nullable: true + maxLength: 256 + effect: + type: string + enum: + - allow + - deny + description: '' + subjects: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/AccessPolicySubject' + targets: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/AccessPolicyTarget' + enabled: + type: boolean + default: true + AccessPolicyTarget: + oneOf: + - $ref: '#/components/schemas/AccessPolicyMcpServerTarget' + - $ref: '#/components/schemas/AccessPolicyProviderTarget' + discriminator: + propertyName: type + mapping: + mcp_server: '#/components/schemas/AccessPolicyMcpServerTarget' + provider: '#/components/schemas/AccessPolicyProviderTarget' + AccessPolicyProviderTarget: + type: object + required: + - type + - provider_id + properties: + type: + type: string + enum: + - provider + provider_id: + type: string + description: '' + models: + description: '' + oneOf: + - type: string + enum: + - ALL + - type: array + minItems: 1 + items: + type: string + minLength: 1 + AccessPolicyMcpServerTarget: + type: object + required: + - type + - server_id + - tools + properties: + type: + type: string + enum: + - mcp_server + server_id: + type: string + description: '' + tools: + description: '' + oneOf: + - type: string + enum: + - ALL + - type: array + minItems: 1 + items: + type: string + minLength: 1 + AccessPolicySubject: + type: object + required: + - type + - id + properties: + type: + type: string + enum: + - user + - group + - agent + id: + type: string + description: '' + UpdateAccessPolicyRequest: + type: object + required: + - version + - subjects + - targets + properties: + version: + type: integer + minimum: 1 + description: '' + name: + type: string + minLength: 1 + maxLength: 64 + description: + type: string + nullable: true + maxLength: 256 + effect: + type: string + enum: + - allow + - deny + description: '' + subjects: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/AccessPolicySubject' + targets: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/AccessPolicyTarget' + enabled: + type: boolean + AccessPolicy: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + nullable: true + enabled: + type: boolean + effect: + type: string + enum: + - allow + - deny + subjects: + type: array + items: + $ref: '#/components/schemas/AccessPolicySubjectDetails' + targets: + type: array + items: + $ref: '#/components/schemas/AccessPolicyTarget' + version: + type: integer + description: '' + status: + type: string + enum: + - active + workspace_id: + type: string + format: uuid + organisation_id: + type: string + format: uuid + created_by: + type: string + nullable: true + created_at: + type: string + format: date-time + last_updated_at: + type: string + format: date-time + object: + type: string + enum: + - access + AccessPolicySubjectDetails: + type: object + properties: + type: + type: string + enum: + - user + - group + - agent + id: + type: string + description: '' + name: + type: string + nullable: true + description: '' + email: + type: string + nullable: true + description: '' diff --git a/overlays/docs-prose.yaml b/overlays/docs-prose.yaml index b0e66bc..fa17481 100644 --- a/overlays/docs-prose.yaml +++ b/overlays/docs-prose.yaml @@ -1711,3 +1711,46 @@ actions: claims: [] origin_kind: human text_digest: '' +- target: $.tags[?(@.name=='Access Policies')] + update: + description: '' +- target: $.paths['/policies/access'].post + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/policies/access'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/policies/access/{accessPolicyId}'].get + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/policies/access/{accessPolicyId}'].put + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/policies/access/{accessPolicyId}'].delete + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' diff --git a/tags-map.yaml b/tags-map.yaml index 014d27e..3f406de 100644 --- a/tags-map.yaml +++ b/tags-map.yaml @@ -160,6 +160,10 @@ tags: - from: Api-Keys to: API Keys group: administration + # From Portkey-AI/openapi 2bc08ce, after the base linkage closed. No `from`: + # it was never in the base. + - to: Access Policies + group: administration - from: Rate Limits Policies to: Rate Limit Policies group: administration From 9ad0d929548447c3cc570753ac0b96dc850fbe7b Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:41:54 +0530 Subject: [PATCH 7/9] Port the Anthropic Messages API, on the gateway plane Structure only, from Portkey-AI/openapi 9283142 with its fix 6ac6e5d: POST /messages (createMessage) and POST /messages/count_tokens (countMessageTokens), with 19 schemas, a Messages tag in the Inference group and the same trace headers /chat/completions takes. The gateway is the root server, so no override is written. 6ac6e5d replaced a duplicate CreateMessageRequest with CreateAnthropicMessageRequest; only the fixed shape is ported. Two empty descriptions beside a $ref in it were removed rather than added to the no-$ref-siblings baseline -- OpenAPI 3.0 ignores them. Co-Authored-By: Claude Opus 5.5 --- _project/hrefs.yaml | 2 + _project/planes.yaml | 3 + build-report.txt | 14 +- docs-navigation.json | 11 + openapi.yaml | 463 +++++++++++++++++++++++++++++++++++++++ overlays/docs-prose.yaml | 19 ++ tags-map.yaml | 5 + 7 files changed, 510 insertions(+), 7 deletions(-) diff --git a/_project/hrefs.yaml b/_project/hrefs.yaml index 2997d32..5d3d40b 100644 --- a/_project/hrefs.yaml +++ b/_project/hrefs.yaml @@ -225,5 +225,7 @@ hrefs: GET /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/get-access-policy PUT /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/update-access-policy DELETE /policies/access/{accessPolicyId}: /aigw/api-reference/access-policies/delete-access-policy + POST /messages: /aigw/api-reference/messages/create-message + POST /messages/count_tokens: /aigw/api-reference/messages/count-message-tokens pinned: - POST /threads/{thread_id}/messages diff --git a/_project/planes.yaml b/_project/planes.yaml index 3b18775..db0d912 100644 --- a/_project/planes.yaml +++ b/_project/planes.yaml @@ -154,6 +154,9 @@ gateway: "/completions": inherited "/decisions": portkey-openapi#160 "/embeddings": inherited + # Anthropic Messages API, ported from Portkey-AI/openapi 9283142 and 6ac6e5d. + "/messages": vrushank.2026-11-02 + "/messages/count_tokens": vrushank.2026-11-02 "/files": inherited "/files/{file_id}": inherited "/files/{file_id}/content": inherited diff --git a/build-report.txt b/build-report.txt index 6cce28a..5a16067 100644 --- a/build-report.txt +++ b/build-report.txt @@ -1,16 +1,16 @@ Generated by scripts/build.py from openapi.yaml. -operations 201 -paths 129 -schemas 460 -tags 45 +operations 203 +paths 131 +schemas 479 +tags 46 -docs URLs 201 +docs URLs 203 x-mint.href on every operation, from _project/hrefs.yaml. These are public URLs: the build re-derives each one and fails if it has moved, because a tag rename changes them silently and links point at them. -prose 0 written of 448 fields +prose 0 written of 453 fields Authored in overlays/docs-prose.yaml under the grounding gate and merged into openapi.yaml by this script. Every prose field here is stripped and reapplied on each build, so nothing reaches the @@ -22,7 +22,7 @@ servers 1 root + 76 path override(s) first entry in a plane is the one Mintlify builds its sample from; the rest appear in its base-URL dropdown. The gateway is the root block, so its paths carry no override. - gateway 53 path(s) + gateway 55 path(s) https://aigw.portkey.ai/v1 -- Managed https://self-hosted-gateway-url.example.com/v1 -- Self-hosted -- replace with your own gateway host control-plane 56 path(s) diff --git a/docs-navigation.json b/docs-navigation.json index e39470e..1db9b30 100644 --- a/docs-navigation.json +++ b/docs-navigation.json @@ -142,6 +142,17 @@ "POST /images/variations" ] }, + { + "group": "Messages", + "openapi": { + "source": "https://raw.githubusercontent.com/PaloAltoNetworks/openapi/refs/heads/main/openapi.yaml", + "directory": "api-reference" + }, + "pages": [ + "POST /messages", + "POST /messages/count_tokens" + ] + }, { "group": "Model Pricing", "openapi": { diff --git a/openapi.yaml b/openapi.yaml index a3c876a..2a1de0f 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -41,6 +41,8 @@ tags: description: '' - name: Images description: '' +- name: Messages + description: '' - name: Model Pricing description: '' - name: Models @@ -8741,6 +8743,70 @@ paths: servers: - url: https://api.apps.paloaltonetworks.com/ai_gw/v2 description: Managed + /messages: + post: + operationId: createMessage + tags: + - Messages + summary: '' + description: '' + parameters: + - $ref: '#/components/parameters/PortkeyTraceId' + - $ref: '#/components/parameters/PortkeySpanId' + - $ref: '#/components/parameters/PortkeyParentSpanId' + - $ref: '#/components/parameters/PortkeySpanName' + - $ref: '#/components/parameters/PortkeyMetadata' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAnthropicMessageRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMessageResponse' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/messages/create-message + /messages/count_tokens: + post: + operationId: countMessageTokens + tags: + - Messages + summary: '' + description: '' + parameters: + - $ref: '#/components/parameters/PortkeyTraceId' + - $ref: '#/components/parameters/PortkeySpanId' + - $ref: '#/components/parameters/PortkeyParentSpanId' + - $ref: '#/components/parameters/PortkeySpanName' + - $ref: '#/components/parameters/PortkeyMetadata' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CountMessageTokensRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CountMessageTokensResponse' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' + x-mint: + href: /aigw/api-reference/messages/count-message-tokens components: securitySchemes: Authorization: @@ -20400,3 +20466,400 @@ components: type: string nullable: true description: '' + CreateMessageResponse: + type: object + properties: + id: + type: string + type: + type: string + enum: + - message + role: + type: string + enum: + - assistant + model: + type: string + content: + type: array + items: + $ref: '#/components/schemas/AnthropicContentBlock' + stop_reason: + type: string + enum: + - end_turn + - max_tokens + - stop_sequence + - tool_use + - pause_turn + stop_sequence: + type: string + nullable: true + usage: + $ref: '#/components/schemas/AnthropicUsage' + AnthropicUsage: + type: object + properties: + input_tokens: + type: integer + output_tokens: + type: integer + cache_creation_input_tokens: + type: integer + cache_read_input_tokens: + type: integer + AnthropicContentBlock: + oneOf: + - $ref: '#/components/schemas/AnthropicTextContent' + - $ref: '#/components/schemas/AnthropicImageContent' + - $ref: '#/components/schemas/AnthropicDocumentContent' + - $ref: '#/components/schemas/AnthropicToolUseContent' + - $ref: '#/components/schemas/AnthropicToolResultContent' + - $ref: '#/components/schemas/AnthropicThinkingContent' + - $ref: '#/components/schemas/AnthropicRedactedThinkingContent' + AnthropicRedactedThinkingContent: + type: object + required: + - type + - data + properties: + type: + type: string + enum: + - redacted_thinking + data: + type: string + AnthropicThinkingContent: + type: object + required: + - type + - thinking + - signature + properties: + type: + type: string + enum: + - thinking + thinking: + type: string + signature: + type: string + AnthropicToolResultContent: + type: object + required: + - type + - tool_use_id + properties: + type: + type: string + enum: + - tool_result + tool_use_id: + type: string + content: + oneOf: + - type: string + - type: array + items: + oneOf: + - $ref: '#/components/schemas/AnthropicTextContent' + - $ref: '#/components/schemas/AnthropicImageContent' + is_error: + type: boolean + AnthropicImageContent: + type: object + required: + - type + - source + properties: + type: + type: string + enum: + - image + source: + $ref: '#/components/schemas/AnthropicImageSource' + AnthropicImageSource: + type: object + required: + - type + properties: + type: + type: string + enum: + - base64 + - url + media_type: + type: string + enum: + - image/jpeg + - image/png + - image/gif + - image/webp + description: '' + data: + type: string + description: '' + url: + type: string + description: '' + AnthropicTextContent: + type: object + required: + - type + - text + properties: + type: + type: string + enum: + - text + text: + type: string + AnthropicToolUseContent: + type: object + required: + - type + - id + - name + - input + properties: + type: + type: string + enum: + - tool_use + id: + type: string + name: + type: string + input: + type: object + AnthropicDocumentContent: + type: object + required: + - type + - source + properties: + type: + type: string + enum: + - document + source: + $ref: '#/components/schemas/AnthropicDocumentSource' + title: + type: string + context: + type: string + citations: + type: object + properties: + enabled: + type: boolean + AnthropicDocumentSource: + type: object + required: + - type + properties: + type: + type: string + enum: + - base64 + - url + - text + - content + media_type: + type: string + enum: + - application/pdf + - text/plain + description: '' + data: + type: string + description: '' + url: + type: string + description: '' + text: + type: string + description: '' + CreateAnthropicMessageRequest: + type: object + required: + - model + - messages + - max_tokens + description: '' + properties: + model: + type: string + description: '' + messages: + type: array + items: + $ref: '#/components/schemas/AnthropicMessage' + description: '' + max_tokens: + type: integer + description: '' + system: + $ref: '#/components/schemas/AnthropicSystemContent' + stream: + type: boolean + default: false + description: '' + temperature: + type: number + minimum: 0 + maximum: 1 + description: '' + top_p: + type: number + description: '' + top_k: + type: integer + description: '' + stop_sequences: + type: array + items: + type: string + description: '' + tools: + type: array + items: + $ref: '#/components/schemas/AnthropicTool' + description: '' + tool_choice: + type: object + description: '' + properties: + type: + type: string + enum: + - auto + - any + - tool + - none + name: + type: string + description: '' + thinking: + $ref: '#/components/schemas/AnthropicThinkingConfig' + metadata: + type: object + properties: + user_id: + type: string + AnthropicThinkingConfig: + type: object + required: + - type + properties: + type: + type: string + enum: + - enabled + - disabled + - adaptive + budget_tokens: + type: integer + description: '' + AnthropicTool: + type: object + required: + - name + - input_schema + properties: + name: + type: string + description: + type: string + input_schema: + type: object + description: '' + cache_control: + type: object + properties: + type: + type: string + enum: + - ephemeral + AnthropicSystemContent: + oneOf: + - type: string + description: '' + - type: array + items: + type: object + required: + - type + - text + properties: + type: + type: string + enum: + - text + text: + type: string + cache_control: + type: object + properties: + type: + type: string + enum: + - ephemeral + AnthropicMessage: + type: object + required: + - role + - content + properties: + role: + type: string + enum: + - user + - assistant + content: + oneOf: + - type: string + - type: array + items: + $ref: '#/components/schemas/AnthropicContentBlock' + CountMessageTokensResponse: + type: object + properties: + input_tokens: + type: integer + description: '' + CountMessageTokensRequest: + type: object + required: + - model + - messages + description: '' + properties: + model: + type: string + description: '' + messages: + type: array + items: + $ref: '#/components/schemas/AnthropicMessage' + system: + $ref: '#/components/schemas/AnthropicSystemContent' + tools: + type: array + items: + $ref: '#/components/schemas/AnthropicTool' + tool_choice: + type: object + properties: + type: + type: string + enum: + - auto + - any + - tool + - none + name: + type: string + thinking: + $ref: '#/components/schemas/AnthropicThinkingConfig' diff --git a/overlays/docs-prose.yaml b/overlays/docs-prose.yaml index fa17481..e6f835c 100644 --- a/overlays/docs-prose.yaml +++ b/overlays/docs-prose.yaml @@ -1754,3 +1754,22 @@ actions: claims: [] origin_kind: human text_digest: '' +- target: $.tags[?(@.name=='Messages')] + update: + description: '' +- target: $.paths['/messages'].post + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' +- target: $.paths['/messages/count_tokens'].post + update: + summary: '' + description: '' + x-airs-provenance: + claims: [] + origin_kind: human + text_digest: '' diff --git a/tags-map.yaml b/tags-map.yaml index 3f406de..376463f 100644 --- a/tags-map.yaml +++ b/tags-map.yaml @@ -69,6 +69,11 @@ tags: group: inference - to: Decisions group: inference + # The Anthropic Messages API, from Portkey-AI/openapi 9283142, after the base + # linkage closed. No `from`: it was never in the base. Not to be confused + # with the thread messages under Assistants. + - to: Messages + group: inference - from: OCR to: OCR group: inference From 62d3863c0bcc3fe3fa9711e56f609a9f4c197139 Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Mon, 2 Nov 2026 13:42:58 +0530 Subject: [PATCH 8/9] Catch the README up with the 2026-11-02 port Counts were stale since the Decisions endpoint and are refreshed: 131 paths, 203 operations and docs URLs, 521 components, 46 tags, 48 operations without an operationId, 117 baselined lint findings. Provenance now says what "the linkage is closed" does and does not mean -- nothing follows Portkey automatically, but changes can be ported as decisions -- and lists what has been. Known gaps gains the path-params lint failure that has been on main since PR #3. Co-Authored-By: Claude Opus 5.5 --- README.md | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 79b35a5..96e5647 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ empty, and it would have cost the whole gate the day one was written. The four decision files under `_project/` are the same idea applied to structure. Each holds a decision that would otherwise be spread across the document — sixty-odd -`servers` blocks, eleven tag groups' worth of operations, 187 page URLs — where +`servers` blocks, eleven tag groups' worth of operations, 203 page URLs — where it can be read, reviewed and changed in one place. `scripts/build.py` applies them back onto `openapi.yaml` and CI fails if the document and the decisions disagree. @@ -62,12 +62,12 @@ disagree. | | | |---|---| | OpenAPI | 3.0.0 | -| Paths / operations | 121 / 187 | -| Components | 480, of which 442 schemas | -| Tags | 42, across 6 navigation groups | +| Paths / operations | 131 / 203 | +| Components | 521, of which 479 schemas | +| Tags | 46, across 6 navigation groups | | Servers | 5 hosts across 4 planes — managed and self-hosted gateway, control plane, admin, admin-in-path | | Security | 1 scheme: `Authorization: Bearer` | -| Docs URLs | 187 — one `x-mint.href` per operation, all unique | +| Docs URLs | 203 — one `x-mint.href` per operation, all unique | | Prose fields stripped | 4,221 | | Written descriptions | 0 — blocked on KB access | @@ -157,7 +157,7 @@ changing either is a migration rather than a spec edit.** ``` `{tag-path}` is the tag kebab-cased, with `>` becoming a path separator, and -`{operation-slug}` is the `operationId` kebab-cased. The **45 operations with no +`{operation-slug}` is the `operationId` kebab-cased. The **48 operations with no `operationId` get a slug from their method and path** — `by-id` for a `{id}` segment — and *not* an `operationId`. The distinction is why this could be done while Phase 2 waits: an `operationId` is a contract key that SDK generators turn @@ -266,11 +266,11 @@ shrink, never grow. What is in there today: | Count | Rule | What it is | |---|---|---| | 64 | `no-$ref-siblings` | `title`, `nullable`, `type` and `x-oaiExpandable` beside a `$ref`, which OpenAPI 3.0 silently ignores | -| 45 | `operation-operationId` | The known gap | +| 48 | `operation-operationId` | The known gap. 45 inherited; 3 more with the analytics groups ported on 2026-11-02, which have none upstream either | | 4 | `array-items` | Arrays with no `items` | | 1 | `operation-success-response` | `GET /realtime` declares no 2xx | -114 findings across 4 rules, down from 193 across 6 before the drops. +117 findings across 4 rules, down from 193 across 6 before the drops. `oas3-unused-component` went from 26 to **0**: the drop pruned every component nothing reaches, including 52 the base was already carrying unreferenced. @@ -310,7 +310,7 @@ domain and not subordinate to the KB (recorded exemption, Q6, 2026-09-07). The reconciliation loop is therefore three-node — KB ↔ spec ↔ docs — and drift from *either* side is a defect, with no authoritative side to fall back on. -`x-airs-provenance` is scaffolded on all 187 operations with `claims` empty. It +`x-airs-provenance` is scaffolded on all 203 operations with `claims` empty. It is not only "which claim supports this description"; it is the **join key that makes drift detectable**. Without a claim reference on an operation, nothing can tell that the KB moved and the spec did not. @@ -503,6 +503,17 @@ about files that still decide things: does `openapi.yaml` agree with `tags-map.yaml`? The base is gone; the decisions taken against it are still enforced. +Closed means nothing *follows* Portkey automatically, not that nothing may be +taken from it. Changes are ported one at a time, as decisions, structure only: +`POST /decisions` from Portkey-AI/openapi#160 (2026-09-29), and on 2026-11-02 +everything upstream merged up to `adfd74b` — the Anthropic integration and its +WIF/OAuth auth, integration tags, the deployment and workspace analytics +filters, three analytics groups, Egress Allowlist (admin), Access Policies +(control plane), the Anthropic Messages API (gateway), and the +`createThreadMessage` rename. Each carries its source commit in its commit +message and, in `_project/planes.yaml`, in its `how`. What came over is +Portkey's shape, as unverified against the Prisma AIRS API as the rest. + The strip itself was recorded in `PROSE-INVENTORY.csv` — a pointer, length and SHA-256 digest per field, never the text. It was frozen at the end of Phase 1, because it could only be derived by diffing against the base, and removed on @@ -521,7 +532,7 @@ wanted. reachable from this workspace. The left-hand column of the inherit/re-ground split is *machine-verifiable in principle* — send a request, compare the response — and that verification has not been done. -- **45 operations have no `operationId`** (listed in `build-report.txt`). An +- **48 operations have no `operationId`** (listed in `build-report.txt`). An inherited gap. Inventing identifiers is not the same as recovering them, so they are reported for engineering rather than filled in. This also blocks SDK generation: Stainless, Speakeasy and Fern all derive method names from it. @@ -535,7 +546,7 @@ wanted. - **No code samples.** Mintlify generates one per operation from the schema, and it dumps every property: `POST /chat/completions` renders all 24, `seed` and `logit_bias` included, because Mintlify does not use `required` to trim the - example. Hand-written cURL samples for all 187 operations are Phase 3 work. + example. Hand-written cURL samples for all 203 operations are Phase 3 work. Until then the generated sample is correct but verbose. cURL only is the intended end state — a single `x-codeSamples` entry suppresses the other language tabs, and other languages are a separate decision. @@ -546,7 +557,13 @@ wanted. For the three `PUT`s, requiring nothing may already be correct, since a partial update where every field is optional is a normal design. Wants engineering. -- **114 lint findings are baselined**, all inherited. See the linting section. +- **117 lint findings are baselined**, all inherited or carried in with ported + structure. See the linting section. +- **Lint fails on `path-params`**, and has since PR #3 (2026-09-18). + `POST /api-keys/{sub-type}` and `/api-keys/{id}` are the same template to + OpenAPI, which forbids that. It is not baselined, because it is a defect in + the URL design rather than inherited debt: either the create path changes or + the two are merged into one path item. Wants an API decision. - **One operation is documented as needing no credentials** — `GET /model-configs/pricing/{provider}/{model}`, which the base declared with `security: []`. Preserved rather than quietly reversed: making it require auth From 99f0e2fb1414976bed14d18dc687d8b17ce41b8f Mon Sep 17 00:00:00 2001 From: Vrushank Vyas Date: Tue, 3 Nov 2026 17:10:20 +0530 Subject: [PATCH 9/9] Record the workspace_id decision and what still needs confirming The required workspace_id from 2026-10-01 drew 86 breaking-change errors from oasdiff on PR #5. Vrushank confirmed it on 2026-11-02: mandatory everywhere WorkspaceIdQuery appears, analytics and /api-keys included, with include_all_workspaces and exclude_workspace_slugs still working beside it. Version stays 3.0.0, since no SDK has been generated. None of that has been checked against the API, because no SCM token was available here. Known gaps now says so, names the three live calls that would settle it, and notes the tension with PR #3's "the scope comes from the token". The unauthenticated pricing endpoint now requiring a workspace is added to its existing entry. Co-Authored-By: Claude Opus 5.5 --- README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 96e5647..0365ad8 100644 --- a/README.md +++ b/README.md @@ -568,7 +568,28 @@ wanted. `GET /model-configs/pricing/{provider}/{model}`, which the base declared with `security: []`. Preserved rather than quietly reversed: making it require auth is as much an unverified claim as leaving it public. `scripts/check.py` prints - it on every run. Wants engineering. + it on every run. Since 2026-11-02 it also requires `workspace_id`, which sits + oddly with taking no credentials: either it needs auth after all or it should + not need a workspace. Wants engineering. +- **`workspace_id` is required on 80 operations, decided but not verified.** + Vrushank, 2026-11-02: `WorkspaceIdQuery` is mandatory and a uuid wherever it + appears, including every analytics operation and all of `/api-keys`, and the + analytics `include_all_workspaces` and `exclude_workspace_slugs` filters must + keep working beside it. oasdiff grades the 76 that existed before as 86 + breaking changes; the four ported since are new. The version + stays `3.0.0` because no SDK has been generated from the document. Nobody has + yet sent a request to confirm it. Three things a live call against the + control plane (SCM token, `tsg_id` scope) would settle: + - a request with no `workspace_id` is rejected + - `include_all_workspaces=true` widens beyond the one required workspace, + rather than being refused or ignored + - `exclude_workspace_slugs` removes a workspace from those results + + One tension to settle with it: PR #3 took the scope out of the API key create + path because the scope comes from the calling token, the same reasoning that + removed `organisation_id`. If a workspace-scoped token already carries its + workspace, `workspace_id` may only be needed, and required, for org-level + tokens. - **`organisation_id` is gone as a parameter but survives as a response field.** Engineering's instruction was scoped to parameters, and it was followed to that scope. Fifteen component schemas still carry an