ソースを参照

feat(provider): add User-Agent header for GitLab AI Gateway requests (#11818)

Vladimir Glafirov 2 ヶ月 前
コミット
cf8b033be1
3 ファイル変更13 行追加4 行削除
  1. 2 2
      bun.lock
  2. 1 1
      packages/opencode/package.json
  3. 10 1
      packages/opencode/src/provider/provider.ts

+ 2 - 2
bun.lock

@@ -286,7 +286,7 @@
         "@ai-sdk/vercel": "1.0.33",
         "@ai-sdk/vercel": "1.0.33",
         "@ai-sdk/xai": "2.0.56",
         "@ai-sdk/xai": "2.0.56",
         "@clack/prompts": "1.0.0-alpha.1",
         "@clack/prompts": "1.0.0-alpha.1",
-        "@gitlab/gitlab-ai-provider": "3.3.1",
+        "@gitlab/gitlab-ai-provider": "3.4.0",
         "@hono/standard-validator": "0.1.5",
         "@hono/standard-validator": "0.1.5",
         "@hono/zod-validator": "catalog:",
         "@hono/zod-validator": "catalog:",
         "@modelcontextprotocol/sdk": "1.25.2",
         "@modelcontextprotocol/sdk": "1.25.2",
@@ -925,7 +925,7 @@
 
 
     "@fontsource/inter": ["@fontsource/[email protected]", "", {}, "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg=="],
     "@fontsource/inter": ["@fontsource/[email protected]", "", {}, "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg=="],
 
 
-    "@gitlab/gitlab-ai-provider": ["@gitlab/gitlab-ai-provider@3.3.1", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=2.0.0", "@ai-sdk/provider-utils": ">=3.0.0" } }, "sha512-J4/LfVcxOKbR2gfoBWRKp1BpWppprC2Cz/Ff5E0B/0lS341CDtZwzkgWvHfkM/XU6q83JRs059dS0cR8VOODOQ=="],
+    "@gitlab/gitlab-ai-provider": ["@gitlab/gitlab-ai-provider@3.4.0", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=2.0.0", "@ai-sdk/provider-utils": ">=3.0.0" } }, "sha512-1fEZgqjSZ0WLesftw/J5UtFuJCYFDvCZCHhTH5PZAmpDEmCwllJBoe84L3+vIk38V2FGDMTW128iKTB2mVzr3A=="],
 
 
     "@graphql-typed-document-node/core": ["@graphql-typed-document-node/[email protected]", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="],
     "@graphql-typed-document-node/core": ["@graphql-typed-document-node/[email protected]", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="],
 
 

+ 1 - 1
packages/opencode/package.json

@@ -70,7 +70,7 @@
     "@ai-sdk/vercel": "1.0.33",
     "@ai-sdk/vercel": "1.0.33",
     "@ai-sdk/xai": "2.0.56",
     "@ai-sdk/xai": "2.0.56",
     "@clack/prompts": "1.0.0-alpha.1",
     "@clack/prompts": "1.0.0-alpha.1",
-    "@gitlab/gitlab-ai-provider": "3.3.1",
+    "@gitlab/gitlab-ai-provider": "3.4.0",
     "@hono/standard-validator": "0.1.5",
     "@hono/standard-validator": "0.1.5",
     "@hono/zod-validator": "catalog:",
     "@hono/zod-validator": "catalog:",
     "@modelcontextprotocol/sdk": "1.25.2",
     "@modelcontextprotocol/sdk": "1.25.2",

+ 10 - 1
packages/opencode/src/provider/provider.ts

@@ -1,4 +1,5 @@
 import z from "zod"
 import z from "zod"
+import os from "os"
 import fuzzysort from "fuzzysort"
 import fuzzysort from "fuzzysort"
 import { Config } from "../config/config"
 import { Config } from "../config/config"
 import { mapValues, mergeDeep, omit, pickBy, sortBy } from "remeda"
 import { mapValues, mergeDeep, omit, pickBy, sortBy } from "remeda"
@@ -35,8 +36,9 @@ import { createGateway } from "@ai-sdk/gateway"
 import { createTogetherAI } from "@ai-sdk/togetherai"
 import { createTogetherAI } from "@ai-sdk/togetherai"
 import { createPerplexity } from "@ai-sdk/perplexity"
 import { createPerplexity } from "@ai-sdk/perplexity"
 import { createVercel } from "@ai-sdk/vercel"
 import { createVercel } from "@ai-sdk/vercel"
-import { createGitLab } from "@gitlab/gitlab-ai-provider"
+import { createGitLab, VERSION as GITLAB_PROVIDER_VERSION } from "@gitlab/gitlab-ai-provider"
 import { ProviderTransform } from "./transform"
 import { ProviderTransform } from "./transform"
+import { Installation } from "../installation"
 
 
 export namespace Provider {
 export namespace Provider {
   const log = Log.create({ service: "provider" })
   const log = Log.create({ service: "provider" })
@@ -424,11 +426,17 @@ export namespace Provider {
       const config = await Config.get()
       const config = await Config.get()
       const providerConfig = config.provider?.["gitlab"]
       const providerConfig = config.provider?.["gitlab"]
 
 
+      const aiGatewayHeaders = {
+        "User-Agent": `opencode/${Installation.VERSION} gitlab-ai-provider/${GITLAB_PROVIDER_VERSION} (${os.platform()} ${os.release()}; ${os.arch()})`,
+        ...(providerConfig?.options?.aiGatewayHeaders || {}),
+      }
+
       return {
       return {
         autoload: !!apiKey,
         autoload: !!apiKey,
         options: {
         options: {
           instanceUrl,
           instanceUrl,
           apiKey,
           apiKey,
+          aiGatewayHeaders,
           featureFlags: {
           featureFlags: {
             duo_agent_platform_agentic_chat: true,
             duo_agent_platform_agentic_chat: true,
             duo_agent_platform: true,
             duo_agent_platform: true,
@@ -437,6 +445,7 @@ export namespace Provider {
         },
         },
         async getModel(sdk: ReturnType<typeof createGitLab>, modelID: string) {
         async getModel(sdk: ReturnType<typeof createGitLab>, modelID: string) {
           return sdk.agenticChat(modelID, {
           return sdk.agenticChat(modelID, {
+            aiGatewayHeaders,
             featureFlags: {
             featureFlags: {
               duo_agent_platform_agentic_chat: true,
               duo_agent_platform_agentic_chat: true,
               duo_agent_platform: true,
               duo_agent_platform: true,