@undefineds.co/xpod 0.2.28 → 0.2.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/config/cli.json +1 -1
  2. package/config/local.json +8 -8
  3. package/config/resolver.json +2 -2
  4. package/config/xpod.json +8 -8
  5. package/dist/api/container/index.js +1 -1
  6. package/dist/api/container/index.js.map +1 -1
  7. package/dist/api/service/VercelChatService.d.ts +2 -1
  8. package/dist/api/service/VercelChatService.js +7 -3
  9. package/dist/api/service/VercelChatService.js.map +1 -1
  10. package/dist/api/service/ai-gateway-transport.d.ts +3 -1
  11. package/dist/api/service/ai-gateway-transport.js +12 -7
  12. package/dist/api/service/ai-gateway-transport.js.map +1 -1
  13. package/dist/api/service/platform-ai-config.d.ts +2 -0
  14. package/dist/api/service/platform-ai-config.js +17 -5
  15. package/dist/api/service/platform-ai-config.js.map +1 -1
  16. package/dist/cli/commands/start.js +8 -8
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/components/context.jsonld +8 -8
  19. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  20. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  21. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  22. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  23. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  24. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  25. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  26. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  27. package/dist/runtime/bootstrap.js +1 -1
  28. package/dist/runtime/bootstrap.js.map +1 -1
  29. package/package.json +1 -1
package/config/cli.json CHANGED
@@ -295,7 +295,7 @@
295
295
  },
296
296
  {
297
297
  "@type": "YargsParameter",
298
- "name": "idpUrl",
298
+ "name": "oidcIssuer",
299
299
  "options": {
300
300
  "type": "string",
301
301
  "hidden": true
package/config/local.json CHANGED
@@ -21,16 +21,16 @@
21
21
  }
22
22
  },
23
23
  {
24
- "comment": "定义 idpUrl 变量(外部 IdP 基础 URL),设置后启用 SP 模式",
25
- "@id": "urn:solid-server:default:variable:idpUrl",
24
+ "comment": "定义 oidcIssuer 变量(外部 IdP 基础 URL),设置后启用 SP 模式",
25
+ "@id": "urn:solid-server:default:variable:oidcIssuer",
26
26
  "@type": "Variable"
27
27
  },
28
28
  {
29
- "comment": "Auto-detect OIDC Handler - 有 idpUrl 时启用 SP 模式,代理 JWKS",
29
+ "comment": "Auto-detect OIDC Handler - 有 oidcIssuer 时启用 SP 模式,代理 JWKS",
30
30
  "@id": "urn:undefineds:xpod:AutoDetectOidcHandler",
31
31
  "@type": "AutoDetectOidcHandler",
32
- "AutoDetectOidcHandler:_options_idpUrl": {
33
- "@id": "urn:solid-server:default:variable:idpUrl"
32
+ "AutoDetectOidcHandler:_options_oidcIssuer": {
33
+ "@id": "urn:solid-server:default:variable:oidcIssuer"
34
34
  },
35
35
  "AutoDetectOidcHandler:_options_cacheMs": 300000
36
36
  },
@@ -52,11 +52,11 @@
52
52
  }
53
53
  },
54
54
  {
55
- "comment": "Auto-detect Identity Provider Handler - 有 idpUrl 时禁用本地账户管理",
55
+ "comment": "Auto-detect Identity Provider Handler - 有 oidcIssuer 时禁用本地账户管理",
56
56
  "@id": "urn:undefineds:xpod:AutoDetectIdentityProviderHandler",
57
57
  "@type": "AutoDetectIdentityProviderHandler",
58
- "AutoDetectIdentityProviderHandler:_options_idpUrl": {
59
- "@id": "urn:solid-server:default:variable:idpUrl"
58
+ "AutoDetectIdentityProviderHandler:_options_oidcIssuer": {
59
+ "@id": "urn:solid-server:default:variable:oidcIssuer"
60
60
  },
61
61
  "AutoDetectIdentityProviderHandler:_options_source": {
62
62
  "@id": "urn:undefineds:xpod:SourceIdentityProviderHandler"
@@ -288,10 +288,10 @@
288
288
  }
289
289
  },
290
290
  {
291
- "CombinedShorthandResolver:_resolvers_key": "urn:solid-server:default:variable:idpUrl",
291
+ "CombinedShorthandResolver:_resolvers_key": "urn:solid-server:default:variable:oidcIssuer",
292
292
  "CombinedShorthandResolver:_resolvers_value": {
293
293
  "@type": "KeyExtractor",
294
- "key": "idpUrl",
294
+ "key": "oidcIssuer",
295
295
  "defaultValue": ""
296
296
  }
297
297
  },
package/config/xpod.json CHANGED
@@ -16,8 +16,8 @@
16
16
  "@type": "Void"
17
17
  },
18
18
  {
19
- "comment": "定义 idpUrl 变量(外部 IdP 基础 URL)- SP 模式必填",
20
- "@id": "urn:solid-server:default:variable:idpUrl",
19
+ "comment": "定义 oidcIssuer 变量(外部 IdP 基础 URL)- SP 模式必填",
20
+ "@id": "urn:solid-server:default:variable:oidcIssuer",
21
21
  "@type": "Variable"
22
22
  },
23
23
  {
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "additionalBaseUrls": [
31
31
  {
32
- "@id": "urn:solid-server:default:variable:idpUrl"
32
+ "@id": "urn:solid-server:default:variable:oidcIssuer"
33
33
  }
34
34
  ]
35
35
  },
@@ -52,11 +52,11 @@
52
52
  }
53
53
  },
