@happyvertical/ai 0.74.8
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/AGENT.md +33 -0
- package/LICENSE +7 -0
- package/README.md +384 -0
- package/dist/chunks/anthropic-BRwbhwIl.js +463 -0
- package/dist/chunks/anthropic-BRwbhwIl.js.map +1 -0
- package/dist/chunks/bedrock-Cf1xUerN.js +808 -0
- package/dist/chunks/bedrock-Cf1xUerN.js.map +1 -0
- package/dist/chunks/bifrost-3mXtQsTj.js +233 -0
- package/dist/chunks/bifrost-3mXtQsTj.js.map +1 -0
- package/dist/chunks/claude-cli-BrHRfkry.js +603 -0
- package/dist/chunks/claude-cli-BrHRfkry.js.map +1 -0
- package/dist/chunks/gateway-admin-C4GFPbZF.js +359 -0
- package/dist/chunks/gateway-admin-C4GFPbZF.js.map +1 -0
- package/dist/chunks/gemini-BfpHXDIQ.js +662 -0
- package/dist/chunks/gemini-BfpHXDIQ.js.map +1 -0
- package/dist/chunks/huggingface-280qv9iv.js +366 -0
- package/dist/chunks/huggingface-280qv9iv.js.map +1 -0
- package/dist/chunks/index-BT4thAvS.js +934 -0
- package/dist/chunks/index-BT4thAvS.js.map +1 -0
- package/dist/chunks/litellm-DhPKa_Jz.js +220 -0
- package/dist/chunks/litellm-DhPKa_Jz.js.map +1 -0
- package/dist/chunks/ollama-Di1ldur0.js +851 -0
- package/dist/chunks/ollama-Di1ldur0.js.map +1 -0
- package/dist/chunks/openai-5snI2diE.js +749 -0
- package/dist/chunks/openai-5snI2diE.js.map +1 -0
- package/dist/chunks/qwen-tts-DgPgdXxG.js +365 -0
- package/dist/chunks/qwen-tts-DgPgdXxG.js.map +1 -0
- package/dist/chunks/usage-DMWiJ2oB.js +21 -0
- package/dist/chunks/usage-DMWiJ2oB.js.map +1 -0
- package/dist/cli/claude-context.d.ts +3 -0
- package/dist/cli/claude-context.d.ts.map +1 -0
- package/dist/cli/claude-context.js +21 -0
- package/dist/cli/claude-context.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/node/factory.d.ts +27 -0
- package/dist/node/factory.d.ts.map +1 -0
- package/dist/shared/client.d.ts +410 -0
- package/dist/shared/client.d.ts.map +1 -0
- package/dist/shared/factory.d.ts +83 -0
- package/dist/shared/factory.d.ts.map +1 -0
- package/dist/shared/message.d.ts +71 -0
- package/dist/shared/message.d.ts.map +1 -0
- package/dist/shared/providers/anthropic.d.ts +82 -0
- package/dist/shared/providers/anthropic.d.ts.map +1 -0
- package/dist/shared/providers/bedrock.d.ts +49 -0
- package/dist/shared/providers/bedrock.d.ts.map +1 -0
- package/dist/shared/providers/bifrost.d.ts +25 -0
- package/dist/shared/providers/bifrost.d.ts.map +1 -0
- package/dist/shared/providers/claude-cli.d.ts +139 -0
- package/dist/shared/providers/claude-cli.d.ts.map +1 -0
- package/dist/shared/providers/gateway-admin.d.ts +35 -0
- package/dist/shared/providers/gateway-admin.d.ts.map +1 -0
- package/dist/shared/providers/gemini.d.ts +116 -0
- package/dist/shared/providers/gemini.d.ts.map +1 -0
- package/dist/shared/providers/huggingface.d.ts +33 -0
- package/dist/shared/providers/huggingface.d.ts.map +1 -0
- package/dist/shared/providers/litellm.d.ts +25 -0
- package/dist/shared/providers/litellm.d.ts.map +1 -0
- package/dist/shared/providers/ollama.d.ts +47 -0
- package/dist/shared/providers/ollama.d.ts.map +1 -0
- package/dist/shared/providers/openai.d.ts +272 -0
- package/dist/shared/providers/openai.d.ts.map +1 -0
- package/dist/shared/providers/qwen-tts.d.ts +85 -0
- package/dist/shared/providers/qwen-tts.d.ts.map +1 -0
- package/dist/shared/providers/usage.d.ts +14 -0
- package/dist/shared/providers/usage.d.ts.map +1 -0
- package/dist/shared/rate-limit.d.ts +13 -0
- package/dist/shared/rate-limit.d.ts.map +1 -0
- package/dist/shared/thread.d.ts +104 -0
- package/dist/shared/thread.d.ts.map +1 -0
- package/dist/shared/types.d.ts +1779 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/metadata.json +35 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock-Cf1xUerN.js","sources":["../../src/shared/providers/bedrock.ts"],"sourcesContent":["/**\n * AWS Bedrock provider implementation\n */\n\nimport type {\n AICapabilities,\n AIInterface,\n AIMessage,\n AIModel,\n AIResponse,\n BedrockOptions,\n ChatOptions,\n CompletionOptions,\n EmbeddingOptions,\n EmbeddingResponse,\n ImageDescriptionOptions,\n ImageEmbeddingOptions,\n ImageGenerationOptions,\n ImageGenerationResponse,\n MessageOptions,\n TokenUsage,\n TTSOptions,\n TTSResponse,\n Voice,\n VoiceCloneOptions,\n VoiceDesignOptions,\n VoiceListOptions,\n} from '../types';\nimport {\n AIError,\n AuthenticationError,\n ContextLengthError,\n extractTextContent,\n ModelNotFoundError,\n RateLimitError,\n} from '../types';\nimport { emitUsage } from './usage';\n\nconst BEDROCK_DEFAULT_CHAT_MODEL = 'anthropic.claude-3-5-sonnet-20241022-v2:0';\nconst BEDROCK_TEXT_EMBEDDING_MODEL = 'amazon.titan-embed-text-v2:0';\nconst BEDROCK_IMAGE_EMBEDDING_MODEL = 'amazon.titan-embed-image-v1';\nconst BEDROCK_IMAGE_GENERATION_MODEL = 'amazon.titan-image-generator-v2:0';\n\nexport class BedrockProvider implements AIInterface {\n private options: BedrockOptions;\n private client: any; // Will be BedrockRuntimeClient instance from @aws-sdk/client-bedrock-runtime\n\n constructor(options: BedrockOptions) {\n this.options = {\n defaultModel: BEDROCK_DEFAULT_CHAT_MODEL,\n ...options,\n };\n\n // Initialize AWS Bedrock client\n this.initializeClientSync();\n }\n\n private initializeClientSync() {\n try {\n // Dynamic import in constructor - this will work if the package is installed\n import('@aws-sdk/client-bedrock-runtime')\n .then(({ BedrockRuntimeClient }) => {\n this.client = new BedrockRuntimeClient({\n region: this.options.region,\n credentials: this.options.credentials,\n endpoint: this.options.endpoint,\n });\n })\n .catch(() => {\n // Client will be null and we'll handle it in methods\n });\n } catch (_error) {\n // Client will be null and we'll handle it in methods\n }\n }\n\n private async ensureClient() {\n if (!this.client) {\n try {\n const { BedrockRuntimeClient } = await import(\n '@aws-sdk/client-bedrock-runtime'\n );\n this.client = new BedrockRuntimeClient({\n region: this.options.region,\n credentials: this.options.credentials,\n endpoint: this.options.endpoint,\n });\n } catch (_error) {\n throw new AIError(\n 'Failed to initialize Bedrock client. Make sure @aws-sdk/client-bedrock-runtime is installed.',\n 'INITIALIZATION_ERROR',\n 'bedrock',\n );\n }\n }\n }\n\n async chat(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): Promise<AIResponse> {\n const startTime = Date.now();\n try {\n await this.ensureClient();\n\n const modelId = options.model || this.options.defaultModel;\n const response = this.mapConverseResponse(\n await this.client.converse(\n await this.buildConverseRequest(messages, options, modelId!),\n ),\n modelId!,\n );\n\n emitUsage(\n this.options,\n 'bedrock',\n 'chat',\n response.model || modelId || 'unknown',\n response.usage,\n startTime,\n options.usageTags,\n );\n return response;\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async complete(\n prompt: string,\n options: CompletionOptions = {},\n ): Promise<AIResponse> {\n return this.chat([{ role: 'user', content: prompt }], {\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n n: options.n,\n stop: options.stop,\n stream: options.stream,\n onProgress: options.onProgress,\n usageTags: options.usageTags,\n });\n }\n\n /**\n * Simple message interface for single-turn interactions with optional history\n *\n * @param text - The message text to send\n * @param options - Configuration options including history, model, etc.\n * @returns Promise resolving to the response content string\n */\n async message(text: string, options: MessageOptions = {}): Promise<string> {\n // Build messages array from history + current message\n const messages: AIMessage[] = [\n ...(options.history || []),\n { role: options.role || 'user', content: text },\n ];\n\n const response = await this.chat(messages, {\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n stop: options.stop,\n stream: options.stream,\n frequencyPenalty: options.frequencyPenalty,\n presencePenalty: options.presencePenalty,\n responseFormat: options.responseFormat,\n seed: options.seed,\n tools: options.tools,\n toolChoice: options.toolChoice,\n onProgress: options.onProgress,\n usageTags: options.usageTags,\n });\n\n return response.content;\n }\n\n async embed(\n text: string | string[],\n options: EmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n const startTime = Date.now();\n try {\n await this.ensureClient();\n\n const model = options.model || BEDROCK_TEXT_EMBEDDING_MODEL;\n const inputs = Array.isArray(text) ? text : [text];\n const embeddings: number[][] = [];\n let totalTokens = 0;\n\n for (const inputText of inputs) {\n const response = await this.client.invokeModel({\n modelId: model,\n contentType: 'application/json',\n accept: 'application/json',\n body: JSON.stringify({\n inputText,\n ...(options.dimensions && { dimensions: options.dimensions }),\n normalize: true,\n }),\n });\n\n const payload = await this.parseInvokeModelBody(response.body);\n const embedding = this.extractEmbeddingVector(payload);\n if (embedding) {\n embeddings.push(embedding);\n }\n\n totalTokens +=\n payload.inputTextTokenCount ||\n payload.inputTokenCount ||\n payload.tokenCount ||\n 0;\n }\n\n const usage: TokenUsage | undefined =\n totalTokens > 0\n ? {\n promptTokens: totalTokens,\n completionTokens: 0,\n totalTokens,\n }\n : undefined;\n\n emitUsage(\n this.options,\n 'bedrock',\n 'embed',\n model,\n usage,\n startTime,\n options.usageTags,\n );\n\n return {\n embeddings,\n model,\n usage,\n };\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async embedImage(\n image: string | Buffer,\n options: ImageEmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n const startTime = Date.now();\n try {\n await this.ensureClient();\n\n const model = options.model || BEDROCK_IMAGE_EMBEDDING_MODEL;\n const response = await this.client.invokeModel({\n modelId: model,\n contentType: 'application/json',\n accept: 'application/json',\n body: JSON.stringify({\n inputImage: await this.imageToBase64(image),\n ...(options.dimensions && {\n embeddingConfig: {\n outputEmbeddingLength: options.dimensions,\n },\n }),\n }),\n });\n\n const payload = await this.parseInvokeModelBody(response.body);\n const embedding = this.extractEmbeddingVector(payload);\n\n emitUsage(\n this.options,\n 'bedrock',\n 'embedImage',\n model,\n undefined,\n startTime,\n );\n\n return {\n embeddings: embedding ? [embedding] : [],\n model,\n };\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async describeImage(\n image: string | Buffer,\n prompt?: string,\n options: ImageDescriptionOptions = {},\n ): Promise<string> {\n const imageUrl = await this.imageToDataUrl(image);\n const response = await this.chat(\n [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text:\n prompt ||\n 'Describe this image for a search index. Include objects, mood, lighting, and any visible text.',\n },\n {\n type: 'image_url',\n image_url: { url: imageUrl },\n },\n ],\n },\n ],\n {\n model: options.model || this.options.defaultModel,\n maxTokens: options.maxTokens || 500,\n },\n );\n\n return response.content;\n }\n\n async generateImage(\n prompt: string,\n options: ImageGenerationOptions = {},\n ): Promise<ImageGenerationResponse> {\n try {\n await this.ensureClient();\n\n const model = options.model || BEDROCK_IMAGE_GENERATION_MODEL;\n const size = this.resolveImageSize(options);\n const response = await this.client.invokeModel({\n modelId: model,\n contentType: 'application/json',\n accept: 'application/json',\n body: JSON.stringify({\n taskType: 'TEXT_IMAGE',\n textToImageParams: {\n text: prompt,\n ...(options.imageInput && {\n conditionImage: await this.imageToBase64(options.imageInput),\n }),\n },\n imageGenerationConfig: {\n numberOfImages: options.n || 1,\n quality: this.mapImageQuality(options.quality),\n ...size,\n },\n }),\n });\n\n const payload = await this.parseInvokeModelBody(response.body);\n if (payload.error) {\n throw new AIError(payload.error, 'API_ERROR', 'bedrock');\n }\n\n const images = (payload.images || []).map((encoded: string) => {\n const mimeType = 'image/png';\n if (options.outputFormat === 'base64') {\n return { data: encoded, mimeType };\n }\n if (options.outputFormat === 'url') {\n return { data: `data:${mimeType};base64,${encoded}`, mimeType };\n }\n return {\n data: Buffer.from(encoded, 'base64'),\n mimeType,\n };\n });\n\n return {\n images,\n model,\n };\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async *stream(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): AsyncIterable<string> {\n const startTime = Date.now();\n try {\n await this.ensureClient();\n\n const modelId = options.model || this.options.defaultModel;\n const response = await this.client.converseStream(\n await this.buildConverseRequest(messages, options, modelId!),\n );\n\n let usage: TokenUsage | undefined;\n\n for await (const event of response.stream || []) {\n const text = event.contentBlockDelta?.delta?.text;\n if (text) {\n if (options.onProgress) {\n options.onProgress(text);\n }\n yield text;\n }\n\n if (event.metadata?.usage) {\n usage = {\n promptTokens: event.metadata.usage.inputTokens || 0,\n completionTokens: event.metadata.usage.outputTokens || 0,\n totalTokens: event.metadata.usage.totalTokens || 0,\n };\n }\n }\n\n emitUsage(\n this.options,\n 'bedrock',\n 'stream',\n modelId || 'unknown',\n usage,\n startTime,\n options.usageTags,\n );\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async countTokens(text: string): Promise<number> {\n try {\n await this.ensureClient();\n\n const modelId = this.options.defaultModel || BEDROCK_DEFAULT_CHAT_MODEL;\n const response = await this.client.countTokens({\n modelId,\n input: {\n converse: {\n messages: [\n {\n role: 'user',\n content: [{ text }],\n },\n ],\n },\n },\n });\n\n return response.inputTokens || Math.ceil(text.length / 4);\n } catch (error) {\n throw this.mapError(error);\n }\n }\n\n async getModels(): Promise<AIModel[]> {\n // Return static list of popular Bedrock models\n return [\n // Anthropic Claude models\n {\n id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',\n name: 'Claude 3.5 Sonnet v2',\n description: 'Latest Claude 3.5 Sonnet model on Bedrock',\n contextLength: 200000,\n capabilities: ['text', 'chat', 'vision', 'functions'],\n supportsFunctions: true,\n supportsVision: true,\n },\n {\n id: 'anthropic.claude-3-opus-20240229-v1:0',\n name: 'Claude 3 Opus',\n description: 'Most powerful Claude model on Bedrock',\n contextLength: 200000,\n capabilities: ['text', 'chat', 'vision'],\n supportsFunctions: false,\n supportsVision: true,\n },\n // Amazon Titan models\n {\n id: 'amazon.titan-text-premier-v1:0',\n name: 'Titan Text Premier',\n description: 'Premier Amazon Titan text model',\n contextLength: 32000,\n capabilities: ['text', 'chat'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: 'amazon.titan-embed-text-v1',\n name: 'Titan Embeddings Text',\n description: 'Amazon Titan text embeddings model',\n contextLength: 8192,\n capabilities: ['embeddings'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: BEDROCK_TEXT_EMBEDDING_MODEL,\n name: 'Titan Embeddings Text V2',\n description: 'Amazon Titan text embeddings v2 model',\n contextLength: 8192,\n capabilities: ['embeddings'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: BEDROCK_IMAGE_EMBEDDING_MODEL,\n name: 'Titan Multimodal Embeddings G1',\n description:\n 'Amazon Titan multimodal embeddings model for image similarity',\n contextLength: 256,\n capabilities: ['embeddings', 'image_embedding'],\n supportsFunctions: false,\n supportsVision: false,\n },\n {\n id: BEDROCK_IMAGE_GENERATION_MODEL,\n name: 'Titan Image Generator V2',\n description: 'Amazon Titan image generation model',\n contextLength: 0,\n capabilities: ['image_generation'],\n supportsFunctions: false,\n supportsVision: false,\n },\n // Cohere models\n {\n id: 'cohere.command-r-plus-v1:0',\n name: 'Command R+',\n description: 'Cohere Command R+ model with advanced capabilities',\n contextLength: 128000,\n capabilities: ['text', 'chat', 'functions'],\n supportsFunctions: true,\n supportsVision: false,\n },\n // Meta Llama models\n {\n id: 'meta.llama3-1-405b-instruct-v1:0',\n name: 'Llama 3.1 405B Instruct',\n description: 'Meta Llama 3.1 405B instruction-tuned model',\n contextLength: 128000,\n capabilities: ['text', 'chat'],\n supportsFunctions: false,\n supportsVision: false,\n },\n ];\n }\n\n async getCapabilities(): Promise<AICapabilities> {\n return {\n chat: true,\n completion: true,\n embeddings: true,\n streaming: true,\n functions: true, // Some models support function calling\n vision: true, // Some models support vision\n fineTuning: true, // Via Bedrock fine-tuning\n imageEmbeddings: true,\n imageGeneration: true,\n tts: false,\n voiceCloning: false,\n voiceDesign: false,\n maxContextLength: 200000,\n supportedOperations: [\n 'chat',\n 'completion',\n 'embedding',\n 'streaming',\n 'functions',\n 'vision',\n 'image_embedding',\n 'image_generation',\n ],\n };\n }\n\n // ============================================================================\n // TTS Methods (Not supported - use Qwen3-TTS provider)\n // ============================================================================\n\n async synthesizeSpeech(\n _text: string,\n _options?: TTSOptions,\n ): Promise<TTSResponse> {\n throw new AIError(\n 'TTS is not supported by Bedrock provider. Use Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'bedrock',\n );\n }\n\n streamSpeech(_text: string, _options?: TTSOptions): AsyncIterable<Buffer> {\n const error = new AIError(\n 'TTS streaming is not supported by Bedrock provider. Use Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'bedrock',\n );\n return {\n [Symbol.asyncIterator]: () => ({\n next: () => Promise.reject(error),\n }),\n };\n }\n\n async cloneVoice(_options: VoiceCloneOptions): Promise<Voice> {\n throw new AIError(\n 'Voice cloning is not supported by Bedrock provider. Use Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'bedrock',\n );\n }\n\n async designVoice(_options: VoiceDesignOptions): Promise<Voice> {\n throw new AIError(\n 'Voice design is not supported by Bedrock provider. Use Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'bedrock',\n );\n }\n\n async getVoices(_options?: VoiceListOptions): Promise<Voice[]> {\n throw new AIError(\n 'Voice listing is not supported by Bedrock provider. Use Qwen3-TTS provider.',\n 'NOT_IMPLEMENTED',\n 'bedrock',\n );\n }\n\n private async buildConverseRequest(\n messages: AIMessage[],\n options: ChatOptions,\n modelId: string,\n ): Promise<Record<string, any>> {\n const { system, bedrockMessages } =\n await this.mapMessagesToBedrock(messages);\n const systemPrompt =\n options.responseFormat?.type === 'json_object'\n ? [\n system,\n 'Respond with valid JSON only. Do not include explanatory text outside the JSON object.',\n ]\n .filter(Boolean)\n .join('\\n\\n')\n : system;\n\n const inferenceConfig = Object.fromEntries(\n Object.entries({\n maxTokens: options.maxTokens || 4096,\n temperature: options.temperature,\n topP: options.topP,\n stopSequences: Array.isArray(options.stop)\n ? options.stop\n : options.stop\n ? [options.stop]\n : undefined,\n }).filter(([, value]) => value !== undefined),\n );\n\n const request: Record<string, any> = {\n modelId,\n messages: bedrockMessages,\n ...(Object.keys(inferenceConfig).length > 0 && { inferenceConfig }),\n ...(systemPrompt && { system: [{ text: systemPrompt }] }),\n };\n\n const toolConfig = this.mapToolConfig(options);\n if (toolConfig) {\n request.toolConfig = toolConfig;\n }\n\n return request;\n }\n\n private async mapMessagesToBedrock(messages: AIMessage[]): Promise<{\n system?: string;\n bedrockMessages: Array<{ role: 'user' | 'assistant'; content: any[] }>;\n }> {\n let system: string | undefined;\n const bedrockMessages: Array<{\n role: 'user' | 'assistant';\n content: any[];\n }> = [];\n\n for (const message of messages) {\n const textContent = extractTextContent(message.content);\n if (message.role === 'system') {\n system = system ? `${system}\\n\\n${textContent}` : textContent;\n continue;\n }\n\n const content: any[] = [];\n if (typeof message.content === 'string') {\n content.push({ text: message.content });\n } else {\n for (const part of message.content) {\n if (part.type === 'text') {\n content.push({ text: part.text });\n continue;\n }\n\n const image = await this.imageUrlToBedrockImage(part.image_url.url);\n content.push({ image });\n }\n }\n\n if (message.role === 'assistant' && message.tool_calls) {\n for (const toolCall of message.tool_calls) {\n content.push({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.function.name,\n input: this.safeJsonParse(toolCall.function.arguments),\n },\n });\n }\n }\n\n if (content.length === 0 && textContent) {\n content.push({ text: textContent });\n }\n\n bedrockMessages.push({\n role: message.role === 'assistant' ? 'assistant' : 'user',\n content,\n });\n }\n\n return { system, bedrockMessages };\n }\n\n private mapConverseResponse(response: any, modelId: string): AIResponse {\n const contentBlocks = response.output?.message?.content || [];\n const textContent = contentBlocks\n .filter((block: any) => typeof block.text === 'string')\n .map((block: any) => block.text)\n .join('');\n\n const toolCalls = contentBlocks\n .filter((block: any) => block.toolUse)\n .map((block: any) => ({\n id: block.toolUse.toolUseId,\n type: 'function' as const,\n function: {\n name: block.toolUse.name,\n arguments: JSON.stringify(block.toolUse.input || {}),\n },\n }));\n\n const usage =\n response.usage &&\n ({\n promptTokens: response.usage.inputTokens || 0,\n completionTokens: response.usage.outputTokens || 0,\n totalTokens: response.usage.totalTokens || 0,\n } satisfies TokenUsage);\n\n return {\n content: textContent,\n model: modelId,\n finishReason: this.mapBedrockFinishReason(response.stopReason),\n usage,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n }\n\n private mapBedrockFinishReason(\n reason: string | null | undefined,\n ): AIResponse['finishReason'] {\n switch (reason) {\n case 'end_turn':\n return 'stop';\n case 'max_tokens':\n return 'length';\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool_calls';\n default:\n return 'stop';\n }\n }\n\n private mapToolConfig(options: ChatOptions): Record<string, any> | undefined {\n if (!options.tools || options.tools.length === 0) {\n return undefined;\n }\n\n if (options.toolChoice === 'none') {\n return undefined;\n }\n\n return {\n tools: options.tools.map((tool) => ({\n toolSpec: {\n name: tool.function.name,\n description: tool.function.description || '',\n inputSchema: {\n json: tool.function.parameters || { type: 'object' },\n },\n },\n })),\n ...(options.toolChoice && {\n toolChoice: this.mapToolChoice(options.toolChoice),\n }),\n };\n }\n\n private mapToolChoice(\n toolChoice?:\n | 'auto'\n | 'none'\n | { type: 'function'; function: { name: string } },\n ): Record<string, any> | undefined {\n if (!toolChoice || toolChoice === 'auto') {\n return { auto: {} };\n }\n\n if (toolChoice === 'none') {\n return undefined;\n }\n\n return {\n tool: {\n name: toolChoice.function.name,\n },\n };\n }\n\n private async parseInvokeModelBody(body: unknown): Promise<any> {\n const bytes =\n typeof (body as any)?.transformToByteArray === 'function'\n ? await (body as any).transformToByteArray()\n : body instanceof Uint8Array\n ? body\n : Buffer.isBuffer(body)\n ? body\n : new Uint8Array(body as ArrayBuffer);\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n\n private extractEmbeddingVector(payload: any): number[] | undefined {\n if (Array.isArray(payload.embedding)) {\n return payload.embedding;\n }\n\n if (Array.isArray(payload.embeddings?.[0])) {\n return payload.embeddings[0];\n }\n\n if (Array.isArray(payload.embeddingsByType?.float)) {\n return payload.embeddingsByType.float;\n }\n\n if (Array.isArray(payload.vector)) {\n return payload.vector;\n }\n\n return undefined;\n }\n\n private async imageUrlToBedrockImage(imageUrl: string): Promise<any> {\n const { bytes, mimeType } = await this.imageToBytes(imageUrl);\n return {\n format: this.mimeTypeToBedrockImageFormat(mimeType),\n source: { bytes },\n };\n }\n\n private async imageToDataUrl(image: string | Buffer): Promise<string> {\n if (Buffer.isBuffer(image)) {\n return `data:image/png;base64,${image.toString('base64')}`;\n }\n if (image.startsWith('data:')) {\n return image;\n }\n\n const { bytes, mimeType } = await this.imageToBytes(image);\n return `data:${mimeType};base64,${Buffer.from(bytes).toString('base64')}`;\n }\n\n private async imageToBase64(image: string | Buffer): Promise<string> {\n if (Buffer.isBuffer(image)) {\n return image.toString('base64');\n }\n if (image.startsWith('data:')) {\n const match = image.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new AIError(\n 'Invalid base64 data URL format',\n 'INVALID_INPUT',\n 'bedrock',\n );\n }\n return match[2];\n }\n\n const { bytes } = await this.imageToBytes(image);\n return Buffer.from(bytes).toString('base64');\n }\n\n private async imageToBytes(\n image: string,\n ): Promise<{ bytes: Uint8Array; mimeType: string }> {\n if (image.startsWith('data:')) {\n const match = image.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new AIError(\n 'Invalid base64 data URL format',\n 'INVALID_INPUT',\n 'bedrock',\n );\n }\n\n return {\n bytes: Uint8Array.from(Buffer.from(match[2], 'base64')),\n mimeType: match[1],\n };\n }\n\n const response = await fetch(image);\n if (!response.ok) {\n throw new AIError(\n `Failed to fetch image: ${response.status} ${response.statusText}`,\n 'IMAGE_FETCH_ERROR',\n 'bedrock',\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return {\n bytes: new Uint8Array(arrayBuffer),\n mimeType: response.headers.get('content-type') || 'image/png',\n };\n }\n\n private mimeTypeToBedrockImageFormat(mimeType: string): string {\n if (mimeType.includes('png')) return 'png';\n if (mimeType.includes('jpeg') || mimeType.includes('jpg')) return 'jpeg';\n if (mimeType.includes('gif')) return 'gif';\n if (mimeType.includes('webp')) return 'webp';\n\n throw new AIError(\n `Unsupported image format for Bedrock: ${mimeType}`,\n 'INVALID_INPUT',\n 'bedrock',\n );\n }\n\n private resolveImageSize(options: ImageGenerationOptions): {\n width: number;\n height: number;\n } {\n if (options.size) {\n const [width, height] = options.size.split('x').map(Number);\n if (Number.isFinite(width) && Number.isFinite(height)) {\n return { width, height };\n }\n }\n\n const aspectRatioSizes: Record<string, { width: number; height: number }> =\n {\n '1:1': { width: 1024, height: 1024 },\n '2:3': { width: 768, height: 1152 },\n '3:2': { width: 1152, height: 768 },\n '3:5': { width: 768, height: 1280 },\n '5:3': { width: 1280, height: 768 },\n '7:9': { width: 896, height: 1152 },\n '9:7': { width: 1152, height: 896 },\n '6:11': { width: 768, height: 1408 },\n '11:6': { width: 1408, height: 768 },\n '5:11': { width: 640, height: 1408 },\n '11:5': { width: 1408, height: 640 },\n '9:5': { width: 1152, height: 640 },\n '16:9': { width: 1173, height: 640 },\n };\n\n return (\n aspectRatioSizes[options.aspectRatio || ''] || {\n width: 1024,\n height: 1024,\n }\n );\n }\n\n private mapImageQuality(quality?: string): string {\n if (!quality || quality === 'standard') {\n return 'standard';\n }\n\n if (quality === 'hd') {\n return 'premium';\n }\n\n return quality;\n }\n\n private safeJsonParse(input: string): any {\n try {\n return JSON.parse(input);\n } catch {\n return { rawArguments: input };\n }\n }\n\n private mapError(error: unknown): AIError {\n if (error instanceof AIError) {\n return error;\n }\n\n // Map common AWS error codes\n if (typeof error === 'object' && error !== null) {\n const awsError = error as { name?: string; message?: string };\n\n if (awsError.name === 'AccessDeniedException') {\n return new AuthenticationError('bedrock');\n }\n\n if (awsError.name === 'ThrottlingException') {\n return new RateLimitError('bedrock');\n }\n\n if (awsError.name === 'ResourceNotFoundException') {\n return new ModelNotFoundError(\n awsError.message || 'Model not found',\n 'bedrock',\n );\n }\n\n if (\n awsError.name === 'ValidationException' &&\n awsError.message?.includes('input is too long')\n ) {\n return new ContextLengthError('bedrock');\n }\n }\n\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown Bedrock error occurred';\n return new AIError(errorMessage, 'UNKNOWN_ERROR', 'bedrock');\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { ValidationError } from "@happyvertical/utils";
|
|
2
|
+
import { B as BifrostAdmin, r as resolveGatewayAdminBaseUrl, n as normalizeGatewayBaseUrl } from "./gateway-admin-C4GFPbZF.js";
|
|
3
|
+
import { OpenAIProvider } from "./openai-5snI2diE.js";
|
|
4
|
+
const BIFROST_CAPABILITIES = {
|
|
5
|
+
chat: true,
|
|
6
|
+
completion: true,
|
|
7
|
+
embeddings: true,
|
|
8
|
+
streaming: true,
|
|
9
|
+
functions: true,
|
|
10
|
+
vision: true,
|
|
11
|
+
fineTuning: false,
|
|
12
|
+
imageEmbeddings: true,
|
|
13
|
+
imageGeneration: true,
|
|
14
|
+
tts: false,
|
|
15
|
+
voiceCloning: false,
|
|
16
|
+
voiceDesign: false,
|
|
17
|
+
maxContextLength: 128e3,
|
|
18
|
+
supportedOperations: [
|
|
19
|
+
"chat",
|
|
20
|
+
"completion",
|
|
21
|
+
"embedding",
|
|
22
|
+
"streaming",
|
|
23
|
+
"functions",
|
|
24
|
+
"vision",
|
|
25
|
+
"image_embedding",
|
|
26
|
+
"image_generation"
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
function isEmbeddingModel(modelId) {
|
|
30
|
+
return /embed/i.test(modelId);
|
|
31
|
+
}
|
|
32
|
+
function isImageEmbeddingModel(modelId) {
|
|
33
|
+
return /titan-embed-image|multimodalembedding|image[-_]?embed|clip/i.test(
|
|
34
|
+
modelId
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
function isImageGenerationModel(modelId) {
|
|
38
|
+
return /gpt-image|dall-e|imagen|stable[-_ ]diffusion|sdxl|flux|titan-image|image-generator/i.test(
|
|
39
|
+
modelId
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
function isFilteredBifrostModel(modelId) {
|
|
43
|
+
return /moderation|transcrib|whisper|speech|tts|rerank/i.test(modelId);
|
|
44
|
+
}
|
|
45
|
+
function inferBifrostContextLength(modelId) {
|
|
46
|
+
if (isEmbeddingModel(modelId)) return 8192;
|
|
47
|
+
if (/gemini-1\.5|gemini-2\.0|gemini-2\.5|gemini-3/i.test(modelId)) {
|
|
48
|
+
return 1e6;
|
|
49
|
+
}
|
|
50
|
+
if (/claude/i.test(modelId)) return 2e5;
|
|
51
|
+
if (/gpt-4o|gpt-4\.1|o1|o3|o4|llama|mistral|qwen|deepseek/i.test(modelId)) {
|
|
52
|
+
return 128e3;
|
|
53
|
+
}
|
|
54
|
+
return 32768;
|
|
55
|
+
}
|
|
56
|
+
function inferBifrostFunctions(modelId) {
|
|
57
|
+
if (isEmbeddingModel(modelId)) return false;
|
|
58
|
+
return /gpt|claude|gemini|command|llama|mistral|qwen|deepseek|o1|o3|o4/i.test(
|
|
59
|
+
modelId
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
function inferBifrostVision(modelId) {
|
|
63
|
+
return /gpt-4o|gpt-4\.1|vision|claude-3|gemini|pixtral|llava|qwen.*vl|vl-/i.test(
|
|
64
|
+
modelId
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function inferBifrostCapabilities(modelId) {
|
|
68
|
+
if (isImageGenerationModel(modelId)) {
|
|
69
|
+
return ["image_generation"];
|
|
70
|
+
}
|
|
71
|
+
if (isImageEmbeddingModel(modelId)) {
|
|
72
|
+
return ["embeddings", "image_embedding"];
|
|
73
|
+
}
|
|
74
|
+
if (isEmbeddingModel(modelId)) {
|
|
75
|
+
return ["embeddings"];
|
|
76
|
+
}
|
|
77
|
+
const capabilities = ["text", "chat"];
|
|
78
|
+
if (inferBifrostFunctions(modelId)) {
|
|
79
|
+
capabilities.push("functions");
|
|
80
|
+
}
|
|
81
|
+
if (inferBifrostVision(modelId)) {
|
|
82
|
+
capabilities.push("vision");
|
|
83
|
+
}
|
|
84
|
+
return capabilities;
|
|
85
|
+
}
|
|
86
|
+
function ensureBifrostOptions(options) {
|
|
87
|
+
if (!options.baseUrl?.trim()) {
|
|
88
|
+
throw new ValidationError("Bifrost baseUrl is required", {
|
|
89
|
+
provider: "bifrost",
|
|
90
|
+
hint: "Pass baseUrl like http://localhost:8080, http://localhost:8080/openai, or http://localhost:8080/v1 and optionally adminBaseUrl for governance endpoints"
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const baseUrl = normalizeGatewayBaseUrl(options.baseUrl);
|
|
94
|
+
const inferenceBaseUrl = /\/(?:openai|v1|pydanticai\/v1)$/.test(baseUrl) ? baseUrl : `${baseUrl}/openai`;
|
|
95
|
+
const headers = options.apiKey ? {
|
|
96
|
+
...options.headers,
|
|
97
|
+
"x-bf-vk": options.apiKey,
|
|
98
|
+
"x-api-key": options.apiKey
|
|
99
|
+
} : options.headers;
|
|
100
|
+
return {
|
|
101
|
+
...options,
|
|
102
|
+
baseUrl: inferenceBaseUrl,
|
|
103
|
+
headers
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const BIFROST_PROFILE = {
|
|
107
|
+
providerLabel: "Bifrost",
|
|
108
|
+
providerName: "bifrost",
|
|
109
|
+
defaultModel: "openai/gpt-4o-mini",
|
|
110
|
+
capabilities: BIFROST_CAPABILITIES,
|
|
111
|
+
describeModel: (modelId) => `Bifrost model: ${modelId}`,
|
|
112
|
+
getContextLength: inferBifrostContextLength,
|
|
113
|
+
getModelCapabilities: inferBifrostCapabilities,
|
|
114
|
+
shouldIncludeModel: (modelId) => !isFilteredBifrostModel(modelId),
|
|
115
|
+
supportsFunctions: inferBifrostFunctions,
|
|
116
|
+
supportsVision: inferBifrostVision
|
|
117
|
+
};
|
|
118
|
+
function supportsCapability(model, capability) {
|
|
119
|
+
if (capability === "vision") {
|
|
120
|
+
return model.capabilities.includes("vision") || model.supportsVision === true;
|
|
121
|
+
}
|
|
122
|
+
if (capability === "embeddings") {
|
|
123
|
+
return model.capabilities.includes("embeddings");
|
|
124
|
+
}
|
|
125
|
+
if (capability === "image_generation") {
|
|
126
|
+
return model.capabilities.includes("image_generation");
|
|
127
|
+
}
|
|
128
|
+
return model.capabilities.includes("chat");
|
|
129
|
+
}
|
|
130
|
+
class BifrostProvider extends OpenAIProvider {
|
|
131
|
+
admin;
|
|
132
|
+
configuredDefaultModel;
|
|
133
|
+
resolvedModelCache = /* @__PURE__ */ new Map();
|
|
134
|
+
constructor(options) {
|
|
135
|
+
const normalized = ensureBifrostOptions(options);
|
|
136
|
+
super(normalized, BIFROST_PROFILE);
|
|
137
|
+
const adminKey = normalized.adminApiKey || normalized.apiKey;
|
|
138
|
+
const adminUsername = normalized.adminUser || normalized.adminUsername;
|
|
139
|
+
this.admin = new BifrostAdmin({
|
|
140
|
+
provider: "bifrost",
|
|
141
|
+
baseUrl: resolveGatewayAdminBaseUrl(
|
|
142
|
+
normalized.baseUrl,
|
|
143
|
+
normalized.adminUrl || normalized.adminBaseUrl,
|
|
144
|
+
"bifrost"
|
|
145
|
+
),
|
|
146
|
+
apiKey: adminKey,
|
|
147
|
+
username: adminUsername,
|
|
148
|
+
password: normalized.adminPassword,
|
|
149
|
+
headers: adminKey && !(adminUsername && normalized.adminPassword) ? {
|
|
150
|
+
...normalized.adminHeaders,
|
|
151
|
+
"x-bf-vk": adminKey,
|
|
152
|
+
"x-api-key": adminKey
|
|
153
|
+
} : normalized.adminHeaders,
|
|
154
|
+
timeout: normalized.timeout
|
|
155
|
+
});
|
|
156
|
+
this.configuredDefaultModel = normalized.defaultModel;
|
|
157
|
+
}
|
|
158
|
+
async resolveModel(capability, explicitModel) {
|
|
159
|
+
if (explicitModel) {
|
|
160
|
+
return explicitModel;
|
|
161
|
+
}
|
|
162
|
+
if (this.configuredDefaultModel && (capability === "chat" || capability === "vision")) {
|
|
163
|
+
return this.configuredDefaultModel;
|
|
164
|
+
}
|
|
165
|
+
const cached = this.resolvedModelCache.get(capability);
|
|
166
|
+
if (cached) {
|
|
167
|
+
return cached;
|
|
168
|
+
}
|
|
169
|
+
const pending = this.selectModel(capability).catch((error) => {
|
|
170
|
+
this.resolvedModelCache.delete(capability);
|
|
171
|
+
throw error;
|
|
172
|
+
});
|
|
173
|
+
this.resolvedModelCache.set(capability, pending);
|
|
174
|
+
return pending;
|
|
175
|
+
}
|
|
176
|
+
async selectModel(capability) {
|
|
177
|
+
const models = await super.getModels();
|
|
178
|
+
const model = models.find(
|
|
179
|
+
(candidate) => supportsCapability(candidate, capability)
|
|
180
|
+
);
|
|
181
|
+
if (!model) {
|
|
182
|
+
throw new ValidationError(
|
|
183
|
+
`No ${capability} model is available from the Bifrost gateway`,
|
|
184
|
+
{
|
|
185
|
+
provider: "bifrost",
|
|
186
|
+
capability,
|
|
187
|
+
hint: "Pass defaultModel explicitly or ensure the gateway returns a compatible model for this key"
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
return model.id;
|
|
192
|
+
}
|
|
193
|
+
async chat(messages, options = {}) {
|
|
194
|
+
return super.chat(messages, {
|
|
195
|
+
...options,
|
|
196
|
+
model: await this.resolveModel("chat", options.model)
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async *stream(messages, options = {}) {
|
|
200
|
+
yield* super.stream(messages, {
|
|
201
|
+
...options,
|
|
202
|
+
model: await this.resolveModel("chat", options.model)
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async describeImage(image, prompt, options = {}) {
|
|
206
|
+
return super.describeImage(image, prompt, {
|
|
207
|
+
...options,
|
|
208
|
+
model: await this.resolveModel("vision", options.model)
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async embed(text, options = {}) {
|
|
212
|
+
return super.embed(text, {
|
|
213
|
+
...options,
|
|
214
|
+
model: await this.resolveModel("embeddings", options.model)
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async embedImage(image, options = {}) {
|
|
218
|
+
return super.embedImage(image, {
|
|
219
|
+
...options,
|
|
220
|
+
model: await this.resolveModel("embeddings", options.model)
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async generateImage(prompt, options = {}) {
|
|
224
|
+
return super.generateImage(prompt, {
|
|
225
|
+
...options,
|
|
226
|
+
model: await this.resolveModel("image_generation", options.model)
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export {
|
|
231
|
+
BifrostProvider
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=bifrost-3mXtQsTj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bifrost-3mXtQsTj.js","sources":["../../src/shared/providers/bifrost.ts"],"sourcesContent":["import { ValidationError } from '@happyvertical/utils';\n\nimport type {\n AICapabilities,\n AIMessage,\n AIModel,\n AIResponse,\n BifrostOptions,\n ChatOptions,\n EmbeddingOptions,\n EmbeddingResponse,\n ImageDescriptionOptions,\n ImageEmbeddingOptions,\n ImageGenerationOptions,\n ImageGenerationResponse,\n} from '../types';\nimport {\n BifrostAdmin,\n normalizeGatewayBaseUrl,\n resolveGatewayAdminBaseUrl,\n} from './gateway-admin';\nimport { type OpenAICompatibleProfile, OpenAIProvider } from './openai';\n\nconst BIFROST_CAPABILITIES: AICapabilities = {\n chat: true,\n completion: true,\n embeddings: true,\n streaming: true,\n functions: true,\n vision: true,\n fineTuning: false,\n imageEmbeddings: true,\n imageGeneration: true,\n tts: false,\n voiceCloning: false,\n voiceDesign: false,\n maxContextLength: 128000,\n supportedOperations: [\n 'chat',\n 'completion',\n 'embedding',\n 'streaming',\n 'functions',\n 'vision',\n 'image_embedding',\n 'image_generation',\n ],\n};\n\nfunction isEmbeddingModel(modelId: string): boolean {\n return /embed/i.test(modelId);\n}\n\nfunction isImageEmbeddingModel(modelId: string): boolean {\n return /titan-embed-image|multimodalembedding|image[-_]?embed|clip/i.test(\n modelId,\n );\n}\n\nfunction isImageGenerationModel(modelId: string): boolean {\n return /gpt-image|dall-e|imagen|stable[-_ ]diffusion|sdxl|flux|titan-image|image-generator/i.test(\n modelId,\n );\n}\n\nfunction isFilteredBifrostModel(modelId: string): boolean {\n return /moderation|transcrib|whisper|speech|tts|rerank/i.test(modelId);\n}\n\nfunction inferBifrostContextLength(modelId: string): number {\n if (isEmbeddingModel(modelId)) return 8192;\n if (/gemini-1\\.5|gemini-2\\.0|gemini-2\\.5|gemini-3/i.test(modelId)) {\n return 1000000;\n }\n if (/claude/i.test(modelId)) return 200000;\n if (/gpt-4o|gpt-4\\.1|o1|o3|o4|llama|mistral|qwen|deepseek/i.test(modelId)) {\n return 128000;\n }\n return 32768;\n}\n\nfunction inferBifrostFunctions(modelId: string): boolean {\n if (isEmbeddingModel(modelId)) return false;\n return /gpt|claude|gemini|command|llama|mistral|qwen|deepseek|o1|o3|o4/i.test(\n modelId,\n );\n}\n\nfunction inferBifrostVision(modelId: string): boolean {\n return /gpt-4o|gpt-4\\.1|vision|claude-3|gemini|pixtral|llava|qwen.*vl|vl-/i.test(\n modelId,\n );\n}\n\nfunction inferBifrostCapabilities(modelId: string): string[] {\n if (isImageGenerationModel(modelId)) {\n return ['image_generation'];\n }\n\n if (isImageEmbeddingModel(modelId)) {\n return ['embeddings', 'image_embedding'];\n }\n\n if (isEmbeddingModel(modelId)) {\n return ['embeddings'];\n }\n\n const capabilities = ['text', 'chat'];\n\n if (inferBifrostFunctions(modelId)) {\n capabilities.push('functions');\n }\n\n if (inferBifrostVision(modelId)) {\n capabilities.push('vision');\n }\n\n return capabilities;\n}\n\nfunction ensureBifrostOptions(options: BifrostOptions): BifrostOptions {\n if (!options.baseUrl?.trim()) {\n throw new ValidationError('Bifrost baseUrl is required', {\n provider: 'bifrost',\n hint: 'Pass baseUrl like http://localhost:8080, http://localhost:8080/openai, or http://localhost:8080/v1 and optionally adminBaseUrl for governance endpoints',\n });\n }\n\n const baseUrl = normalizeGatewayBaseUrl(options.baseUrl);\n const inferenceBaseUrl = /\\/(?:openai|v1|pydanticai\\/v1)$/.test(baseUrl)\n ? baseUrl\n : `${baseUrl}/openai`;\n const headers = options.apiKey\n ? {\n ...options.headers,\n 'x-bf-vk': options.apiKey,\n 'x-api-key': options.apiKey,\n }\n : options.headers;\n\n return {\n ...options,\n baseUrl: inferenceBaseUrl,\n headers,\n };\n}\n\nconst BIFROST_PROFILE: OpenAICompatibleProfile = {\n providerLabel: 'Bifrost',\n providerName: 'bifrost',\n defaultModel: 'openai/gpt-4o-mini',\n capabilities: BIFROST_CAPABILITIES,\n describeModel: (modelId) => `Bifrost model: ${modelId}`,\n getContextLength: inferBifrostContextLength,\n getModelCapabilities: inferBifrostCapabilities,\n shouldIncludeModel: (modelId) => !isFilteredBifrostModel(modelId),\n supportsFunctions: inferBifrostFunctions,\n supportsVision: inferBifrostVision,\n};\n\ntype BifrostResolvedCapability =\n | 'chat'\n | 'vision'\n | 'embeddings'\n | 'image_generation';\n\nfunction supportsCapability(\n model: AIModel,\n capability: BifrostResolvedCapability,\n): boolean {\n if (capability === 'vision') {\n return (\n model.capabilities.includes('vision') || model.supportsVision === true\n );\n }\n\n if (capability === 'embeddings') {\n return model.capabilities.includes('embeddings');\n }\n\n if (capability === 'image_generation') {\n return model.capabilities.includes('image_generation');\n }\n\n return model.capabilities.includes('chat');\n}\n\n/**\n * Bifrost provider implementation.\n *\n * Bifrost exposes OpenAI-compatible inference and governance admin APIs. This\n * provider reuses the OpenAI-compatible transport for inference and exposes\n * `admin` for tenant project and virtual-key provisioning.\n */\nexport class BifrostProvider extends OpenAIProvider {\n readonly admin: BifrostAdmin;\n private readonly configuredDefaultModel?: string;\n private readonly resolvedModelCache = new Map<\n BifrostResolvedCapability,\n Promise<string>\n >();\n\n constructor(options: BifrostOptions) {\n const normalized = ensureBifrostOptions(options);\n super(normalized, BIFROST_PROFILE);\n const adminKey = normalized.adminApiKey || normalized.apiKey;\n const adminUsername = normalized.adminUser || normalized.adminUsername;\n this.admin = new BifrostAdmin({\n provider: 'bifrost',\n baseUrl: resolveGatewayAdminBaseUrl(\n normalized.baseUrl,\n normalized.adminUrl || normalized.adminBaseUrl,\n 'bifrost',\n ),\n apiKey: adminKey,\n username: adminUsername,\n password: normalized.adminPassword,\n headers:\n adminKey && !(adminUsername && normalized.adminPassword)\n ? {\n ...normalized.adminHeaders,\n 'x-bf-vk': adminKey,\n 'x-api-key': adminKey,\n }\n : normalized.adminHeaders,\n timeout: normalized.timeout,\n });\n this.configuredDefaultModel = normalized.defaultModel;\n }\n\n private async resolveModel(\n capability: BifrostResolvedCapability,\n explicitModel?: string,\n ): Promise<string> {\n if (explicitModel) {\n return explicitModel;\n }\n\n if (\n this.configuredDefaultModel &&\n (capability === 'chat' || capability === 'vision')\n ) {\n return this.configuredDefaultModel;\n }\n\n const cached = this.resolvedModelCache.get(capability);\n if (cached) {\n return cached;\n }\n\n const pending = this.selectModel(capability).catch((error) => {\n this.resolvedModelCache.delete(capability);\n throw error;\n });\n this.resolvedModelCache.set(capability, pending);\n return pending;\n }\n\n private async selectModel(\n capability: BifrostResolvedCapability,\n ): Promise<string> {\n const models = await super.getModels();\n const model = models.find((candidate) =>\n supportsCapability(candidate, capability),\n );\n\n if (!model) {\n throw new ValidationError(\n `No ${capability} model is available from the Bifrost gateway`,\n {\n provider: 'bifrost',\n capability,\n hint: 'Pass defaultModel explicitly or ensure the gateway returns a compatible model for this key',\n },\n );\n }\n\n return model.id;\n }\n\n async chat(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): Promise<AIResponse> {\n return super.chat(messages, {\n ...options,\n model: await this.resolveModel('chat', options.model),\n });\n }\n\n async *stream(\n messages: AIMessage[],\n options: ChatOptions = {},\n ): AsyncIterable<string> {\n yield* super.stream(messages, {\n ...options,\n model: await this.resolveModel('chat', options.model),\n });\n }\n\n async describeImage(\n image: string | Buffer,\n prompt?: string,\n options: ImageDescriptionOptions = {},\n ): Promise<string> {\n return super.describeImage(image, prompt, {\n ...options,\n model: await this.resolveModel('vision', options.model),\n });\n }\n\n async embed(\n text: string | string[],\n options: EmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n return super.embed(text, {\n ...options,\n model: await this.resolveModel('embeddings', options.model),\n });\n }\n\n async embedImage(\n image: string | Buffer,\n options: ImageEmbeddingOptions = {},\n ): Promise<EmbeddingResponse> {\n return super.embedImage(image, {\n ...options,\n model: await this.resolveModel('embeddings', options.model),\n });\n }\n\n async generateImage(\n prompt: string,\n options: ImageGenerationOptions = {},\n ): Promise<ImageGenerationResponse> {\n return super.generateImage(prompt, {\n ...options,\n model: await this.resolveModel('image_generation', options.model),\n });\n }\n}\n"],"names":[],"mappings":"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"}
|