@undefineds.co/xpod 0.2.23 → 0.2.26
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.
- package/dist/api/chatkit/pod-store.d.ts +3 -0
- package/dist/api/chatkit/pod-store.js +139 -0
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/service/VercelChatService.d.ts +4 -15
- package/dist/api/service/VercelChatService.js +80 -302
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/service/ai-gateway-transport.d.ts +23 -0
- package/dist/api/service/ai-gateway-transport.js +131 -0
- package/dist/api/service/ai-gateway-transport.js.map +1 -0
- package/dist/api/service/chat-protocol-adapters.d.ts +5 -0
- package/dist/api/service/chat-protocol-adapters.js +146 -0
- package/dist/api/service/chat-protocol-adapters.js.map +1 -0
- package/dist/api/service/chat-routing.d.ts +8 -0
- package/dist/api/service/chat-routing.js +16 -0
- package/dist/api/service/chat-routing.js.map +1 -0
- package/dist/api/service/provider-http-transport.d.ts +9 -0
- package/dist/api/service/provider-http-transport.js +32 -0
- package/dist/api/service/provider-http-transport.js.map +1 -0
- package/package.json +1 -1
|
@@ -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 supportsResponsesApi,\n supportsMessagesApi,\n} from './provider-registry';\nimport {\n getAiGatewayApiKey,\n getAiGatewayBaseUrl,\n getPlatformApiBaseUrl,\n getPlatformApiKey,\n getPlatformDefaultModel,\n getPlatformTimeoutMs,\n} from './platform-ai-config';\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\ninterface AiGatewayModelCache {\n fetchedAt: number;\n items: any[];\n modelIds: Set<string>;\n}\n\nexport class VercelChatService {\n private static readonly AI_GATEWAY_MODEL_CACHE_TTL_MS = 30_000;\n private readonly logger = getLoggerFor(this);\n private usageRepo?: UsageRepository;\n private quotaService?: QuotaService;\n private aiGatewayModelCache: AiGatewayModelCache | null = null;\n private aiGatewayModelCachePromise: Promise<AiGatewayModelCache | null> | null = null;\n\n public constructor(private readonly store: PodChatKitStore) {\n this.logger.info('Initializing VercelChatService with Pod-based config support');\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 toModelId(model: any): string {\n return typeof model?.id === 'string' ? model.id : JSON.stringify(model);\n }\n\n private isAiGatewayModelCacheFresh(): boolean {\n return !!this.aiGatewayModelCache\n && Date.now() - this.aiGatewayModelCache.fetchedAt < VercelChatService.AI_GATEWAY_MODEL_CACHE_TTL_MS;\n }\n\n private async getAiGatewayModelCache(): Promise<AiGatewayModelCache | null> {\n if (!this.getAiGatewayBaseUrl()) {\n return null;\n }\n\n if (this.isAiGatewayModelCacheFresh()) {\n return this.aiGatewayModelCache;\n }\n\n if (this.aiGatewayModelCachePromise) {\n return this.aiGatewayModelCachePromise;\n }\n\n this.aiGatewayModelCachePromise = (async() => {\n const response = await this.sendAiGatewayRequest('/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) => this.toModelId(item))),\n };\n this.aiGatewayModelCache = cache;\n return cache;\n })();\n\n try {\n return await this.aiGatewayModelCachePromise;\n } catch (error) {\n if (this.aiGatewayModelCache) {\n this.logger.warn(`Failed to refresh ai-gateway models, using stale cache: ${error}`);\n return this.aiGatewayModelCache;\n }\n this.logger.warn(`Failed to fetch ai-gateway models: ${error}`);\n return null;\n } finally {\n this.aiGatewayModelCachePromise = null;\n }\n }\n\n private async shouldUseAiGateway(model?: string): Promise<boolean> {\n if (!model || !this.getAiGatewayBaseUrl()) {\n return false;\n }\n\n const cache = await this.getAiGatewayModelCache();\n return cache?.modelIds.has(model) ?? false;\n }\n\n private buildAiGatewayUrl(path: string): string {\n const baseUrl = this.getAiGatewayBaseUrl();\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 private createAiGatewayAbortSignal(): 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.getAiGatewayTimeoutMs())\n : undefined;\n }\n\n private async sendAiGatewayRequest(\n path: string,\n method: 'GET' | 'POST',\n body?: unknown,\n headers?: HeadersInit,\n ): Promise<Response> {\n const apiKey = this.getAiGatewayApiKey();\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.buildAiGatewayUrl(path), {\n method,\n headers: requestHeaders,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: this.createAiGatewayAbortSignal(),\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 private async forwardAiGatewayJson(path: string, body: unknown, _auth: AuthContext): Promise<any> {\n const response = await this.sendAiGatewayRequest(path, 'POST', body, {\n 'Accept': 'application/json',\n });\n return response.json();\n }\n\n private async forwardAiGatewayStream(path: string, body: unknown, _auth: AuthContext): Promise<{\n toTextStreamResponse: () => Response;\n }> {\n const response = await this.sendAiGatewayRequest(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 extractCompletionText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .filter((item) => item && typeof item === 'object' && typeof (item as any).text === 'string')\n .map((item) => (item as any).text)\n .join('\\n');\n }\n\n return content == null ? '' : String(content);\n }\n\n private buildChatCompletionsBodyFromMessages(body: any): Record<string, unknown> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (body?.system) {\n const systemText = this.extractCompletionText(body.system);\n if (systemText) {\n messages.push({ role: 'system', content: systemText });\n }\n }\n\n if (Array.isArray(body?.messages)) {\n for (const message of body.messages) {\n if (!message?.role || message?.content == null) {\n continue;\n }\n\n messages.push({\n role: String(message.role),\n content: this.extractCompletionText(message.content),\n });\n }\n }\n\n if (messages.length === 0 && body?.content != null) {\n messages.push({\n role: 'user',\n content: this.extractCompletionText(body.content),\n });\n }\n\n return {\n model: body?.model,\n messages,\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_tokens != null ? { max_tokens: body.max_tokens } : {}),\n ...(Array.isArray(body?.stop_sequences) && body.stop_sequences.length > 0\n ? { stop: body.stop_sequences }\n : {}),\n };\n }\n\n private mapChatCompletionFinishReason(reason: string | null | undefined): string {\n if (reason === 'length') {\n return 'max_tokens';\n }\n if (reason === 'content_filter') {\n return 'stop_sequence';\n }\n return 'end_turn';\n }\n\n private mapChatCompletionToMessagesResponse(body: any, completion: any): any {\n const choice = Array.isArray(completion?.choices) ? completion.choices[0] : undefined;\n const text = this.extractCompletionText(choice?.message?.content);\n const prompt = this.extractPromptFromMessagesBody(body);\n\n return {\n id: completion?.id ?? `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: completion?.model ?? body?.model,\n content: [{ type: 'text', text }],\n stop_reason: this.mapChatCompletionFinishReason(choice?.finish_reason),\n stop_sequence: null,\n usage: {\n input_tokens: completion?.usage?.prompt_tokens ?? prompt.length,\n output_tokens: completion?.usage?.completion_tokens ?? text.length,\n },\n };\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, messages, temperature, max_tokens } = 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 this.shouldUseAiGateway(model)) {\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 provider = await this.getProvider(context);\n\n const coreMessages: any[] = messages.map((m) => ({\n role: m.role as any,\n content: m.content,\n }));\n\n const result = await generateText({\n model: provider.chat(model),\n messages: coreMessages,\n temperature,\n maxTokens: max_tokens,\n } as any);\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 = (result.usage as any)?.totalTokens ?? 0;\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, String(context.userId), totalTokens);\n }\n\n return {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: result.text,\n },\n finish_reason: this.mapFinishReason(result.finishReason),\n },\n ],\n usage: {\n prompt_tokens: (result.usage as any).promptTokens,\n completion_tokens: (result.usage as any).completionTokens,\n total_tokens: (result.usage as any).totalTokens,\n },\n };\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, messages, temperature, max_tokens } = request;\n const context = this.createStoreContext(auth);\n\n if (await this.shouldUseAiGateway(model)) {\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 provider = await this.getProvider(context);\n\n const coreMessages: any[] = messages.map((m) => ({\n role: m.role as any,\n content: m.content,\n }));\n\n return streamText({\n model: provider.chat(model),\n messages: coreMessages,\n temperature,\n maxTokens: max_tokens,\n } as any);\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 this.shouldUseAiGateway(body?.model)) {\n this.logger.info(`Forwarding responses request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const result = await this.forwardAiGatewayJson('/v1/responses', body, 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 (!supportsResponsesApi(baseURL)) {\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 const fetchFn = proxy ? createProxyFetch(proxy) : fetch;\n\n try {\n const response = await fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n this.logger.error(`Responses API failed: ${response.status} ${errorText}`);\n\n // Handle error and update credential status\n if (credentialId) {\n await this.handleApiError(\n { status: response.status, headers: response.headers },\n context,\n credentialId,\n );\n }\n\n throw new Error(`Provider error: ${response.statusText}`);\n }\n\n // Record successful API call\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n\n return response.json();\n } catch (error) {\n if (credentialId && !(error instanceof Error && error.message.startsWith('Provider error'))) {\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 this.shouldUseAiGateway(body?.model)) {\n this.logger.info(`Forwarding messages request for model ${body?.model} to ai-gateway for ${displayName} (acc: ${accountId})`);\n const completionBody = this.buildChatCompletionsBodyFromMessages(body);\n const completion = await this.forwardAiGatewayJson('/v1/chat/completions', completionBody, auth);\n const result = this.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 (!supportsMessagesApi(baseURL)) {\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 const fetchFn = proxy ? createProxyFetch(proxy) : fetch;\n\n try {\n const response = await fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n this.logger.error(`Messages API failed: ${response.status} ${errorText}`);\n\n // Handle error and update credential status\n if (credentialId) {\n await this.handleApiError(\n { status: response.status, headers: response.headers },\n context,\n credentialId,\n );\n }\n\n throw new Error(`Provider error: ${response.statusText}`);\n }\n\n // Record successful API call\n if (credentialId) {\n this.store.recordCredentialSuccess(context, credentialId).catch(() => {});\n }\n\n return response.json();\n } catch (error) {\n if (credentialId && !(error instanceof Error && error.message.startsWith('Provider error'))) {\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 = this.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 = this.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 private extractPromptFromResponsesBody(body: any): string {\n if (!body || typeof body !== 'object') {\n return '';\n }\n\n if (typeof body.input === 'string') {\n return body.input;\n }\n\n if (typeof body.prompt === 'string') {\n return body.prompt;\n }\n\n if (Array.isArray(body.input)) {\n const textParts: string[] = [];\n for (const item of body.input) {\n if (item && typeof item === 'object') {\n const candidate = (item as any).content;\n if (typeof candidate === 'string') {\n textParts.push(candidate);\n } else if (Array.isArray(candidate)) {\n for (const part of candidate) {\n if (part && typeof part === 'object' && typeof (part as any).text === 'string') {\n textParts.push((part as any).text);\n }\n }\n }\n }\n }\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n }\n\n return '';\n }\n\n private extractPromptFromMessagesBody(body: any): string {\n if (!body || typeof body !== 'object') {\n return '';\n }\n\n if (typeof body.content === 'string') {\n return body.content;\n }\n\n if (Array.isArray(body.messages)) {\n const lastUser = [...body.messages].reverse().find((item: any) => item?.role === 'user');\n if (lastUser) {\n if (typeof lastUser.content === 'string') {\n return lastUser.content;\n }\n if (Array.isArray(lastUser.content)) {\n return lastUser.content\n .filter((part: any) => part && typeof part === 'object' && typeof part.text === 'string')\n .map((part: any) => part.text)\n .join('\\n');\n }\n }\n }\n\n return '';\n }\n\n public async listModels(_auth?: AuthContext): Promise<any[]> {\n const models: any[] = [];\n const seenModelIds = new Set<string>();\n\n const pushModels = (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 const aiGatewayCache = await this.getAiGatewayModelCache();\n if (aiGatewayCache) {\n pushModels(aiGatewayCache.items);\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.buildAiGatewayUrl('/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 pushModels(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 // TODO: 合并用户 Pod Providers 的模型\n return models;\n }\n\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content_filter' {\n return reason as any;\n }\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 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 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, messages, temperature, max_tokens } = 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 provider = await this.getProvider(context);\n\n const coreMessages: any[] = messages.map((m) => ({\n role: m.role as any,\n content: m.content,\n }));\n\n const result = await generateText({\n model: provider.chat(model),\n messages: coreMessages,\n temperature,\n maxTokens: max_tokens,\n } as any);\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 = (result.usage as any)?.totalTokens ?? 0;\n if (accountId && totalTokens > 0) {\n this.recordTokenUsage(accountId, String(context.userId), totalTokens);\n }\n\n return {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: result.text,\n },\n finish_reason: this.mapFinishReason(result.finishReason),\n },\n ],\n usage: {\n prompt_tokens: (result.usage as any).promptTokens,\n completion_tokens: (result.usage as any).completionTokens,\n total_tokens: (result.usage as any).totalTokens,\n },\n };\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, messages, temperature, max_tokens } = 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 provider = await this.getProvider(context);\n\n const coreMessages: any[] = messages.map((m) => ({\n role: m.role as any,\n content: m.content,\n }));\n\n return streamText({\n model: provider.chat(model),\n messages: coreMessages,\n temperature,\n maxTokens: max_tokens,\n } as any);\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 private mapFinishReason(reason: string): 'stop' | 'length' | 'content_filter' {\n return reason as any;\n }\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"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class AiGatewayTransport {
|
|
2
|
+
private readonly options;
|
|
3
|
+
private static readonly MODEL_CACHE_TTL_MS;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private modelCache;
|
|
6
|
+
private modelCachePromise;
|
|
7
|
+
constructor(options: {
|
|
8
|
+
getBaseUrl(): string | null;
|
|
9
|
+
getApiKey(): string | null;
|
|
10
|
+
getTimeoutMs(): number;
|
|
11
|
+
});
|
|
12
|
+
shouldHandleModel(model?: string): Promise<boolean>;
|
|
13
|
+
listModels(): Promise<any[] | null>;
|
|
14
|
+
buildUrl(path: string): string;
|
|
15
|
+
sendJson(path: string, body: unknown): Promise<any>;
|
|
16
|
+
sendStream(path: string, body: unknown): Promise<{
|
|
17
|
+
toTextStreamResponse: () => Response;
|
|
18
|
+
}>;
|
|
19
|
+
private isModelCacheFresh;
|
|
20
|
+
private getModelCache;
|
|
21
|
+
private createAbortSignal;
|
|
22
|
+
private sendRequest;
|
|
23
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AiGatewayTransport = void 0;
|
|
4
|
+
const global_logger_factory_1 = require("global-logger-factory");
|
|
5
|
+
class AiGatewayTransport {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
9
|
+
this.modelCache = null;
|
|
10
|
+
this.modelCachePromise = null;
|
|
11
|
+
}
|
|
12
|
+
async shouldHandleModel(model) {
|
|
13
|
+
if (!model || !this.options.getBaseUrl()) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const cache = await this.getModelCache();
|
|
17
|
+
return cache?.modelIds.has(model) ?? false;
|
|
18
|
+
}
|
|
19
|
+
async listModels() {
|
|
20
|
+
const cache = await this.getModelCache();
|
|
21
|
+
return cache?.items ?? null;
|
|
22
|
+
}
|
|
23
|
+
buildUrl(path) {
|
|
24
|
+
const baseUrl = this.options.getBaseUrl();
|
|
25
|
+
if (!baseUrl) {
|
|
26
|
+
throw new Error('DEFAULT_API_BASE is not configured');
|
|
27
|
+
}
|
|
28
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
29
|
+
if (baseUrl.endsWith('/v1') && normalizedPath.startsWith('/v1/')) {
|
|
30
|
+
return `${baseUrl}${normalizedPath.slice(3)}`;
|
|
31
|
+
}
|
|
32
|
+
return `${baseUrl}${normalizedPath}`;
|
|
33
|
+
}
|
|
34
|
+
async sendJson(path, body) {
|
|
35
|
+
const response = await this.sendRequest(path, 'POST', body, {
|
|
36
|
+
Accept: 'application/json',
|
|
37
|
+
});
|
|
38
|
+
return response.json();
|
|
39
|
+
}
|
|
40
|
+
async sendStream(path, body) {
|
|
41
|
+
const response = await this.sendRequest(path, 'POST', body, {
|
|
42
|
+
Accept: 'text/event-stream',
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
toTextStreamResponse: () => new Response(response.body, {
|
|
46
|
+
status: response.status,
|
|
47
|
+
statusText: response.statusText,
|
|
48
|
+
headers: new Headers(response.headers),
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
isModelCacheFresh() {
|
|
53
|
+
return !!this.modelCache
|
|
54
|
+
&& Date.now() - this.modelCache.fetchedAt < AiGatewayTransport.MODEL_CACHE_TTL_MS;
|
|
55
|
+
}
|
|
56
|
+
async getModelCache() {
|
|
57
|
+
if (!this.options.getBaseUrl()) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
if (this.isModelCacheFresh()) {
|
|
61
|
+
return this.modelCache;
|
|
62
|
+
}
|
|
63
|
+
if (this.modelCachePromise) {
|
|
64
|
+
return this.modelCachePromise;
|
|
65
|
+
}
|
|
66
|
+
this.modelCachePromise = (async () => {
|
|
67
|
+
const response = await this.sendRequest('/v1/models', 'GET', undefined, {
|
|
68
|
+
Accept: 'application/json',
|
|
69
|
+
});
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
const items = Array.isArray(data.data) ? data.data : [];
|
|
72
|
+
const cache = {
|
|
73
|
+
fetchedAt: Date.now(),
|
|
74
|
+
items,
|
|
75
|
+
modelIds: new Set(items.map((item) => typeof item?.id === 'string' ? item.id : JSON.stringify(item))),
|
|
76
|
+
};
|
|
77
|
+
this.modelCache = cache;
|
|
78
|
+
return cache;
|
|
79
|
+
})();
|
|
80
|
+
try {
|
|
81
|
+
return await this.modelCachePromise;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (this.modelCache) {
|
|
85
|
+
this.logger.warn(`Failed to refresh ai-gateway models, using stale cache: ${error}`);
|
|
86
|
+
return this.modelCache;
|
|
87
|
+
}
|
|
88
|
+
this.logger.warn(`Failed to fetch ai-gateway models: ${error}`);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
this.modelCachePromise = null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
createAbortSignal() {
|
|
96
|
+
const abortSignal = AbortSignal;
|
|
97
|
+
return typeof abortSignal.timeout === 'function'
|
|
98
|
+
? abortSignal.timeout(this.options.getTimeoutMs())
|
|
99
|
+
: undefined;
|
|
100
|
+
}
|
|
101
|
+
async sendRequest(path, method, body, headers) {
|
|
102
|
+
const apiKey = this.options.getApiKey();
|
|
103
|
+
if (!apiKey) {
|
|
104
|
+
throw new Error('DEFAULT_API_KEY is not configured');
|
|
105
|
+
}
|
|
106
|
+
const requestHeaders = new Headers(headers);
|
|
107
|
+
requestHeaders.set('Authorization', `Bearer ${apiKey}`);
|
|
108
|
+
if (body !== undefined && !requestHeaders.has('Content-Type')) {
|
|
109
|
+
requestHeaders.set('Content-Type', 'application/json');
|
|
110
|
+
}
|
|
111
|
+
const response = await fetch(this.buildUrl(path), {
|
|
112
|
+
method,
|
|
113
|
+
headers: requestHeaders,
|
|
114
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
115
|
+
signal: this.createAbortSignal(),
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const errorText = await response.text().catch(() => '');
|
|
119
|
+
this.logger.warn(`Platform AI request failed: ${response.status} ${errorText}`);
|
|
120
|
+
const error = new Error(`Platform AI error: ${response.status} ${response.statusText}`);
|
|
121
|
+
error.status = response.status;
|
|
122
|
+
error.headers = response.headers;
|
|
123
|
+
error.body = errorText;
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
return response;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.AiGatewayTransport = AiGatewayTransport;
|
|
130
|
+
AiGatewayTransport.MODEL_CACHE_TTL_MS = 30_000;
|
|
131
|
+
//# sourceMappingURL=ai-gateway-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-gateway-transport.js","sourceRoot":"","sources":["../../../src/api/service/ai-gateway-transport.ts"],"names":[],"mappings":";;;AAAA,iEAAqD;AAQrD,MAAa,kBAAkB;IAM7B,YAAoC,OAInC;QAJmC,YAAO,GAAP,OAAO,CAI1C;QARgB,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QACrC,eAAU,GAA+B,IAAI,CAAC;QAC9C,sBAAiB,GAA+C,IAAI,CAAC;IAMzE,CAAC;IAEE,KAAK,CAAC,iBAAiB,CAAC,KAAc;QAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC;IAC9B,CAAC;IAEM,QAAQ,CAAC,IAAY;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAChE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO,GAAG,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAED,OAAO,GAAG,OAAO,GAAG,cAAc,EAAE,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAa;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YAC1D,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAa;QAGjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YAC1D,MAAM,EAAE,mBAAmB;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACtD,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;aACvC,CAAC;SACH,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU;eACnB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,IAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtE,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsB,CAAC;YACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,KAAK,GAAwB;gBACjC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,KAAK;gBACL,QAAQ,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;aACtG,CAAC;YACF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2DAA2D,KAAK,EAAE,CAAC,CAAC;gBACrF,OAAO,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,WAAW,GAAG,WAEnB,CAAC;QACF,OAAO,OAAO,WAAW,CAAC,OAAO,KAAK,UAAU;YAC9C,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,IAAY,EACZ,MAAsB,EACtB,IAAc,EACd,OAAqB;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9D,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAChD,MAAM;YACN,OAAO,EAAE,cAAc;YACvB,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;YAEhF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACvF,KAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACvC,KAAa,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACzC,KAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;;AA3JH,gDA4JC;AA3JyB,qCAAkB,GAAG,MAAM,AAAT,CAAU","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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function sanitizeAiGatewayResponsesBody(body: any): any;
|
|
2
|
+
export declare function buildChatCompletionsBodyFromMessages(body: any): Record<string, unknown>;
|
|
3
|
+
export declare function extractPromptFromResponsesBody(body: any): string;
|
|
4
|
+
export declare function extractPromptFromMessagesBody(body: any): string;
|
|
5
|
+
export declare function mapChatCompletionToMessagesResponse(body: any, completion: any): any;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanitizeAiGatewayResponsesBody = sanitizeAiGatewayResponsesBody;
|
|
4
|
+
exports.buildChatCompletionsBodyFromMessages = buildChatCompletionsBodyFromMessages;
|
|
5
|
+
exports.extractPromptFromResponsesBody = extractPromptFromResponsesBody;
|
|
6
|
+
exports.extractPromptFromMessagesBody = extractPromptFromMessagesBody;
|
|
7
|
+
exports.mapChatCompletionToMessagesResponse = mapChatCompletionToMessagesResponse;
|
|
8
|
+
function extractCompletionText(content) {
|
|
9
|
+
if (typeof content === 'string') {
|
|
10
|
+
return content;
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(content)) {
|
|
13
|
+
return content
|
|
14
|
+
.filter((item) => item && typeof item === 'object' && typeof item.text === 'string')
|
|
15
|
+
.map((item) => item.text)
|
|
16
|
+
.join('\n');
|
|
17
|
+
}
|
|
18
|
+
return content == null ? '' : String(content);
|
|
19
|
+
}
|
|
20
|
+
function sanitizeAiGatewayResponsesBody(body) {
|
|
21
|
+
if (!body || typeof body !== 'object' || Array.isArray(body)) {
|
|
22
|
+
return body;
|
|
23
|
+
}
|
|
24
|
+
const sanitized = { ...body };
|
|
25
|
+
delete sanitized.vector_store_ids;
|
|
26
|
+
return sanitized;
|
|
27
|
+
}
|
|
28
|
+
function buildChatCompletionsBodyFromMessages(body) {
|
|
29
|
+
const messages = [];
|
|
30
|
+
if (body?.system) {
|
|
31
|
+
const systemText = extractCompletionText(body.system);
|
|
32
|
+
if (systemText) {
|
|
33
|
+
messages.push({ role: 'system', content: systemText });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(body?.messages)) {
|
|
37
|
+
for (const message of body.messages) {
|
|
38
|
+
if (!message?.role || message?.content == null) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
messages.push({
|
|
42
|
+
role: String(message.role),
|
|
43
|
+
content: extractCompletionText(message.content),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (messages.length === 0 && body?.content != null) {
|
|
48
|
+
messages.push({
|
|
49
|
+
role: 'user',
|
|
50
|
+
content: extractCompletionText(body.content),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
model: body?.model,
|
|
55
|
+
messages,
|
|
56
|
+
...(body?.temperature != null ? { temperature: body.temperature } : {}),
|
|
57
|
+
...(body?.max_tokens != null ? { max_tokens: body.max_tokens } : {}),
|
|
58
|
+
...(Array.isArray(body?.stop_sequences) && body.stop_sequences.length > 0
|
|
59
|
+
? { stop: body.stop_sequences }
|
|
60
|
+
: {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function mapChatCompletionFinishReason(reason) {
|
|
64
|
+
if (reason === 'length') {
|
|
65
|
+
return 'max_tokens';
|
|
66
|
+
}
|
|
67
|
+
if (reason === 'content_filter') {
|
|
68
|
+
return 'stop_sequence';
|
|
69
|
+
}
|
|
70
|
+
return 'end_turn';
|
|
71
|
+
}
|
|
72
|
+
function extractPromptFromResponsesBody(body) {
|
|
73
|
+
if (!body || typeof body !== 'object') {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
if (typeof body.input === 'string') {
|
|
77
|
+
return body.input;
|
|
78
|
+
}
|
|
79
|
+
if (typeof body.prompt === 'string') {
|
|
80
|
+
return body.prompt;
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(body.input)) {
|
|
83
|
+
const textParts = [];
|
|
84
|
+
for (const item of body.input) {
|
|
85
|
+
if (item && typeof item === 'object') {
|
|
86
|
+
const candidate = item.content;
|
|
87
|
+
if (typeof candidate === 'string') {
|
|
88
|
+
textParts.push(candidate);
|
|
89
|
+
}
|
|
90
|
+
else if (Array.isArray(candidate)) {
|
|
91
|
+
for (const part of candidate) {
|
|
92
|
+
if (part && typeof part === 'object' && typeof part.text === 'string') {
|
|
93
|
+
textParts.push(part.text);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (textParts.length > 0) {
|
|
100
|
+
return textParts.join('\n');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
105
|
+
function extractPromptFromMessagesBody(body) {
|
|
106
|
+
if (!body || typeof body !== 'object') {
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
if (typeof body.content === 'string') {
|
|
110
|
+
return body.content;
|
|
111
|
+
}
|
|
112
|
+
if (Array.isArray(body.messages)) {
|
|
113
|
+
const lastUser = [...body.messages].reverse().find((item) => item?.role === 'user');
|
|
114
|
+
if (lastUser) {
|
|
115
|
+
if (typeof lastUser.content === 'string') {
|
|
116
|
+
return lastUser.content;
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(lastUser.content)) {
|
|
119
|
+
return lastUser.content
|
|
120
|
+
.filter((part) => part && typeof part === 'object' && typeof part.text === 'string')
|
|
121
|
+
.map((part) => part.text)
|
|
122
|
+
.join('\n');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
function mapChatCompletionToMessagesResponse(body, completion) {
|
|
129
|
+
const choice = Array.isArray(completion?.choices) ? completion.choices[0] : undefined;
|
|
130
|
+
const text = extractCompletionText(choice?.message?.content);
|
|
131
|
+
const prompt = extractPromptFromMessagesBody(body);
|
|
132
|
+
return {
|
|
133
|
+
id: completion?.id ?? `msg_${Date.now()}`,
|
|
134
|
+
type: 'message',
|
|
135
|
+
role: 'assistant',
|
|
136
|
+
model: completion?.model ?? body?.model,
|
|
137
|
+
content: [{ type: 'text', text }],
|
|
138
|
+
stop_reason: mapChatCompletionFinishReason(choice?.finish_reason),
|
|
139
|
+
stop_sequence: null,
|
|
140
|
+
usage: {
|
|
141
|
+
input_tokens: completion?.usage?.prompt_tokens ?? prompt.length,
|
|
142
|
+
output_tokens: completion?.usage?.completion_tokens ?? text.length,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=chat-protocol-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-protocol-adapters.js","sourceRoot":"","sources":["../../../src/api/service/chat-protocol-adapters.ts"],"names":[],"mappings":"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","sourcesContent":["function extractCompletionText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .filter((item) => item && typeof item === 'object' && typeof (item as any).text === 'string')\n .map((item) => (item as any).text)\n .join('\\n');\n }\n\n return content == null ? '' : String(content);\n}\n\nexport function sanitizeAiGatewayResponsesBody(body: any): any {\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n return body;\n }\n\n const sanitized = { ...body };\n delete sanitized.vector_store_ids;\n return sanitized;\n}\n\nexport function buildChatCompletionsBodyFromMessages(body: any): Record<string, unknown> {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (body?.system) {\n const systemText = extractCompletionText(body.system);\n if (systemText) {\n messages.push({ role: 'system', content: systemText });\n }\n }\n\n if (Array.isArray(body?.messages)) {\n for (const message of body.messages) {\n if (!message?.role || message?.content == null) {\n continue;\n }\n\n messages.push({\n role: String(message.role),\n content: extractCompletionText(message.content),\n });\n }\n }\n\n if (messages.length === 0 && body?.content != null) {\n messages.push({\n role: 'user',\n content: extractCompletionText(body.content),\n });\n }\n\n return {\n model: body?.model,\n messages,\n ...(body?.temperature != null ? { temperature: body.temperature } : {}),\n ...(body?.max_tokens != null ? { max_tokens: body.max_tokens } : {}),\n ...(Array.isArray(body?.stop_sequences) && body.stop_sequences.length > 0\n ? { stop: body.stop_sequences }\n : {}),\n };\n}\n\nfunction mapChatCompletionFinishReason(reason: string | null | undefined): string {\n if (reason === 'length') {\n return 'max_tokens';\n }\n if (reason === 'content_filter') {\n return 'stop_sequence';\n }\n return 'end_turn';\n}\n\nexport function extractPromptFromResponsesBody(body: any): string {\n if (!body || typeof body !== 'object') {\n return '';\n }\n\n if (typeof body.input === 'string') {\n return body.input;\n }\n\n if (typeof body.prompt === 'string') {\n return body.prompt;\n }\n\n if (Array.isArray(body.input)) {\n const textParts: string[] = [];\n for (const item of body.input) {\n if (item && typeof item === 'object') {\n const candidate = (item as any).content;\n if (typeof candidate === 'string') {\n textParts.push(candidate);\n } else if (Array.isArray(candidate)) {\n for (const part of candidate) {\n if (part && typeof part === 'object' && typeof (part as any).text === 'string') {\n textParts.push((part as any).text);\n }\n }\n }\n }\n }\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n }\n\n return '';\n}\n\nexport function extractPromptFromMessagesBody(body: any): string {\n if (!body || typeof body !== 'object') {\n return '';\n }\n\n if (typeof body.content === 'string') {\n return body.content;\n }\n\n if (Array.isArray(body.messages)) {\n const lastUser = [...body.messages].reverse().find((item: any) => item?.role === 'user');\n if (lastUser) {\n if (typeof lastUser.content === 'string') {\n return lastUser.content;\n }\n if (Array.isArray(lastUser.content)) {\n return lastUser.content\n .filter((part: any) => part && typeof part === 'object' && typeof part.text === 'string')\n .map((part: any) => part.text)\n .join('\\n');\n }\n }\n }\n\n return '';\n}\n\nexport function mapChatCompletionToMessagesResponse(body: any, completion: any): any {\n const choice = Array.isArray(completion?.choices) ? completion.choices[0] : undefined;\n const text = extractCompletionText(choice?.message?.content);\n const prompt = extractPromptFromMessagesBody(body);\n\n return {\n id: completion?.id ?? `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: completion?.model ?? body?.model,\n content: [{ type: 'text', text }],\n stop_reason: mapChatCompletionFinishReason(choice?.finish_reason),\n stop_sequence: null,\n usage: {\n input_tokens: completion?.usage?.prompt_tokens ?? prompt.length,\n output_tokens: completion?.usage?.completion_tokens ?? text.length,\n },\n };\n}\n"]}
|