54
54
  {
55
- "comment": "Auto-detect OIDC Handler - 有 idpUrl 时启用 SP 模式",
55
+ "comment": "Auto-detect OIDC Handler - 有 oidcIssuer 时启用 SP 模式",
56
56
  "@id": "urn:undefineds:xpod:AutoDetectOidcHandler",
57
57
  "@type": "AutoDetectOidcHandler",
58
- "options_idpUrl": {
59
- "@id": "urn:solid-server:default:variable:idpUrl"
58
+ "options_oidcIssuer": {
59
+ "@id": "urn:solid-server:default:variable:oidcIssuer"
60
60
  },
61
61
  "options_cacheMs": 300000
62
62
  },
@@ -74,8 +74,8 @@
74
74
  "comment": "Auto-detect Identity Provider Handler",
75
75
  "@id": "urn:undefineds:xpod:AutoDetectIdentityProviderHandler",
76
76
  "@type": "AutoDetectIdentityProviderHandler",
77
- "options_idpUrl": {
78
- "@id": "urn:solid-server:default:variable:idpUrl"
77
+ "options_oidcIssuer": {
78
+ "@id": "urn:solid-server:default:variable:oidcIssuer"
79
79
  }
80
80
  },
81
81
  {
@@ -109,7 +109,7 @@ function loadConfigFromEnv() {
109
109
  nodeToken: process.env.XPOD_NODE_TOKEN,
110
110
  // OIDC Issuer (Local 托管式使用 Cloud IdP)
111
111
  // 如果配置了 XPOD_NODE_TOKEN,默认使用 Cloud IdP
112
- oidcIssuer: process.env.XPOD_OIDC_ISSUER ?? process.env.CSS_OIDC_ISSUER ?? process.env.CSS_IDP_URL ?? (process.env.XPOD_NODE_TOKEN
112
+ oidcIssuer: process.env.CSS_OIDC_ISSUER ?? (process.env.XPOD_NODE_TOKEN
113
113
  ? OFFICIAL_CLOUD_IDENTITY_ORIGIN
114
114
  : undefined),
115
115
  // 隧道配置
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/container/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;AAoCH,gDAyBC;AAKD,8CAgDC;AAhHD,mCAAuF;AACvF,6CAAqD;AACrD,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAElC,qCAAkD;AAClD,mCAAgD;AAChD,mCAAgD;AAChD,qDAAyD;AAIzD,MAAM,8BAA8B,GAAG,0BAA0B,CAAC;AAElE,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,uBAAuB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;IACvE,CAAC;IAED,OAAO,mCAAmC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,SAAS,GAAG,IAAA,wBAAe,EAAqB;QACpD,aAAa,EAAE,sBAAa,CAAC,KAAK;QAClC,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,OAAO;IACP,SAAS,CAAC,QAAQ,CAAC;QACjB,MAAM,EAAE,IAAA,gBAAO,EAAC,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH,SAAS;IACT,IAAA,+BAAsB,EAAC,SAAS,CAAC,CAAC;IAElC,oBAAoB;IACpB,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,gDAAgD;IAChD,IAAA,sCAAqB,EAAC,SAAS,CAAC,CAAC;IAEjC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAsB,CAAC;IAE3E,qEAAqE;IACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ;QAClC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;QACpC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO;QACL,OAAO;QACP,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;QACvC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QACvC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE;QAC9E,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;QAC7E,gBAAgB,EAAE,uBAAuB,EAAE;QAE3C,mBAAmB;QACnB,SAAS,EAAE;YACT,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YACtD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACtD,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACpD,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACrD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;SACxD;QAED,qBAAqB;QACrB,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACrD,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAEtC,sCAAsC;QACtC,uCAAuC;QACvC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CACpG,OAAO,CAAC,GAAG,CAAC,eAAe;YACzB,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,SAAS,CACd;QAED,OAAO;QACP,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;QAC1D,4EAA4E;QAC5E,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAE9E,uBAAuB;QACvB,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;KACjE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,EAAE,CAAC;gBACtE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,sBAAsB,CAAC,SAAkB;IAChD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEtD,UAAU;IACV,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,0BAA0B;IAC1B,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG;QAClB,CAAC,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7D,CAAC,CAAC,IAAA,wBAAU,GAAE,CAAC;IAEjB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/**\n * API Container 入口\n *\n * 使用 Awilix 进行依赖注入,根据 edition 注册不同服务\n */\n\nimport { createContainer, asValue, InjectionMode, type AwilixContainer } from 'awilix';\nimport { randomUUID, createHash } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport { registerCommonServices } from './common';\nimport { registerCloudServices } from './cloud';\nimport { registerLocalServices } from './local';\nimport { registerBusinessToken } from './business-token';\n\nexport type { ApiContainerCradle, ApiContainerConfig } from './types';\n\nconst OFFICIAL_CLOUD_IDENTITY_ORIGIN = 'https://id.undefineds.co';\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveCssTokenEndpoint(): string {\n if (process.env.CSS_TOKEN_ENDPOINT) {\n return process.env.CSS_TOKEN_ENDPOINT;\n }\n\n if (process.env.CSS_BASE_URL) {\n return `${ensureTrailingSlash(process.env.CSS_BASE_URL)}.oidc/token`;\n }\n\n return 'http://localhost:3000/.oidc/token';\n}\n\n/**\n * 创建 API 容器\n */\nexport function createApiContainer(config: ApiContainerConfig): AwilixContainer<ApiContainerCradle> {\n const container = createContainer<ApiContainerCradle>({\n injectionMode: InjectionMode.PROXY,\n strict: true,\n });\n\n // 注册配置\n container.register({\n config: asValue(config),\n });\n\n // 注册共享服务\n registerCommonServices(container);\n\n // 根据 edition 注册专属服务\n if (config.edition === 'cloud') {\n registerCloudServices(container);\n } else {\n registerLocalServices(container);\n }\n\n // 注册 Business Token (如果配置了 XPOD_BUSINESS_TOKEN)\n registerBusinessToken(container);\n\n return container;\n}\n\n/**\n * 从环境变量读取配置\n */\nexport function loadConfigFromEnv(): ApiContainerConfig {\n const edition = (process.env.XPOD_EDITION ?? 'local') as 'cloud' | 'local';\n\n // Port auto-increment: API_PORT = CSS_PORT + 1 if not explicitly set\n const cssPort = parseInt(process.env.CSS_PORT ?? '3000', 10);\n const apiPort = process.env.API_PORT\n ? parseInt(process.env.API_PORT, 10)\n : cssPort + 1;\n\n return {\n edition,\n port: apiPort,\n host: process.env.API_HOST ?? '0.0.0.0',\n socketPath: process.env.API_SOCKET_PATH,\n databaseUrl: process.env.CSS_IDENTITY_DB_URL ?? process.env.DATABASE_URL ?? '',\n corsOrigins: process.env.CORS_ORIGINS?.split(',').map(s => s.trim()) ?? ['*'],\n cssTokenEndpoint: resolveCssTokenEndpoint(),\n\n // 子域名配置 (cloud 模式)\n subdomain: {\n baseStorageDomain: process.env.CSS_BASE_STORAGE_DOMAIN,\n cloudflareAccountId: process.env.CLOUDFLARE_ACCOUNT_ID,\n cloudflareApiToken: process.env.CLOUDFLARE_API_TOKEN,\n tencentDnsSecretId: process.env.TENCENT_DNS_SECRET_ID,\n tencentDnsSecretKey: process.env.TENCENT_DNS_SECRET_KEY,\n },\n\n // Local 托管式:连接 Cloud\n cloudApiEndpoint: process.env.XPOD_CLOUD_API_ENDPOINT,\n nodeId: loadOrGenerateDeviceId(process.env.XPOD_NODE_ID),\n nodeToken: process.env.XPOD_NODE_TOKEN,\n\n // OIDC Issuer (Local 托管式使用 Cloud IdP)\n // 如果配置了 XPOD_NODE_TOKEN,默认使用 Cloud IdP\n oidcIssuer: process.env.XPOD_OIDC_ISSUER ?? process.env.CSS_OIDC_ISSUER ?? process.env.CSS_IDP_URL ?? (\n process.env.XPOD_NODE_TOKEN\n ? OFFICIAL_CLOUD_IDENTITY_ORIGIN\n : undefined\n ),\n\n // 隧道配置\n cloudflareTunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN,\n // Prefer SAKURA_TUNNEL_TOKEN; keep SAKURA_TOKEN for backward compatibility.\n sakuraTunnelToken: process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n\n // Edge 节点管理 (cloud 模式)\n edgeNodesEnabled: process.env.XPOD_EDGE_NODES_ENABLED === 'true',\n };\n}\n\n/**\n * 获取设备首个非内部网卡的 MAC 地址。\n * 返回小写冒号分隔格式,如 \"aa:bb:cc:dd:ee:ff\"。\n * 容器/虚拟机中可能拿不到稳定 MAC,此时返回 undefined。\n */\nfunction getFirstMacAddress(): string | undefined {\n const interfaces = os.networkInterfaces();\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (!iface.internal && iface.mac && iface.mac !== '00:00:00:00:00:00') {\n return iface.mac.toLowerCase();\n }\n }\n }\n return undefined;\n}\n\n/**\n * 读取或生成设备 ID(持久化到 data/.device-id)。\n *\n * 优先级:\n * 1. 环境变量 XPOD_NODE_ID\n * 2. 已持久化的 data/.device-id\n * 3. 基于 MAC 地址的 SHA-256 哈希(截取前 32 位 hex)\n * 4. 随机 UUID(容器/虚拟机无稳定 MAC 时兜底)\n *\n * 生成后写入 data/.device-id,后续启动直接读取,保证同一设备 ID 稳定。\n */\nfunction loadOrGenerateDeviceId(envNodeId?: string): string | undefined {\n if (envNodeId) {\n return envNodeId;\n }\n\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const deviceIdPath = path.join(rootDir, '.device-id');\n\n // 尝试从文件读取\n try {\n if (fs.existsSync(deviceIdPath)) {\n const content = fs.readFileSync(deviceIdPath, 'utf-8').trim();\n if (content) {\n return content;\n }\n }\n } catch {\n // 读取失败,继续生成\n }\n\n // 优先用 MAC 哈希,拿不到则 UUID 兜底\n const mac = getFirstMacAddress();\n const deviceId = mac\n ? createHash('sha256').update(mac).digest('hex').slice(0, 32)\n : randomUUID();\n\n try {\n if (!fs.existsSync(rootDir)) {\n fs.mkdirSync(rootDir, { recursive: true });\n }\n fs.writeFileSync(deviceIdPath, deviceId, 'utf-8');\n } catch {\n // 写入失败不阻塞启动\n }\n\n return deviceId;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/container/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * API Container 入口\n *\n * 使用 Awilix 进行依赖注入,根据 edition 注册不同服务\n */\n\nimport { createContainer, asValue, InjectionMode, type AwilixContainer } from 'awilix';\nimport { randomUUID, createHash } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport { registerCommonServices } from './common';\nimport { registerCloudServices } from './cloud';\nimport { registerLocalServices } from './local';\nimport { registerBusinessToken } from './business-token';\n\nexport type { ApiContainerCradle, ApiContainerConfig } from './types';\n\nconst OFFICIAL_CLOUD_IDENTITY_ORIGIN = 'https://id.undefineds.co';\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveCssTokenEndpoint(): string {\n if (process.env.CSS_TOKEN_ENDPOINT) {\n return process.env.CSS_TOKEN_ENDPOINT;\n }\n\n if (process.env.CSS_BASE_URL) {\n return `${ensureTrailingSlash(process.env.CSS_BASE_URL)}.oidc/token`;\n }\n\n return 'http://localhost:3000/.oidc/token';\n}\n\n/**\n * 创建 API 容器\n */\nexport function createApiContainer(config: ApiContainerConfig): AwilixContainer<ApiContainerCradle> {\n const container = createContainer<ApiContainerCradle>({\n injectionMode: InjectionMode.PROXY,\n strict: true,\n });\n\n // 注册配置\n container.register({\n config: asValue(config),\n });\n\n // 注册共享服务\n registerCommonServices(container);\n\n // 根据 edition 注册专属服务\n if (config.edition === 'cloud') {\n registerCloudServices(container);\n } else {\n registerLocalServices(container);\n }\n\n // 注册 Business Token (如果配置了 XPOD_BUSINESS_TOKEN)\n registerBusinessToken(container);\n\n return container;\n}\n\n/**\n * 从环境变量读取配置\n */\nexport function loadConfigFromEnv(): ApiContainerConfig {\n const edition = (process.env.XPOD_EDITION ?? 'local') as 'cloud' | 'local';\n\n // Port auto-increment: API_PORT = CSS_PORT + 1 if not explicitly set\n const cssPort = parseInt(process.env.CSS_PORT ?? '3000', 10);\n const apiPort = process.env.API_PORT\n ? parseInt(process.env.API_PORT, 10)\n : cssPort + 1;\n\n return {\n edition,\n port: apiPort,\n host: process.env.API_HOST ?? '0.0.0.0',\n socketPath: process.env.API_SOCKET_PATH,\n databaseUrl: process.env.CSS_IDENTITY_DB_URL ?? process.env.DATABASE_URL ?? '',\n corsOrigins: process.env.CORS_ORIGINS?.split(',').map(s => s.trim()) ?? ['*'],\n cssTokenEndpoint: resolveCssTokenEndpoint(),\n\n // 子域名配置 (cloud 模式)\n subdomain: {\n baseStorageDomain: process.env.CSS_BASE_STORAGE_DOMAIN,\n cloudflareAccountId: process.env.CLOUDFLARE_ACCOUNT_ID,\n cloudflareApiToken: process.env.CLOUDFLARE_API_TOKEN,\n tencentDnsSecretId: process.env.TENCENT_DNS_SECRET_ID,\n tencentDnsSecretKey: process.env.TENCENT_DNS_SECRET_KEY,\n },\n\n // Local 托管式:连接 Cloud\n cloudApiEndpoint: process.env.XPOD_CLOUD_API_ENDPOINT,\n nodeId: loadOrGenerateDeviceId(process.env.XPOD_NODE_ID),\n nodeToken: process.env.XPOD_NODE_TOKEN,\n\n // OIDC Issuer (Local 托管式使用 Cloud IdP)\n // 如果配置了 XPOD_NODE_TOKEN,默认使用 Cloud IdP\n oidcIssuer: process.env.CSS_OIDC_ISSUER ?? (\n process.env.XPOD_NODE_TOKEN\n ? OFFICIAL_CLOUD_IDENTITY_ORIGIN\n : undefined\n ),\n\n // 隧道配置\n cloudflareTunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN,\n // Prefer SAKURA_TUNNEL_TOKEN; keep SAKURA_TOKEN for backward compatibility.\n sakuraTunnelToken: process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n\n // Edge 节点管理 (cloud 模式)\n edgeNodesEnabled: process.env.XPOD_EDGE_NODES_ENABLED === 'true',\n };\n}\n\n/**\n * 获取设备首个非内部网卡的 MAC 地址。\n * 返回小写冒号分隔格式,如 \"aa:bb:cc:dd:ee:ff\"。\n * 容器/虚拟机中可能拿不到稳定 MAC,此时返回 undefined。\n */\nfunction getFirstMacAddress(): string | undefined {\n const interfaces = os.networkInterfaces();\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (!iface.internal && iface.mac && iface.mac !== '00:00:00:00:00:00') {\n return iface.mac.toLowerCase();\n }\n }\n }\n return undefined;\n}\n\n/**\n * 读取或生成设备 ID(持久化到 data/.device-id)。\n *\n * 优先级:\n * 1. 环境变量 XPOD_NODE_ID\n * 2. 已持久化的 data/.device-id\n * 3. 基于 MAC 地址的 SHA-256 哈希(截取前 32 位 hex)\n * 4. 随机 UUID(容器/虚拟机无稳定 MAC 时兜底)\n *\n * 生成后写入 data/.device-id,后续启动直接读取,保证同一设备 ID 稳定。\n */\nfunction loadOrGenerateDeviceId(envNodeId?: string): string | undefined {\n if (envNodeId) {\n return envNodeId;\n }\n\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const deviceIdPath = path.join(rootDir, '.device-id');\n\n // 尝试从文件读取\n try {\n if (fs.existsSync(deviceIdPath)) {\n const content = fs.readFileSync(deviceIdPath, 'utf-8').trim();\n if (content) {\n return content;\n }\n }\n } catch {\n // 读取失败,继续生成\n }\n\n // 优先用 MAC 哈希,拿不到则 UUID 兜底\n const mac = getFirstMacAddress();\n const deviceId = mac\n ? createHash('sha256').update(mac).digest('hex').slice(0, 32)\n : randomUUID();\n\n try {\n if (!fs.existsSync(rootDir)) {\n fs.mkdirSync(rootDir, { recursive: true });\n }\n fs.writeFileSync(deviceIdPath, deviceId, 'utf-8');\n } catch {\n // 写入失败不阻塞启动\n }\n\n return deviceId;\n}\n"]}
@@ -20,7 +20,8 @@ export declare class VercelChatService {
20
20
  */
21
21
  private createStoreContext;
22
22
  private getAiGatewayBaseUrl;
23
- private getAiGatewayTimeoutMs;
23
+ private getAiGatewayQueryTimeoutMs;
24
+ private getAiGatewayGenerationTimeoutMs;
24
25
  private getAiGatewayApiKey;
25
26
  private shouldUseAiGateway;
26
27
  private toModelId;
@@ -27,7 +27,8 @@ class VercelChatService {
27
27
  this.aiGatewayTransport = new ai_gateway_transport_1.AiGatewayTransport({
28
28
  getBaseUrl: () => this.getAiGatewayBaseUrl(),
29
29
  getApiKey: () => this.getAiGatewayApiKey(),
30
- getTimeoutMs: () => this.getAiGatewayTimeoutMs(),
30
+ getQueryTimeoutMs: () => this.getAiGatewayQueryTimeoutMs(),
31
+ getGenerationTimeoutMs: () => this.getAiGatewayGenerationTimeoutMs(),
31
32
  });
32
33
  }
33
34
  /**
@@ -49,8 +50,11 @@ class VercelChatService {
49
50
  getAiGatewayBaseUrl() {
50
51
  return (0, platform_ai_config_1.getAiGatewayBaseUrl)() ?? null;
51
52
  }
52
- getAiGatewayTimeoutMs() {
53
- return (0, platform_ai_config_1.getPlatformTimeoutMs)();
53
+ getAiGatewayQueryTimeoutMs() {
54
+ return (0, platform_ai_config_1.getPlatformQueryTimeoutMs)();
55
+ }
56
+ getAiGatewayGenerationTimeoutMs() {
57
+ return (0, platform_ai_config_1.getPlatformGenerationTimeoutMs)();
54
58
  }
55
59
  getAiGatewayApiKey() {
56
60
  return (0, platform_ai_config_1.getAiGatewayApiKey)() ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"VercelChatService.js","sourceRoot":"","sources":["../../../src/api/service/VercelChatService.ts"],"names":[],"mappings":"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","sourcesContent":["import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { ProxyAgent } from 'undici';\nimport type { ChatCompletionRequest, ChatCompletionResponse } from '../handlers/ChatHandler';\nimport type { PodChatKitStore } from '../chatkit/pod-store';\nimport type { StoreContext } from '../chatkit/store';\nimport { type AuthContext, getWebId, getAccountId, getDisplayName } from '../auth/AuthContext';\nimport { CredentialStatus } from '../../credential/schema/types';\nimport type { UsageRepository } from '../../storage/quota/UsageRepository';\nimport type { QuotaService } from '../../quota/QuotaService';\nimport {\n getDefaultBaseUrl,\n} from './provider-registry';\nimport {\n getAiGatewayApiKey,\n getAiGatewayBaseUrl,\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformTimeoutMs,\n} from './platform-ai-config';\nimport {\n buildChatCompletionsBodyFromMessages,\n extractPromptFromMessagesBody,\n extractPromptFromResponsesBody,\n mapChatCompletionToMessagesResponse,\n sanitizeAiGatewayResponsesBody,\n} from './chat-protocol-adapters';\nimport { AiGatewayTransport } from './ai-gateway-transport';\nimport { ProviderHttpTransport } from './provider-http-transport';\nimport {\n resolveChatExecutionRoute,\n resolveMessagesProviderRoute,\n resolveResponsesProviderRoute,\n} from './chat-routing';\n\n// Create a proxy-aware fetch function\nfunction createProxyFetch(proxyUrl: string): typeof fetch {\n const agent = new ProxyAgent(proxyUrl);\n return (url, init) => fetch(url, { ...init, dispatcher: agent } as any);\n}\n\ninterface ProviderConfig {\n baseURL: string;\n apiKey: string;\n proxy?: string;\n credentialId?: string;\n}\n\nexport class VercelChatService {\n private readonly logger = getLoggerFor(this);\n private usageRepo?: UsageRepository;\n private quotaService?: QuotaService;\n private readonly aiGatewayTransport: AiGatewayTransport;\n private readonly providerHttpTransport = new ProviderHttpTransport();\n\n public constructor(private readonly store: PodChatKitStore) {\n this.logger.info('Initializing VercelChatService with Pod-based config support');\n this.aiGatewayTransport = new AiGatewayTransport({\n getBaseUrl: () => this.getAiGatewayBaseUrl(),\n getApiKey: () => this.getAiGatewayApiKey(),\n getTimeoutMs: () => this.getAiGatewayTimeoutMs(),\n });\n }\n\n /**\n * Set optional usage tracking dependencies (injected after construction)\n */\n public setUsageTracking(usageRepo: UsageRepository, quotaService: QuotaService): void {\n this.usageRepo = usageRepo;\n this.quotaService = quotaService;\n }\n\n /**\n * Create a StoreContext from AuthContext for Pod operations\n */\n private createStoreContext(auth: AuthContext): StoreContext {\n return {\n userId: getWebId(auth) ?? getAccountId(auth) ?? 'anonymous',\n auth,\n };\n }\n\n private getAiGatewayBaseUrl(): string | null {\n return getAiGatewayBaseUrl() ?? null;\n }\n\n private getAiGatewayTimeoutMs(): number {\n return getPlatformTimeoutMs();\n }\n\n private getAiGatewayApiKey(): string | null {\n return getAiGatewayApiKey() ?? null;\n }\n\n private async shouldUseAiGateway(model?: string): Promise<boolean> {\n return this.aiGatewayTransport.shouldHandleModel(model);\n }\n\n private toModelId(model: any): string {\n return typeof model?.id === 'string' ? model.id : JSON.stringify(model);\n }\n\n private pushModelsWithDedup(models: any[], seenModelIds: Set<string>, items: any[]): void {\n for (const model of items) {\n const modelId = this.toModelId(model);\n if (seenModelIds.has(modelId)) {\n continue;\n }\n seenModelIds.add(modelId);\n models.push(model);\n }\n }\n\n private async forwardAiGatewayJson(path: string, body: unknown, _auth: AuthContext): Promise<any> {\n return this.aiGatewayTransport.sendJson(path, body);\n }\n\n private async forwardAiGatewayStream(path: string, body: unknown, _auth: AuthContext): Promise<{\n toTextStreamResponse: () => Response;\n }> {\n return this.aiGatewayTransport.sendStream(path, body);\n }\n\n private getProviderChatCompletionsUrl(baseURL: string): string {\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n return cleanBaseUrl.endsWith('/chat/completions')\n ? cleanBaseUrl\n : `${cleanBaseUrl}/chat/completions`;\n }\n\n private extractTotalTokens(usage: any): number {\n if (!usage || typeof usage !== 'object') {\n return 0;\n }\n\n if (typeof usage.total_tokens === 'number') {\n return usage.total_tokens;\n }\n if (typeof usage.totalTokens === 'number') {\n return usage.totalTokens;\n }\n if (typeof usage.input_tokens === 'number' || typeof usage.output_tokens === 'number') {\n return (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0);\n }\n if (typeof usage.prompt_tokens === 'number' || typeof usage.completion_tokens === 'number') {\n return (usage.prompt_tokens ?? 0) + (usage.completion_tokens ?? 0);\n }\n\n return 0;\n }\n\n private recordForwardedUsage(accountId: string | undefined, podId: string, payload: any): void {\n const totalTokens = this.extractTotalTokens(payload?.usage);\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, podId, totalTokens);\n }\n }\n\n private async getProviderConfig(context: StoreContext): Promise<ProviderConfig | null> {\n let config: Awaited<ReturnType<PodChatKitStore['getAiConfig']>> | undefined;\n try {\n config = await this.store.getAiConfig(context);\n this.logger.info(`Pod config: ${JSON.stringify(config)}`);\n } catch (error) {\n this.logger.warn(`Failed to get Pod config, falling back to defaults: ${error}`);\n config = undefined;\n }\n\n // Priority: Pod config > Platform Provider\n if (config?.apiKey) {\n const baseURL = config.baseUrl || getDefaultBaseUrl();\n const proxy = config.proxyUrl;\n this.logger.info(`Provider config: baseURL=${baseURL}, proxy=${proxy || 'none'} (source=pod)`);\n return { baseURL, apiKey: config.apiKey, proxy, credentialId: config.credentialId };\n }\n\n // 平台 Provider\n const platformBase = getPlatformApiBaseUrl();\n if (platformBase) {\n this.logger.info(`Provider config: baseURL=${platformBase}, proxy=none (source=platform)`);\n return { baseURL: platformBase, apiKey: getPlatformApiKey(), proxy: undefined, credentialId: undefined };\n }\n\n this.logger.warn('No AI provider config found in Pod or DEFAULT_API_BASE');\n return null;\n }\n\n private async getProvider(context: StoreContext) {\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL, apiKey, proxy } = providerConfig;\n\n this.logger.debug(`Using AI Provider: ${baseURL} (key length: ${apiKey?.length || 0}, proxy: ${proxy || 'none'})`);\n\n const options: any = { baseURL, apiKey };\n if (proxy) {\n options.fetch = createProxyFetch(proxy);\n }\n\n return createOpenAI(options);\n }\n\n public async complete(request: ChatCompletionRequest, auth: AuthContext): Promise<ChatCompletionResponse> {\n const { model } = request;\n const context = this.createStoreContext(auth);\n const accountId = getAccountId(auth);\n if (accountId) {\n await this.checkTokenQuota(accountId);\n }\n\n if (await resolveChatExecutionRoute({ model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding chat completion for model ${model} to ai-gateway`);\n const result = await this.forwardAiGatewayJson('/v1/chat/completions', request, auth) as ChatCompletionResponse;\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const config = await this.getProviderConfig(context);\n if (!config) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url: this.getProviderChatCompletionsUrl(config.baseURL),\n apiKey: config.apiKey,\n proxy: config.proxy,\n body: request,\n }) as ChatCompletionResponse;\n\n // Record successful API call\n if (config?.credentialId) {\n this.store.recordCredentialSuccess(context, config.credentialId).catch((err) => {\n this.logger.debug(`Failed to record credential success: ${err}`);\n });\n }\n\n // Record token usage\n const totalTokens = this.extractTotalTokens(result.usage);\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, String(context.userId), totalTokens);\n }\n\n return result;\n } catch (error) {\n this.logger.error(`AI completion failed: ${error}`);\n\n // Handle error and update credential status\n if (config?.credentialId) {\n await this.handleApiError(error, context, config.credentialId);\n }\n\n throw error;\n }\n }\n\n public async stream(request: ChatCompletionRequest, auth: AuthContext): Promise<any> {\n const { model } = request;\n const context = this.createStoreContext(auth);\n\n if (await resolveChatExecutionRoute({ model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding chat stream for model ${model} to ai-gateway`);\n return this.forwardAiGatewayStream('/v1/chat/completions', request, auth);\n }\n\n const config = await this.getProviderConfig(context);\n\n if (!config) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const response = await this.providerHttpTransport.postStream({\n url: this.getProviderChatCompletionsUrl(config.baseURL),\n apiKey: config.apiKey,\n proxy: config.proxy,\n body: request,\n headers: {\n Accept: 'text/event-stream',\n },\n });\n\n return {\n toTextStreamResponse: () => new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n }),\n };\n }\n\n public async responses(body: any, auth: AuthContext): Promise<any> {\n const context = this.createStoreContext(auth);\n const displayName = getDisplayName(auth) || context.userId;\n const accountId = getAccountId(auth);\n\n if (await resolveChatExecutionRoute({ model: body?.model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding responses request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const sanitizedBody = sanitizeAiGatewayResponsesBody(body);\n const result = await this.forwardAiGatewayJson('/v1/responses', sanitizedBody, auth);\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL } = providerConfig;\n\n // Only OpenAI natively supports /v1/responses; all others go through Chat Completions\n if (resolveResponsesProviderRoute(baseURL) === 'chat-fallback') {\n this.logger.info(`Provider ${baseURL} does not support Responses API, converting to Chat Completions for ${displayName} (acc: ${accountId})`);\n return this.responsesViaCompletions(body, context, providerConfig);\n }\n\n const { apiKey, proxy, credentialId } = providerConfig;\n\n // Remove trailing slash if present\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const url = `${cleanBaseUrl}/responses`;\n\n this.logger.info(`Proxying responses request to ${url} for ${displayName} (acc: ${accountId}), proxy: ${proxy || 'none'}`);\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url,\n apiKey,\n proxy,\n body,\n });\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n return result;\n } catch (error) {\n const status = (error as any)?.status;\n const headers = (error as any)?.headers;\n const bodyText = (error as any)?.body;\n if (typeof status === 'number') {\n this.logger.error(`Responses API failed: ${status} ${bodyText ?? ''}`);\n if (credentialId) {\n await this.handleApiError(\n { status, headers },\n context,\n credentialId,\n );\n }\n } else if (credentialId) {\n await this.handleApiError(error, context, credentialId);\n }\n throw error;\n }\n }\n\n public async messages(body: any, auth: AuthContext): Promise<any> {\n const context = this.createStoreContext(auth);\n const displayName = getDisplayName(auth) || context.userId;\n const accountId = getAccountId(auth);\n\n if (await resolveChatExecutionRoute({ model: body?.model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding messages request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const completionBody = buildChatCompletionsBodyFromMessages(body);\n const completion = await this.forwardAiGatewayJson('/v1/chat/completions', completionBody, auth);\n const result = mapChatCompletionToMessagesResponse(body, completion);\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL } = providerConfig;\n\n // Only Anthropic natively supports /v1/messages; all others go through Chat Completions\n if (resolveMessagesProviderRoute(baseURL) === 'chat-fallback') {\n this.logger.info(`Provider ${baseURL} does not support Messages API, converting to Chat Completions for ${displayName} (acc: ${accountId})`);\n return this.messagesViaCompletions(body, context, providerConfig);\n }\n\n const { apiKey, proxy, credentialId } = providerConfig;\n\n // Remove trailing slash if present\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const url = `${cleanBaseUrl}/messages`;\n\n this.logger.info(`Proxying messages request to ${url} for ${displayName} (acc: ${accountId}), proxy: ${proxy || 'none'}`);\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url,\n apiKey,\n proxy,\n body,\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n });\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n return result;\n } catch (error) {\n const status = (error as any)?.status;\n const headers = (error as any)?.headers;\n const bodyText = (error as any)?.body;\n if (typeof status === 'number') {\n this.logger.error(`Messages API failed: ${status} ${bodyText ?? ''}`);\n if (credentialId) {\n await this.handleApiError(\n { status, headers },\n context,\n credentialId,\n );\n }\n } else if (credentialId) {\n await this.handleApiError(error, context, credentialId);\n }\n throw error;\n }\n }\n\n\n\n\n private async responsesViaCompletions(\n body: any,\n context: StoreContext,\n providerConfig: { baseURL: string; apiKey: string; proxy?: string; credentialId?: string },\n ): Promise<any> {\n const prompt = extractPromptFromResponsesBody(body);\n const model = body?.model || getPlatformDefaultModel();\n\n const provider = await this.getProvider(context);\n const result = await generateText({\n model: provider.chat(model),\n messages: [{ role: 'user' as const, content: prompt }],\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_output_tokens != null ? { maxTokens: body.max_output_tokens } : {}),\n } as any);\n\n if (providerConfig.credentialId) {\n this.store.recordCredentialSuccess(context, providerConfig.credentialId).catch(() => {});\n }\n\n const outputText = result.text;\n const now = Math.floor(Date.now() / 1000);\n return {\n id: `resp_${Date.now()}`,\n object: 'response',\n created: now,\n status: 'completed',\n model,\n output: [{\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: outputText }],\n }],\n usage: {\n input_tokens: (result.usage as any)?.promptTokens ?? prompt.length,\n output_tokens: (result.usage as any)?.completionTokens ?? outputText.length,\n total_tokens: (result.usage as any)?.totalTokens ?? (prompt.length + outputText.length),\n },\n };\n }\n\n private async messagesViaCompletions(\n body: any,\n context: StoreContext,\n providerConfig: { baseURL: string; apiKey: string; proxy?: string; credentialId?: string },\n ): Promise<any> {\n const prompt = extractPromptFromMessagesBody(body);\n const model = body?.model || getPlatformDefaultModel();\n\n const coreMessages: any[] = [];\n if (body?.system) {\n const systemText = typeof body.system === 'string'\n ? body.system\n : Array.isArray(body.system)\n ? body.system.map((b: any) => b?.text ?? '').join('\\n')\n : '';\n if (systemText) {\n coreMessages.push({ role: 'system', content: systemText });\n }\n }\n if (Array.isArray(body?.messages)) {\n for (const msg of body.messages) {\n if (msg?.role && msg?.content != null) {\n const content = typeof msg.content === 'string'\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content.filter((p: any) => p?.type === 'text').map((p: any) => p.text).join('\\n')\n : String(msg.content);\n coreMessages.push({ role: msg.role, content });\n }\n }\n }\n if (coreMessages.length === 0) {\n coreMessages.push({ role: 'user', content: prompt });\n }\n\n const provider = await this.getProvider(context);\n const result = await generateText({\n model: provider.chat(model),\n messages: coreMessages,\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_tokens != null ? { maxTokens: body.max_tokens } : {}),\n } as any);\n\n if (providerConfig.credentialId) {\n this.store.recordCredentialSuccess(context, providerConfig.credentialId).catch(() => {});\n }\n\n const text = result.text;\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model,\n content: [{ type: 'text', text }],\n stop_reason: 'end_turn',\n stop_sequence: null,\n usage: {\n input_tokens: (result.usage as any)?.promptTokens ?? prompt.length,\n output_tokens: (result.usage as any)?.completionTokens ?? text.length,\n },\n };\n }\n\n public async listModels(_auth?: AuthContext): Promise<any[]> {\n const models: any[] = [];\n const seenModelIds = new Set<string>();\n\n if (_auth) {\n try {\n const context = this.createStoreContext(_auth);\n const userModels = await this.store.listAvailableModels(context);\n this.pushModelsWithDedup(models, seenModelIds, userModels);\n } catch (error) {\n this.logger.warn(`Failed to load user Pod models: ${error}`);\n }\n }\n\n const aiGatewayModels = await this.aiGatewayTransport.listModels();\n if (aiGatewayModels) {\n this.pushModelsWithDedup(models, seenModelIds, aiGatewayModels);\n }\n\n // 平台 Provider 模型(从 DEFAULT_API_BASE 获取)\n const platformBase = getPlatformApiBaseUrl();\n const platformKey = getPlatformApiKey();\n const aiGatewayBase = this.getAiGatewayBaseUrl();\n const normalizedAiGatewayModelsUrl = aiGatewayBase\n ? this.aiGatewayTransport.buildUrl('/v1/models')\n : undefined;\n const normalizedPlatformModelsUrl = platformBase\n ? `${platformBase.replace(/\\/$/, '')}/models`\n : undefined;\n if (platformBase && normalizedPlatformModelsUrl !== normalizedAiGatewayModelsUrl) {\n try {\n const url = normalizedPlatformModelsUrl!;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (platformKey) {\n headers['Authorization'] = `Bearer ${platformKey}`;\n }\n const resp = await fetch(url, { headers });\n if (resp.ok) {\n const data = await resp.json() as { data?: any[] };\n if (Array.isArray(data.data)) {\n this.pushModelsWithDedup(models, seenModelIds, data.data);\n }\n } else {\n this.logger.warn(`Failed to fetch platform models: ${resp.status}`);\n }\n } catch (error) {\n this.logger.warn(`Failed to fetch platform models: ${error}`);\n }\n }\n\n return models;\n }\n /**\n * Handle API errors and update credential status accordingly\n */\n private async handleApiError(\n error: unknown,\n context: StoreContext,\n credentialId: string,\n ): Promise<void> {\n const errorInfo = this.parseApiError(error);\n\n if (errorInfo.statusCode === 429) {\n // Rate limit error - mark credential as rate limited\n const resetAt = errorInfo.retryAfter\n ? new Date(Date.now() + errorInfo.retryAfter * 1000)\n : new Date(Date.now() + 60000); // Default 1 minute cooldown\n\n this.logger.warn(`Rate limit hit for credential ${credentialId}, reset at: ${resetAt.toISOString()}`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.RATE_LIMITED,\n { rateLimitResetAt: resetAt },\n );\n } else if (errorInfo.statusCode === 401 || errorInfo.statusCode === 403) {\n // Auth error - mark credential as inactive\n this.logger.warn(`Auth error for credential ${credentialId}, marking as inactive`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.INACTIVE,\n { incrementFailCount: true },\n );\n } else if (errorInfo.statusCode >= 500) {\n // Server error - increment fail count but keep active\n this.logger.warn(`Server error ${errorInfo.statusCode} for credential ${credentialId}`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.ACTIVE,\n { incrementFailCount: true },\n );\n }\n }\n\n /**\n * Parse error to extract status code and retry-after header\n */\n private parseApiError(error: unknown): { statusCode: number; retryAfter?: number } {\n // Handle different error formats from AI SDK\n if (error && typeof error === 'object') {\n const err = error as any;\n\n // Direct status code\n if (typeof err.status === 'number') {\n return {\n statusCode: err.status,\n retryAfter: err.retryAfter || err.headers?.['retry-after'],\n };\n }\n\n // Nested response object\n if (err.response && typeof err.response.status === 'number') {\n return {\n statusCode: err.response.status,\n retryAfter: err.response.headers?.get?.('retry-after'),\n };\n }\n\n // Error message parsing (fallback)\n if (err.message) {\n const match = err.message.match(/(\\d{3})/);\n if (match) {\n return { statusCode: parseInt(match[1], 10) };\n }\n }\n }\n\n return { statusCode: 0 };\n }\n\n /**\n * Check if account has remaining token quota\n */\n private async checkTokenQuota(accountId: string): Promise<void> {\n if (!this.quotaService || !this.usageRepo) {\n return; // No quota enforcement if not configured\n }\n\n try {\n const quota = await this.quotaService.getAccountQuota(accountId);\n if (!quota.tokenLimitMonthly) {\n return; // No limit set\n }\n\n const usage = await this.usageRepo.getAccountUsage(accountId);\n const tokensUsed = usage?.tokensUsed ?? 0;\n\n if (tokensUsed >= quota.tokenLimitMonthly) {\n const err = new Error('Token quota exceeded for this month');\n (err as any).code = 'quota_exceeded';\n throw err;\n }\n } catch (error) {\n if ((error as any).code === 'quota_exceeded') {\n throw error;\n }\n // Log but don't block on quota check errors\n this.logger.warn(`Token quota check failed: ${error}`);\n }\n }\n\n /**\n * Record token usage (fire-and-forget)\n */\n private recordTokenUsage(accountId: string, podId: string, tokens: number): void {\n if (!this.usageRepo) {\n return;\n }\n\n this.usageRepo.incrementTokenUsage(accountId, podId, tokens).catch((err) => {\n this.logger.warn(`Failed to record token usage: ${err}`);\n });\n }\n}\n"]}
1
+ {"version":3,"file":"VercelChatService.js","sourceRoot":"","sources":["../../../src/api/service/VercelChatService.ts"],"names":[],"mappings":"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","sourcesContent":["import { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText } from 'ai';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { ProxyAgent } from 'undici';\nimport type { ChatCompletionRequest, ChatCompletionResponse } from '../handlers/ChatHandler';\nimport type { PodChatKitStore } from '../chatkit/pod-store';\nimport type { StoreContext } from '../chatkit/store';\nimport { type AuthContext, getWebId, getAccountId, getDisplayName } from '../auth/AuthContext';\nimport { CredentialStatus } from '../../credential/schema/types';\nimport type { UsageRepository } from '../../storage/quota/UsageRepository';\nimport type { QuotaService } from '../../quota/QuotaService';\nimport {\n getDefaultBaseUrl,\n} from './provider-registry';\nimport {\n getAiGatewayApiKey,\n getAiGatewayBaseUrl,\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformGenerationTimeoutMs,\n getPlatformQueryTimeoutMs,\n} from './platform-ai-config';\nimport {\n buildChatCompletionsBodyFromMessages,\n extractPromptFromMessagesBody,\n extractPromptFromResponsesBody,\n mapChatCompletionToMessagesResponse,\n sanitizeAiGatewayResponsesBody,\n} from './chat-protocol-adapters';\nimport { AiGatewayTransport } from './ai-gateway-transport';\nimport { ProviderHttpTransport } from './provider-http-transport';\nimport {\n resolveChatExecutionRoute,\n resolveMessagesProviderRoute,\n resolveResponsesProviderRoute,\n} from './chat-routing';\n\n// Create a proxy-aware fetch function\nfunction createProxyFetch(proxyUrl: string): typeof fetch {\n const agent = new ProxyAgent(proxyUrl);\n return (url, init) => fetch(url, { ...init, dispatcher: agent } as any);\n}\n\ninterface ProviderConfig {\n baseURL: string;\n apiKey: string;\n proxy?: string;\n credentialId?: string;\n}\n\nexport class VercelChatService {\n private readonly logger = getLoggerFor(this);\n private usageRepo?: UsageRepository;\n private quotaService?: QuotaService;\n private readonly aiGatewayTransport: AiGatewayTransport;\n private readonly providerHttpTransport = new ProviderHttpTransport();\n\n public constructor(private readonly store: PodChatKitStore) {\n this.logger.info('Initializing VercelChatService with Pod-based config support');\n this.aiGatewayTransport = new AiGatewayTransport({\n getBaseUrl: () => this.getAiGatewayBaseUrl(),\n getApiKey: () => this.getAiGatewayApiKey(),\n getQueryTimeoutMs: () => this.getAiGatewayQueryTimeoutMs(),\n getGenerationTimeoutMs: () => this.getAiGatewayGenerationTimeoutMs(),\n });\n }\n\n /**\n * Set optional usage tracking dependencies (injected after construction)\n */\n public setUsageTracking(usageRepo: UsageRepository, quotaService: QuotaService): void {\n this.usageRepo = usageRepo;\n this.quotaService = quotaService;\n }\n\n /**\n * Create a StoreContext from AuthContext for Pod operations\n */\n private createStoreContext(auth: AuthContext): StoreContext {\n return {\n userId: getWebId(auth) ?? getAccountId(auth) ?? 'anonymous',\n auth,\n };\n }\n\n private getAiGatewayBaseUrl(): string | null {\n return getAiGatewayBaseUrl() ?? null;\n }\n\n private getAiGatewayQueryTimeoutMs(): number {\n return getPlatformQueryTimeoutMs();\n }\n\n private getAiGatewayGenerationTimeoutMs(): number {\n return getPlatformGenerationTimeoutMs();\n }\n\n private getAiGatewayApiKey(): string | null {\n return getAiGatewayApiKey() ?? null;\n }\n\n private async shouldUseAiGateway(model?: string): Promise<boolean> {\n return this.aiGatewayTransport.shouldHandleModel(model);\n }\n\n private toModelId(model: any): string {\n return typeof model?.id === 'string' ? model.id : JSON.stringify(model);\n }\n\n private pushModelsWithDedup(models: any[], seenModelIds: Set<string>, items: any[]): void {\n for (const model of items) {\n const modelId = this.toModelId(model);\n if (seenModelIds.has(modelId)) {\n continue;\n }\n seenModelIds.add(modelId);\n models.push(model);\n }\n }\n\n private async forwardAiGatewayJson(path: string, body: unknown, _auth: AuthContext): Promise<any> {\n return this.aiGatewayTransport.sendJson(path, body);\n }\n\n private async forwardAiGatewayStream(path: string, body: unknown, _auth: AuthContext): Promise<{\n toTextStreamResponse: () => Response;\n }> {\n return this.aiGatewayTransport.sendStream(path, body);\n }\n\n private getProviderChatCompletionsUrl(baseURL: string): string {\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n return cleanBaseUrl.endsWith('/chat/completions')\n ? cleanBaseUrl\n : `${cleanBaseUrl}/chat/completions`;\n }\n\n private extractTotalTokens(usage: any): number {\n if (!usage || typeof usage !== 'object') {\n return 0;\n }\n\n if (typeof usage.total_tokens === 'number') {\n return usage.total_tokens;\n }\n if (typeof usage.totalTokens === 'number') {\n return usage.totalTokens;\n }\n if (typeof usage.input_tokens === 'number' || typeof usage.output_tokens === 'number') {\n return (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0);\n }\n if (typeof usage.prompt_tokens === 'number' || typeof usage.completion_tokens === 'number') {\n return (usage.prompt_tokens ?? 0) + (usage.completion_tokens ?? 0);\n }\n\n return 0;\n }\n\n private recordForwardedUsage(accountId: string | undefined, podId: string, payload: any): void {\n const totalTokens = this.extractTotalTokens(payload?.usage);\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, podId, totalTokens);\n }\n }\n\n private async getProviderConfig(context: StoreContext): Promise<ProviderConfig | null> {\n let config: Awaited<ReturnType<PodChatKitStore['getAiConfig']>> | undefined;\n try {\n config = await this.store.getAiConfig(context);\n this.logger.info(`Pod config: ${JSON.stringify(config)}`);\n } catch (error) {\n this.logger.warn(`Failed to get Pod config, falling back to defaults: ${error}`);\n config = undefined;\n }\n\n // Priority: Pod config > Platform Provider\n if (config?.apiKey) {\n const baseURL = config.baseUrl || getDefaultBaseUrl();\n const proxy = config.proxyUrl;\n this.logger.info(`Provider config: baseURL=${baseURL}, proxy=${proxy || 'none'} (source=pod)`);\n return { baseURL, apiKey: config.apiKey, proxy, credentialId: config.credentialId };\n }\n\n // 平台 Provider\n const platformBase = getPlatformApiBaseUrl();\n if (platformBase) {\n this.logger.info(`Provider config: baseURL=${platformBase}, proxy=none (source=platform)`);\n return { baseURL: platformBase, apiKey: getPlatformApiKey(), proxy: undefined, credentialId: undefined };\n }\n\n this.logger.warn('No AI provider config found in Pod or DEFAULT_API_BASE');\n return null;\n }\n\n private async getProvider(context: StoreContext) {\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL, apiKey, proxy } = providerConfig;\n\n this.logger.debug(`Using AI Provider: ${baseURL} (key length: ${apiKey?.length || 0}, proxy: ${proxy || 'none'})`);\n\n const options: any = { baseURL, apiKey };\n if (proxy) {\n options.fetch = createProxyFetch(proxy);\n }\n\n return createOpenAI(options);\n }\n\n public async complete(request: ChatCompletionRequest, auth: AuthContext): Promise<ChatCompletionResponse> {\n const { model } = request;\n const context = this.createStoreContext(auth);\n const accountId = getAccountId(auth);\n if (accountId) {\n await this.checkTokenQuota(accountId);\n }\n\n if (await resolveChatExecutionRoute({ model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding chat completion for model ${model} to ai-gateway`);\n const result = await this.forwardAiGatewayJson('/v1/chat/completions', request, auth) as ChatCompletionResponse;\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const config = await this.getProviderConfig(context);\n if (!config) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url: this.getProviderChatCompletionsUrl(config.baseURL),\n apiKey: config.apiKey,\n proxy: config.proxy,\n body: request,\n }) as ChatCompletionResponse;\n\n // Record successful API call\n if (config?.credentialId) {\n this.store.recordCredentialSuccess(context, config.credentialId).catch((err) => {\n this.logger.debug(`Failed to record credential success: ${err}`);\n });\n }\n\n // Record token usage\n const totalTokens = this.extractTotalTokens(result.usage);\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, String(context.userId), totalTokens);\n }\n\n return result;\n } catch (error) {\n this.logger.error(`AI completion failed: ${error}`);\n\n // Handle error and update credential status\n if (config?.credentialId) {\n await this.handleApiError(error, context, config.credentialId);\n }\n\n throw error;\n }\n }\n\n public async stream(request: ChatCompletionRequest, auth: AuthContext): Promise<any> {\n const { model } = request;\n const context = this.createStoreContext(auth);\n\n if (await resolveChatExecutionRoute({ model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding chat stream for model ${model} to ai-gateway`);\n return this.forwardAiGatewayStream('/v1/chat/completions', request, auth);\n }\n\n const config = await this.getProviderConfig(context);\n\n if (!config) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const response = await this.providerHttpTransport.postStream({\n url: this.getProviderChatCompletionsUrl(config.baseURL),\n apiKey: config.apiKey,\n proxy: config.proxy,\n body: request,\n headers: {\n Accept: 'text/event-stream',\n },\n });\n\n return {\n toTextStreamResponse: () => new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n }),\n };\n }\n\n public async responses(body: any, auth: AuthContext): Promise<any> {\n const context = this.createStoreContext(auth);\n const displayName = getDisplayName(auth) || context.userId;\n const accountId = getAccountId(auth);\n\n if (await resolveChatExecutionRoute({ model: body?.model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding responses request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const sanitizedBody = sanitizeAiGatewayResponsesBody(body);\n const result = await this.forwardAiGatewayJson('/v1/responses', sanitizedBody, auth);\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL } = providerConfig;\n\n // Only OpenAI natively supports /v1/responses; all others go through Chat Completions\n if (resolveResponsesProviderRoute(baseURL) === 'chat-fallback') {\n this.logger.info(`Provider ${baseURL} does not support Responses API, converting to Chat Completions for ${displayName} (acc: ${accountId})`);\n return this.responsesViaCompletions(body, context, providerConfig);\n }\n\n const { apiKey, proxy, credentialId } = providerConfig;\n\n // Remove trailing slash if present\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const url = `${cleanBaseUrl}/responses`;\n\n this.logger.info(`Proxying responses request to ${url} for ${displayName} (acc: ${accountId}), proxy: ${proxy || 'none'}`);\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url,\n apiKey,\n proxy,\n body,\n });\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n return result;\n } catch (error) {\n const status = (error as any)?.status;\n const headers = (error as any)?.headers;\n const bodyText = (error as any)?.body;\n if (typeof status === 'number') {\n this.logger.error(`Responses API failed: ${status} ${bodyText ?? ''}`);\n if (credentialId) {\n await this.handleApiError(\n { status, headers },\n context,\n credentialId,\n );\n }\n } else if (credentialId) {\n await this.handleApiError(error, context, credentialId);\n }\n throw error;\n }\n }\n\n public async messages(body: any, auth: AuthContext): Promise<any> {\n const context = this.createStoreContext(auth);\n const displayName = getDisplayName(auth) || context.userId;\n const accountId = getAccountId(auth);\n\n if (await resolveChatExecutionRoute({ model: body?.model, shouldUseAiGateway: this.shouldUseAiGateway.bind(this) }) === 'ai-gateway') {\n this.logger.info(`Forwarding messages request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const completionBody = buildChatCompletionsBodyFromMessages(body);\n const completion = await this.forwardAiGatewayJson('/v1/chat/completions', completionBody, auth);\n const result = mapChatCompletionToMessagesResponse(body, completion);\n this.recordForwardedUsage(accountId, String(context.userId), result);\n return result;\n }\n\n const providerConfig = await this.getProviderConfig(context);\n if (!providerConfig) {\n const err = new Error('No AI provider configured. Please configure Pod AI provider or set DEFAULT_API_BASE.');\n (err as any).code = 'model_not_configured';\n throw err;\n }\n\n const { baseURL } = providerConfig;\n\n // Only Anthropic natively supports /v1/messages; all others go through Chat Completions\n if (resolveMessagesProviderRoute(baseURL) === 'chat-fallback') {\n this.logger.info(`Provider ${baseURL} does not support Messages API, converting to Chat Completions for ${displayName} (acc: ${accountId})`);\n return this.messagesViaCompletions(body, context, providerConfig);\n }\n\n const { apiKey, proxy, credentialId } = providerConfig;\n\n // Remove trailing slash if present\n const cleanBaseUrl = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const url = `${cleanBaseUrl}/messages`;\n\n this.logger.info(`Proxying messages request to ${url} for ${displayName} (acc: ${accountId}), proxy: ${proxy || 'none'}`);\n\n try {\n const result = await this.providerHttpTransport.postJson({\n url,\n apiKey,\n proxy,\n body,\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n });\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n return result;\n } catch (error) {\n const status = (error as any)?.status;\n const headers = (error as any)?.headers;\n const bodyText = (error as any)?.body;\n if (typeof status === 'number') {\n this.logger.error(`Messages API failed: ${status} ${bodyText ?? ''}`);\n if (credentialId) {\n await this.handleApiError(\n { status, headers },\n context,\n credentialId,\n );\n }\n } else if (credentialId) {\n await this.handleApiError(error, context, credentialId);\n }\n throw error;\n }\n }\n\n\n\n\n private async responsesViaCompletions(\n body: any,\n context: StoreContext,\n providerConfig: { baseURL: string; apiKey: string; proxy?: string; credentialId?: string },\n ): Promise<any> {\n const prompt = extractPromptFromResponsesBody(body);\n const model = body?.model || getPlatformDefaultModel();\n\n const provider = await this.getProvider(context);\n const result = await generateText({\n model: provider.chat(model),\n messages: [{ role: 'user' as const, content: prompt }],\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_output_tokens != null ? { maxTokens: body.max_output_tokens } : {}),\n } as any);\n\n if (providerConfig.credentialId) {\n this.store.recordCredentialSuccess(context, providerConfig.credentialId).catch(() => {});\n }\n\n const outputText = result.text;\n const now = Math.floor(Date.now() / 1000);\n return {\n id: `resp_${Date.now()}`,\n object: 'response',\n created: now,\n status: 'completed',\n model,\n output: [{\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: outputText }],\n }],\n usage: {\n input_tokens: (result.usage as any)?.promptTokens ?? prompt.length,\n output_tokens: (result.usage as any)?.completionTokens ?? outputText.length,\n total_tokens: (result.usage as any)?.totalTokens ?? (prompt.length + outputText.length),\n },\n };\n }\n\n private async messagesViaCompletions(\n body: any,\n context: StoreContext,\n providerConfig: { baseURL: string; apiKey: string; proxy?: string; credentialId?: string },\n ): Promise<any> {\n const prompt = extractPromptFromMessagesBody(body);\n const model = body?.model || getPlatformDefaultModel();\n\n const coreMessages: any[] = [];\n if (body?.system) {\n const systemText = typeof body.system === 'string'\n ? body.system\n : Array.isArray(body.system)\n ? body.system.map((b: any) => b?.text ?? '').join('\\n')\n : '';\n if (systemText) {\n coreMessages.push({ role: 'system', content: systemText });\n }\n }\n if (Array.isArray(body?.messages)) {\n for (const msg of body.messages) {\n if (msg?.role && msg?.content != null) {\n const content = typeof msg.content === 'string'\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content.filter((p: any) => p?.type === 'text').map((p: any) => p.text).join('\\n')\n : String(msg.content);\n coreMessages.push({ role: msg.role, content });\n }\n }\n }\n if (coreMessages.length === 0) {\n coreMessages.push({ role: 'user', content: prompt });\n }\n\n const provider = await this.getProvider(context);\n const result = await generateText({\n model: provider.chat(model),\n messages: coreMessages,\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_tokens != null ? { maxTokens: body.max_tokens } : {}),\n } as any);\n\n if (providerConfig.credentialId) {\n this.store.recordCredentialSuccess(context, providerConfig.credentialId).catch(() => {});\n }\n\n const text = result.text;\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model,\n content: [{ type: 'text', text }],\n stop_reason: 'end_turn',\n stop_sequence: null,\n usage: {\n input_tokens: (result.usage as any)?.promptTokens ?? prompt.length,\n output_tokens: (result.usage as any)?.completionTokens ?? text.length,\n },\n };\n }\n\n public async listModels(_auth?: AuthContext): Promise<any[]> {\n const models: any[] = [];\n const seenModelIds = new Set<string>();\n\n if (_auth) {\n try {\n const context = this.createStoreContext(_auth);\n const userModels = await this.store.listAvailableModels(context);\n this.pushModelsWithDedup(models, seenModelIds, userModels);\n } catch (error) {\n this.logger.warn(`Failed to load user Pod models: ${error}`);\n }\n }\n\n const aiGatewayModels = await this.aiGatewayTransport.listModels();\n if (aiGatewayModels) {\n this.pushModelsWithDedup(models, seenModelIds, aiGatewayModels);\n }\n\n // 平台 Provider 模型(从 DEFAULT_API_BASE 获取)\n const platformBase = getPlatformApiBaseUrl();\n const platformKey = getPlatformApiKey();\n const aiGatewayBase = this.getAiGatewayBaseUrl();\n const normalizedAiGatewayModelsUrl = aiGatewayBase\n ? this.aiGatewayTransport.buildUrl('/v1/models')\n : undefined;\n const normalizedPlatformModelsUrl = platformBase\n ? `${platformBase.replace(/\\/$/, '')}/models`\n : undefined;\n if (platformBase && normalizedPlatformModelsUrl !== normalizedAiGatewayModelsUrl) {\n try {\n const url = normalizedPlatformModelsUrl!;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (platformKey) {\n headers['Authorization'] = `Bearer ${platformKey}`;\n }\n const resp = await fetch(url, { headers });\n if (resp.ok) {\n const data = await resp.json() as { data?: any[] };\n if (Array.isArray(data.data)) {\n this.pushModelsWithDedup(models, seenModelIds, data.data);\n }\n } else {\n this.logger.warn(`Failed to fetch platform models: ${resp.status}`);\n }\n } catch (error) {\n this.logger.warn(`Failed to fetch platform models: ${error}`);\n }\n }\n\n return models;\n }\n /**\n * Handle API errors and update credential status accordingly\n */\n private async handleApiError(\n error: unknown,\n context: StoreContext,\n credentialId: string,\n ): Promise<void> {\n const errorInfo = this.parseApiError(error);\n\n if (errorInfo.statusCode === 429) {\n // Rate limit error - mark credential as rate limited\n const resetAt = errorInfo.retryAfter\n ? new Date(Date.now() + errorInfo.retryAfter * 1000)\n : new Date(Date.now() + 60000); // Default 1 minute cooldown\n\n this.logger.warn(`Rate limit hit for credential ${credentialId}, reset at: ${resetAt.toISOString()}`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.RATE_LIMITED,\n { rateLimitResetAt: resetAt },\n );\n } else if (errorInfo.statusCode === 401 || errorInfo.statusCode === 403) {\n // Auth error - mark credential as inactive\n this.logger.warn(`Auth error for credential ${credentialId}, marking as inactive`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.INACTIVE,\n { incrementFailCount: true },\n );\n } else if (errorInfo.statusCode >= 500) {\n // Server error - increment fail count but keep active\n this.logger.warn(`Server error ${errorInfo.statusCode} for credential ${credentialId}`);\n\n await this.store.updateCredentialStatus(\n context,\n credentialId,\n CredentialStatus.ACTIVE,\n { incrementFailCount: true },\n );\n }\n }\n\n /**\n * Parse error to extract status code and retry-after header\n */\n private parseApiError(error: unknown): { statusCode: number; retryAfter?: number } {\n // Handle different error formats from AI SDK\n if (error && typeof error === 'object') {\n const err = error as any;\n\n // Direct status code\n if (typeof err.status === 'number') {\n return {\n statusCode: err.status,\n retryAfter: err.retryAfter || err.headers?.['retry-after'],\n };\n }\n\n // Nested response object\n if (err.response && typeof err.response.status === 'number') {\n return {\n statusCode: err.response.status,\n retryAfter: err.response.headers?.get?.('retry-after'),\n };\n }\n\n // Error message parsing (fallback)\n if (err.message) {\n const match = err.message.match(/(\\d{3})/);\n if (match) {\n return { statusCode: parseInt(match[1], 10) };\n }\n }\n }\n\n return { statusCode: 0 };\n }\n\n /**\n * Check if account has remaining token quota\n */\n private async checkTokenQuota(accountId: string): Promise<void> {\n if (!this.quotaService || !this.usageRepo) {\n return; // No quota enforcement if not configured\n }\n\n try {\n const quota = await this.quotaService.getAccountQuota(accountId);\n if (!quota.tokenLimitMonthly) {\n return; // No limit set\n }\n\n const usage = await this.usageRepo.getAccountUsage(accountId);\n const tokensUsed = usage?.tokensUsed ?? 0;\n\n if (tokensUsed >= quota.tokenLimitMonthly) {\n const err = new Error('Token quota exceeded for this month');\n (err as any).code = 'quota_exceeded';\n throw err;\n }\n } catch (error) {\n if ((error as any).code === 'quota_exceeded') {\n throw error;\n }\n // Log but don't block on quota check errors\n this.logger.warn(`Token quota check failed: ${error}`);\n }\n }\n\n /**\n * Record token usage (fire-and-forget)\n */\n private recordTokenUsage(accountId: string, podId: string, tokens: number): void {\n if (!this.usageRepo) {\n return;\n }\n\n this.usageRepo.incrementTokenUsage(accountId, podId, tokens).catch((err) => {\n this.logger.warn(`Failed to record token usage: ${err}`);\n });\n }\n}\n"]}
@@ -7,7 +7,8 @@ export declare class AiGatewayTransport {
7
7
  constructor(options: {
8
8
  getBaseUrl(): string | null;
9
9
  getApiKey(): string | null;
10
- getTimeoutMs(): number;
10
+ getQueryTimeoutMs(): number;
11
+ getGenerationTimeoutMs(): number;
11
12
  });
12
13
  shouldHandleModel(model?: string): Promise<boolean>;
13
14
  listModels(): Promise<any[] | null>;
@@ -18,6 +19,7 @@ export declare class AiGatewayTransport {
18
19
  }>;
19
20
  private isModelCacheFresh;
20
21
  private getModelCache;
22
+ private getTimeoutMs;
21
23
  private createAbortSignal;
22
24
  private sendRequest;
23
25
  }
@@ -34,13 +34,13 @@ class AiGatewayTransport {
34
34
  async sendJson(path, body) {
35
35
  const response = await this.sendRequest(path, 'POST', body, {
36
36
  Accept: 'application/json',
37
- });
37
+ }, 'generation');
38
38
  return response.json();
39
39
  }
40
40
  async sendStream(path, body) {
41
41
  const response = await this.sendRequest(path, 'POST', body, {
42
42
  Accept: 'text/event-stream',
43
- });
43
+ }, 'generation');
44
44
  return {
45
45
  toTextStreamResponse: () => new Response(response.body, {
46
46
  status: response.status,
@@ -66,7 +66,7 @@ class AiGatewayTransport {
66
66
  this.modelCachePromise = (async () => {
67
67
  const response = await this.sendRequest('/v1/models', 'GET', undefined, {
68
68
  Accept: 'application/json',
69
- });
69
+ }, 'query');
70
70
  const data = await response.json();
71
71
  const items = Array.isArray(data.data) ? data.data : [];
72
72
  const cache = {
@@ -92,13 +92,18 @@ class AiGatewayTransport {
92
92
  this.modelCachePromise = null;
93
93
  }
94
94
  }
95
- createAbortSignal() {
95
+ getTimeoutMs(kind) {
96
+ return kind === 'generation'
97
+ ? this.options.getGenerationTimeoutMs()
98
+ : this.options.getQueryTimeoutMs();
99
+ }
100
+ createAbortSignal(kind) {
96
101
  const abortSignal = AbortSignal;
97
102
  return typeof abortSignal.timeout === 'function'
98
- ? abortSignal.timeout(this.options.getTimeoutMs())
103
+ ? abortSignal.timeout(this.getTimeoutMs(kind))
99
104
  : undefined;
100
105
  }
101
- async sendRequest(path, method, body, headers) {
106
+ async sendRequest(path, method, body, headers, timeoutKind = 'query') {
102
107
  const apiKey = this.options.getApiKey();
103
108
  if (!apiKey) {
104
109
  throw new Error('DEFAULT_API_KEY is not configured');
@@ -112,7 +117,7 @@ class AiGatewayTransport {
112
117
  method,
113
118
  headers: requestHeaders,
114
119
  ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
115
- signal: this.createAbortSignal(),
120
+ signal: this.createAbortSignal(timeoutKind),
116
121
  });
117
122
  if (!response.ok) {
118
123
  const errorText = await response.text().catch(() => '');
@@ -1 +1 @@
1
- {"version":3,"file":"ai-gateway-transport.js","sourceRoot":"","sources":["../../../src/api/service/ai-gateway-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\n\ninterface AiGatewayModelCache {\n fetchedAt: number;\n items: any[];\n modelIds: Set<string>;\n}\n\nexport class AiGatewayTransport {\n private static readonly MODEL_CACHE_TTL_MS = 30_000;\n private readonly logger = getLoggerFor(this);\n private modelCache: AiGatewayModelCache | null = null;\n private modelCachePromise: Promise<AiGatewayModelCache | null> | null = null;\n\n public constructor(private readonly options: {\n getBaseUrl(): string | null;\n getApiKey(): string | null;\n getTimeoutMs(): number;\n }) {}\n\n public async shouldHandleModel(model?: string): Promise<boolean> {\n if (!model || !this.options.getBaseUrl()) {\n return false;\n }\n\n const cache = await this.getModelCache();\n return cache?.modelIds.has(model) ?? false;\n }\n\n public async listModels(): Promise<any[] | null> {\n const cache = await this.getModelCache();\n return cache?.items ?? null;\n }\n\n public buildUrl(path: string): string {\n const baseUrl = this.options.getBaseUrl();\n if (!baseUrl) {\n throw new Error('DEFAULT_API_BASE is not configured');\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n if (baseUrl.endsWith('/v1') && normalizedPath.startsWith('/v1/')) {\n return `${baseUrl}${normalizedPath.slice(3)}`;\n }\n\n return `${baseUrl}${normalizedPath}`;\n }\n\n public async sendJson(path: string, body: unknown): Promise<any> {\n const response = await this.sendRequest(path, 'POST', body, {\n Accept: 'application/json',\n });\n return response.json();\n }\n\n public async sendStream(path: string, body: unknown): Promise<{\n toTextStreamResponse: () => Response;\n }> {\n const response = await this.sendRequest(path, 'POST', body, {\n Accept: 'text/event-stream',\n });\n\n return {\n toTextStreamResponse: () => new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n }),\n };\n }\n\n private isModelCacheFresh(): boolean {\n return !!this.modelCache\n && Date.now() - this.modelCache.fetchedAt < AiGatewayTransport.MODEL_CACHE_TTL_MS;\n }\n\n private async getModelCache(): Promise<AiGatewayModelCache | null> {\n if (!this.options.getBaseUrl()) {\n return null;\n }\n\n if (this.isModelCacheFresh()) {\n return this.modelCache;\n }\n\n if (this.modelCachePromise) {\n return this.modelCachePromise;\n }\n\n this.modelCachePromise = (async() => {\n const response = await this.sendRequest('/v1/models', 'GET', undefined, {\n Accept: 'application/json',\n });\n const data = await response.json() as { data?: any[] };\n const items = Array.isArray(data.data) ? data.data : [];\n const cache: AiGatewayModelCache = {\n fetchedAt: Date.now(),\n items,\n modelIds: new Set(items.map((item) => typeof item?.id === 'string' ? item.id : JSON.stringify(item))),\n };\n this.modelCache = cache;\n return cache;\n })();\n\n try {\n return await this.modelCachePromise;\n } catch (error) {\n if (this.modelCache) {\n this.logger.warn(`Failed to refresh ai-gateway models, using stale cache: ${error}`);\n return this.modelCache;\n }\n this.logger.warn(`Failed to fetch ai-gateway models: ${error}`);\n return null;\n } finally {\n this.modelCachePromise = null;\n }\n }\n\n private createAbortSignal(): AbortSignal | undefined {\n const abortSignal = AbortSignal as typeof AbortSignal & {\n timeout?: (milliseconds: number) => AbortSignal;\n };\n return typeof abortSignal.timeout === 'function'\n ? abortSignal.timeout(this.options.getTimeoutMs())\n : undefined;\n }\n\n private async sendRequest(\n path: string,\n method: 'GET' | 'POST',\n body?: unknown,\n headers?: HeadersInit,\n ): Promise<Response> {\n const apiKey = this.options.getApiKey();\n if (!apiKey) {\n throw new Error('DEFAULT_API_KEY is not configured');\n }\n\n const requestHeaders = new Headers(headers);\n requestHeaders.set('Authorization', `Bearer ${apiKey}`);\n if (body !== undefined && !requestHeaders.has('Content-Type')) {\n requestHeaders.set('Content-Type', 'application/json');\n }\n\n const response = await fetch(this.buildUrl(path), {\n method,\n headers: requestHeaders,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: this.createAbortSignal(),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n this.logger.warn(`Platform AI request failed: ${response.status} ${errorText}`);\n\n const error = new Error(`Platform AI error: ${response.status} ${response.statusText}`);\n (error as any).status = response.status;\n (error as any).headers = response.headers;\n (error as any).body = errorText;\n throw error;\n }\n\n return response;\n }\n}\n"]}
1
+ {"version":3,"file":"ai-gateway-transport.js","sourceRoot":"","sources":["../../../src/api/service/ai-gateway-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\n\ninterface AiGatewayModelCache {\n fetchedAt: number;\n items: any[];\n modelIds: Set<string>;\n}\n\ntype AiGatewayTimeoutKind = 'query' | 'generation';\n\nexport class AiGatewayTransport {\n private static readonly MODEL_CACHE_TTL_MS = 30_000;\n private readonly logger = getLoggerFor(this);\n private modelCache: AiGatewayModelCache | null = null;\n private modelCachePromise: Promise<AiGatewayModelCache | null> | null = null;\n\n public constructor(private readonly options: {\n getBaseUrl(): string | null;\n getApiKey(): string | null;\n getQueryTimeoutMs(): number;\n getGenerationTimeoutMs(): number;\n }) {}\n\n public async shouldHandleModel(model?: string): Promise<boolean> {\n if (!model || !this.options.getBaseUrl()) {\n return false;\n }\n\n const cache = await this.getModelCache();\n return cache?.modelIds.has(model) ?? false;\n }\n\n public async listModels(): Promise<any[] | null> {\n const cache = await this.getModelCache();\n return cache?.items ?? null;\n }\n\n public buildUrl(path: string): string {\n const baseUrl = this.options.getBaseUrl();\n if (!baseUrl) {\n throw new Error('DEFAULT_API_BASE is not configured');\n }\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n if (baseUrl.endsWith('/v1') && normalizedPath.startsWith('/v1/')) {\n return `${baseUrl}${normalizedPath.slice(3)}`;\n }\n\n return `${baseUrl}${normalizedPath}`;\n }\n\n public async sendJson(path: string, body: unknown): Promise<any> {\n const response = await this.sendRequest(path, 'POST', body, {\n Accept: 'application/json',\n }, 'generation');\n return response.json();\n }\n\n public async sendStream(path: string, body: unknown): Promise<{\n toTextStreamResponse: () => Response;\n }> {\n const response = await this.sendRequest(path, 'POST', body, {\n Accept: 'text/event-stream',\n }, 'generation');\n\n return {\n toTextStreamResponse: () => new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: new Headers(response.headers),\n }),\n };\n }\n\n private isModelCacheFresh(): boolean {\n return !!this.modelCache\n && Date.now() - this.modelCache.fetchedAt < AiGatewayTransport.MODEL_CACHE_TTL_MS;\n }\n\n private async getModelCache(): Promise<AiGatewayModelCache | null> {\n if (!this.options.getBaseUrl()) {\n return null;\n }\n\n if (this.isModelCacheFresh()) {\n return this.modelCache;\n }\n\n if (this.modelCachePromise) {\n return this.modelCachePromise;\n }\n\n this.modelCachePromise = (async() => {\n const response = await this.sendRequest('/v1/models', 'GET', undefined, {\n Accept: 'application/json',\n }, 'query');\n const data = await response.json() as { data?: any[] };\n const items = Array.isArray(data.data) ? data.data : [];\n const cache: AiGatewayModelCache = {\n fetchedAt: Date.now(),\n items,\n modelIds: new Set(items.map((item) => typeof item?.id === 'string' ? item.id : JSON.stringify(item))),\n };\n this.modelCache = cache;\n return cache;\n })();\n\n try {\n return await this.modelCachePromise;\n } catch (error) {\n if (this.modelCache) {\n this.logger.warn(`Failed to refresh ai-gateway models, using stale cache: ${error}`);\n return this.modelCache;\n }\n this.logger.warn(`Failed to fetch ai-gateway models: ${error}`);\n return null;\n } finally {\n this.modelCachePromise = null;\n }\n }\n\n private getTimeoutMs(kind: AiGatewayTimeoutKind): number {\n return kind === 'generation'\n ? this.options.getGenerationTimeoutMs()\n : this.options.getQueryTimeoutMs();\n }\n\n private createAbortSignal(kind: AiGatewayTimeoutKind): AbortSignal | undefined {\n const abortSignal = AbortSignal as typeof AbortSignal & {\n timeout?: (milliseconds: number) => AbortSignal;\n };\n return typeof abortSignal.timeout === 'function'\n ? abortSignal.timeout(this.getTimeoutMs(kind))\n : undefined;\n }\n\n private async sendRequest(\n path: string,\n method: 'GET' | 'POST',\n body?: unknown,\n headers?: HeadersInit,\n timeoutKind: AiGatewayTimeoutKind = 'query',\n ): Promise<Response> {\n const apiKey = this.options.getApiKey();\n if (!apiKey) {\n throw new Error('DEFAULT_API_KEY is not configured');\n }\n\n const requestHeaders = new Headers(headers);\n requestHeaders.set('Authorization', `Bearer ${apiKey}`);\n if (body !== undefined && !requestHeaders.has('Content-Type')) {\n requestHeaders.set('Content-Type', 'application/json');\n }\n\n const response = await fetch(this.buildUrl(path), {\n method,\n headers: requestHeaders,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: this.createAbortSignal(timeoutKind),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n this.logger.warn(`Platform AI request failed: ${response.status} ${errorText}`);\n\n const error = new Error(`Platform AI error: ${response.status} ${response.statusText}`);\n (error as any).status = response.status;\n (error as any).headers = response.headers;\n (error as any).body = errorText;\n throw error;\n }\n\n return response;\n }\n}\n"]}
@@ -5,4 +5,6 @@ export declare function getPlatformApiKey(): string;
5
5
  export declare function hasPlatformApiConfig(): boolean;
6
6
  export declare function getPlatformProviderId(): string;
7
7
  export declare function getPlatformDefaultModel(): string;
8
+ export declare function getPlatformQueryTimeoutMs(): number;
9
+ export declare function getPlatformGenerationTimeoutMs(): number;
8
10
  export declare function getPlatformTimeoutMs(): number;