@amux.ai/adapter-google 0.1.1
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/index.cjs +850 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +163 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.js +847 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/inbound/request-parser.ts","../src/inbound/response-parser.ts","../src/inbound/stream-parser.ts","../src/inbound/error-parser.ts","../src/outbound/request-builder.ts","../src/outbound/response-builder.ts","../src/outbound/stream-builder.ts","../src/adapter.ts"],"names":["mapFinishReason","isOpenAIFormat"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n LLMRequestIR,\n Message,\n Tool,\n ToolChoice,\n ContentPart,\n TextContent,\n ImageContent,\n ToolCall,\n} from '@amux.ai/llm-bridge'\n\nimport type { GeminiRequest, GeminiContent } from '../types'\n\n// OpenAI-compatible types for parsing\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | OpenAIContentPart[] | null\n name?: string\n tool_calls?: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }>\n tool_call_id?: string\n}\n\ninterface OpenAIContentPart {\n type: 'text' | 'image_url'\n text?: string\n image_url?: { url: string; detail?: string }\n}\n\ninterface OpenAIRequest {\n model?: string\n messages: OpenAIMessage[]\n tools?: Array<{\n type: 'function'\n function: {\n name: string\n description?: string\n parameters?: Record<string, unknown>\n }\n }>\n tool_choice?: 'auto' | 'none' | 'required' | { type: 'function'; function: { name: string } }\n temperature?: number\n top_p?: number\n max_tokens?: number\n stop?: string | string[]\n stream?: boolean\n}\n\n/**\n * Check if request is in OpenAI format\n */\nfunction isOpenAIFormat(request: unknown): request is OpenAIRequest {\n const req = request as Record<string, unknown>\n return Array.isArray(req.messages)\n}\n\n/**\n * Parse Gemini request to IR\n * Supports both native Gemini format and OpenAI-compatible format\n */\nexport function parseRequest(request: unknown): LLMRequestIR {\n // Check if request is in OpenAI format\n if (isOpenAIFormat(request)) {\n return parseOpenAIRequest(request)\n }\n\n // Parse native Gemini format\n return parseGeminiRequest(request as GeminiRequest)\n}\n\n/**\n * Parse OpenAI-compatible request to IR\n */\nfunction parseOpenAIRequest(req: OpenAIRequest): LLMRequestIR {\n const messages: Message[] = []\n\n for (const msg of req.messages) {\n messages.push({\n role: msg.role,\n content: parseOpenAIContent(msg.content),\n name: msg.name,\n toolCalls: msg.tool_calls,\n toolCallId: msg.tool_call_id,\n })\n }\n\n // Parse tools\n const tools: Tool[] | undefined = req.tools?.map((tool): Tool => ({\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters as Tool['function']['parameters'],\n },\n }))\n\n // Parse tool choice\n let toolChoice: ToolChoice | undefined\n if (req.tool_choice) {\n if (typeof req.tool_choice === 'string') {\n toolChoice = req.tool_choice as ToolChoice\n } else {\n toolChoice = {\n type: 'function',\n function: { name: req.tool_choice.function.name },\n }\n }\n }\n\n return {\n messages,\n model: req.model,\n tools,\n toolChoice,\n stream: req.stream,\n generation: {\n temperature: req.temperature,\n topP: req.top_p,\n maxTokens: req.max_tokens,\n stopSequences: req.stop\n ? Array.isArray(req.stop)\n ? req.stop\n : [req.stop]\n : undefined,\n },\n raw: req,\n }\n}\n\nfunction parseOpenAIContent(\n content: string | OpenAIContentPart[] | null\n): string | ContentPart[] {\n if (content === null || content === undefined) {\n return ''\n }\n\n if (typeof content === 'string') {\n return content\n }\n\n return content.map((part): ContentPart => {\n if (part.type === 'text') {\n return {\n type: 'text',\n text: part.text ?? '',\n } as TextContent\n }\n\n if (part.type === 'image_url' && part.image_url) {\n const url = part.image_url.url\n\n // Check if it's a base64 data URL\n if (url.startsWith('data:')) {\n const match = url.match(/^data:([^;]+);base64,(.+)$/)\n if (match) {\n return {\n type: 'image',\n source: {\n type: 'base64',\n mediaType: match[1],\n data: match[2],\n },\n } as ImageContent\n }\n }\n\n // Regular URL\n return {\n type: 'image',\n source: {\n type: 'url',\n url: url,\n },\n } as ImageContent\n }\n\n return {\n type: 'text',\n text: JSON.stringify(part),\n } as TextContent\n })\n}\n\n/**\n * Parse native Gemini request to IR\n */\nfunction parseGeminiRequest(req: GeminiRequest): LLMRequestIR {\n // Extract system instruction\n let system: string | undefined\n if (req.systemInstruction?.parts) {\n system = req.systemInstruction.parts.map((p) => p.text).join('\\n')\n }\n\n // Parse contents to messages (flatMap because parseGeminiContent returns Message[])\n const messages: Message[] = req.contents.flatMap((content) => parseGeminiContent(content))\n\n // Parse tools\n const tools: Tool[] | undefined = req.tools?.[0]?.functionDeclarations?.map((fn) => ({\n type: 'function' as const,\n function: {\n name: fn.name,\n description: fn.description,\n parameters: fn.parameters\n ? {\n type: fn.parameters.type,\n properties: fn.parameters.properties,\n required: fn.parameters.required,\n }\n : undefined,\n },\n }))\n\n // Parse tool config to tool choice\n let toolChoice: ToolChoice | undefined\n if (req.toolConfig?.functionCallingConfig) {\n const mode = req.toolConfig.functionCallingConfig.mode\n if (mode === 'AUTO') toolChoice = 'auto'\n else if (mode === 'NONE') toolChoice = 'none'\n else if (mode === 'ANY') toolChoice = 'required'\n }\n\n return {\n messages,\n tools,\n toolChoice,\n system,\n generation: req.generationConfig\n ? {\n temperature: req.generationConfig.temperature,\n topP: req.generationConfig.topP,\n topK: req.generationConfig.topK,\n maxTokens: req.generationConfig.maxOutputTokens,\n stopSequences: req.generationConfig.stopSequences,\n responseFormat: req.generationConfig.responseMimeType === 'application/json'\n ? { type: 'json_object' as const }\n : undefined,\n }\n : undefined,\n raw: req,\n }\n}\n\nfunction parseGeminiContent(content: GeminiContent): Message[] {\n const role = content.role === 'model' ? 'assistant' : 'user'\n const parts: ContentPart[] = []\n const toolCalls: ToolCall[] = []\n const toolResults: Message[] = []\n\n for (const part of content.parts) {\n if ('text' in part) {\n parts.push({\n type: 'text',\n text: part.text,\n } as TextContent)\n } else if ('inlineData' in part) {\n parts.push({\n type: 'image',\n source: {\n type: 'base64',\n mediaType: part.inlineData.mimeType,\n data: part.inlineData.data,\n },\n } as ImageContent)\n } else if ('fileData' in part) {\n parts.push({\n type: 'image',\n source: {\n type: 'url',\n url: part.fileData.fileUri,\n },\n } as ImageContent)\n } else if ('functionCall' in part) {\n // Gemini function call -> OpenAI-style toolCalls\n toolCalls.push({\n id: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n })\n } else if ('functionResponse' in part) {\n // Gemini function response -> tool role message\n toolResults.push({\n role: 'tool',\n content: JSON.stringify(part.functionResponse.response),\n toolCallId: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n name: part.functionResponse.name,\n })\n }\n }\n\n const messages: Message[] = []\n\n // Create main message with content and toolCalls\n if (parts.length > 0 || toolCalls.length > 0) {\n // If all parts are text, simplify to string\n const allText = parts.every((p) => p.type === 'text')\n const messageContent = allText && parts.length === 1\n ? (parts[0] as TextContent).text\n : parts.length > 0\n ? parts\n : ''\n\n const message: Message = {\n role,\n content: messageContent,\n }\n\n if (toolCalls.length > 0) {\n message.toolCalls = toolCalls\n }\n\n messages.push(message)\n }\n\n // Add tool result messages\n messages.push(...toolResults)\n\n return messages\n}\n","import type { LLMResponseIR, Choice, FinishReason, ContentPart, TextContent, ToolCall } from '@amux.ai/llm-bridge'\n\nimport type { GeminiResponse, GeminiPart } from '../types'\n\n/**\n * Map Gemini finish reason to IR finish reason\n */\nfunction mapFinishReason(reason?: string): FinishReason {\n if (!reason) return 'stop'\n\n const reasonMap: Record<string, FinishReason> = {\n STOP: 'stop',\n MAX_TOKENS: 'length',\n SAFETY: 'content_filter',\n RECITATION: 'content_filter',\n OTHER: 'stop',\n }\n return reasonMap[reason] ?? 'stop'\n}\n\n/**\n * Parse Gemini response to IR\n */\nexport function parseResponse(response: unknown): LLMResponseIR {\n const res = response as GeminiResponse\n\n const choices: Choice[] = res.candidates.map((candidate, index) => {\n const { contentParts, toolCalls } = parseParts(candidate.content.parts)\n\n // If all parts are text, simplify to string\n const allText = contentParts.every((p) => p.type === 'text')\n const content = allText && contentParts.length === 1\n ? (contentParts[0] as TextContent).text\n : contentParts\n\n return {\n index: candidate.index ?? index,\n message: {\n role: 'assistant' as const,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n },\n finishReason: mapFinishReason(candidate.finishReason),\n }\n })\n\n return {\n id: res.responseId ?? `gemini-${Date.now()}`,\n model: res.modelVersion ?? 'gemini',\n choices,\n usage: res.usageMetadata\n ? {\n promptTokens: res.usageMetadata.promptTokenCount,\n completionTokens: res.usageMetadata.candidatesTokenCount,\n totalTokens: res.usageMetadata.totalTokenCount,\n details: res.usageMetadata.cachedContentTokenCount\n ? { cachedTokens: res.usageMetadata.cachedContentTokenCount }\n : undefined,\n }\n : undefined,\n raw: response,\n }\n}\n\n/**\n * Parse Gemini parts to IR content parts and tool calls\n */\nfunction parseParts(parts: GeminiPart[]): { contentParts: ContentPart[]; toolCalls: ToolCall[] } {\n const contentParts: ContentPart[] = []\n const toolCalls: ToolCall[] = []\n\n for (const part of parts) {\n if ('text' in part) {\n contentParts.push({\n type: 'text',\n text: part.text,\n } as TextContent)\n } else if ('functionCall' in part) {\n // Convert to OpenAI-style toolCalls\n toolCalls.push({\n id: `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n })\n }\n }\n\n return { contentParts, toolCalls }\n}\n","import type { LLMStreamEvent, FinishReason } from '@amux.ai/llm-bridge'\n\nimport type { GeminiStreamChunk } from '../types'\n\n// OpenAI-compatible stream chunk type\ninterface OpenAIStreamChunk {\n id?: string\n model?: string\n choices?: Array<{\n index: number\n delta: {\n role?: string\n content?: string\n tool_calls?: Array<{\n index: number\n id?: string\n function?: {\n name?: string\n arguments?: string\n }\n }>\n }\n finish_reason?: string | null\n }>\n usage?: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n}\n\n/**\n * Map Gemini finish reason to IR finish reason\n */\nfunction mapFinishReason(reason?: string): FinishReason {\n if (!reason) return 'stop'\n\n const reasonMap: Record<string, FinishReason> = {\n STOP: 'stop',\n MAX_TOKENS: 'length',\n SAFETY: 'content_filter',\n RECITATION: 'content_filter',\n OTHER: 'stop',\n // OpenAI-compatible reasons\n stop: 'stop',\n length: 'length',\n tool_calls: 'tool_calls',\n content_filter: 'content_filter',\n }\n return reasonMap[reason] ?? 'stop'\n}\n\n/**\n * Check if chunk is in OpenAI format\n */\nfunction isOpenAIFormat(chunk: unknown): chunk is OpenAIStreamChunk {\n const c = chunk as Record<string, unknown>\n return Array.isArray(c.choices) && c.choices.length > 0 && 'delta' in (c.choices[0] as Record<string, unknown>)\n}\n\n/**\n * Parse Gemini stream chunk to IR stream event\n * Supports both native Gemini format and OpenAI-compatible format\n */\nexport function parseStream(\n chunk: unknown\n): LLMStreamEvent | LLMStreamEvent[] | null {\n // Check if chunk is in OpenAI format\n if (isOpenAIFormat(chunk)) {\n return parseOpenAIStream(chunk)\n }\n\n // Parse native Gemini format\n return parseGeminiStream(chunk as GeminiStreamChunk)\n}\n\n/**\n * Parse OpenAI-compatible stream chunk\n */\nfunction parseOpenAIStream(data: OpenAIStreamChunk): LLMStreamEvent | null {\n if (!data.choices || data.choices.length === 0) {\n // Check for usage-only chunk\n if (data.usage) {\n return {\n type: 'end',\n id: data.id,\n model: data.model,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n },\n raw: data,\n }\n }\n return null\n }\n\n const choice = data.choices[0]\n if (!choice) return null\n\n const delta = choice.delta\n\n // Start event (first chunk with role or empty delta at index 0)\n if (choice.index === 0 && !delta.content && !delta.tool_calls && !choice.finish_reason) {\n return {\n type: 'start',\n id: data.id,\n model: data.model,\n raw: data,\n }\n }\n\n // Content delta\n if (delta.content) {\n return {\n type: 'content',\n id: data.id,\n model: data.model,\n content: {\n type: 'content',\n delta: delta.content,\n index: choice.index,\n },\n raw: data,\n }\n }\n\n // Tool call delta\n if (delta.tool_calls && delta.tool_calls.length > 0) {\n const toolCall = delta.tool_calls[0]\n if (toolCall) {\n return {\n type: 'tool_call',\n id: data.id,\n model: data.model,\n toolCall: {\n type: 'tool_call',\n id: toolCall.id,\n name: toolCall.function?.name,\n arguments: toolCall.function?.arguments,\n index: toolCall.index,\n },\n raw: data,\n }\n }\n }\n\n // End event\n if (choice.finish_reason) {\n return {\n type: 'end',\n id: data.id,\n model: data.model,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : undefined,\n raw: data,\n }\n }\n\n return null\n}\n\n/**\n * Parse native Gemini stream chunk\n */\nfunction parseGeminiStream(data: GeminiStreamChunk): LLMStreamEvent | LLMStreamEvent[] | null {\n if (!data.candidates || data.candidates.length === 0) {\n // Check for usage-only chunk\n if (data.usageMetadata) {\n return {\n type: 'end',\n model: data.modelVersion,\n usage: {\n promptTokens: data.usageMetadata.promptTokenCount,\n completionTokens: data.usageMetadata.candidatesTokenCount,\n totalTokens: data.usageMetadata.totalTokenCount,\n },\n raw: data,\n }\n }\n return null\n }\n\n const candidate = data.candidates[0]\n if (!candidate) return null\n\n const events: LLMStreamEvent[] = []\n\n // Process parts\n if (candidate.content?.parts) {\n for (const part of candidate.content.parts) {\n if ('text' in part) {\n events.push({\n type: 'content',\n model: data.modelVersion,\n content: {\n type: 'content',\n delta: part.text,\n index: candidate.index ?? 0,\n },\n raw: data,\n })\n } else if ('functionCall' in part) {\n events.push({\n type: 'tool_call',\n model: data.modelVersion,\n toolCall: {\n type: 'tool_call',\n id: `call_${Date.now()}_${part.functionCall.name}`,\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n index: candidate.index ?? 0,\n },\n raw: data,\n })\n }\n }\n }\n\n // End event\n if (candidate.finishReason) {\n events.push({\n type: 'end',\n model: data.modelVersion,\n finishReason: mapFinishReason(candidate.finishReason),\n usage: data.usageMetadata\n ? {\n promptTokens: data.usageMetadata.promptTokenCount,\n completionTokens: data.usageMetadata.candidatesTokenCount,\n totalTokens: data.usageMetadata.totalTokenCount,\n }\n : undefined,\n raw: data,\n })\n }\n\n if (events.length === 0) {\n return null\n }\n\n const firstEvent = events[0]\n return events.length === 1 && firstEvent ? firstEvent : events\n}\n","import type { LLMErrorIR, ErrorType } from '@amux.ai/llm-bridge'\n\nimport type { GeminiError } from '../types'\n\n/**\n * Parse Gemini error to IR\n */\nexport function parseError(error: unknown): LLMErrorIR {\n if (error && typeof error === 'object' && 'error' in error) {\n const err = (error as GeminiError).error\n\n return {\n type: mapErrorType(err.status, err.code),\n message: err.message,\n code: err.status,\n status: err.code,\n raw: error,\n }\n }\n\n return {\n type: 'unknown',\n message: String(error),\n raw: error,\n }\n}\n\nfunction mapErrorType(status?: string, code?: number): ErrorType {\n if (code) {\n const codeMap: Record<number, ErrorType> = {\n 400: 'validation',\n 401: 'authentication',\n 403: 'permission',\n 404: 'not_found',\n 429: 'rate_limit',\n 500: 'server',\n }\n if (codeMap[code]) return codeMap[code]\n }\n\n if (status) {\n const statusMap: Record<string, ErrorType> = {\n INVALID_ARGUMENT: 'validation',\n UNAUTHENTICATED: 'authentication',\n PERMISSION_DENIED: 'permission',\n NOT_FOUND: 'not_found',\n RESOURCE_EXHAUSTED: 'rate_limit',\n INTERNAL: 'server',\n }\n if (statusMap[status]) return statusMap[status]\n }\n\n return 'unknown'\n}\n","import type { LLMRequestIR, ContentPart, ImageContent } from '@amux.ai/llm-bridge'\n\nimport type { GeminiRequest, GeminiContent, GeminiPart } from '../types'\n\n/**\n * Build Gemini request from IR\n */\nexport function buildRequest(ir: LLMRequestIR): GeminiRequest {\n const request: GeminiRequest = {\n contents: [],\n }\n\n // Add system instruction if present\n if (ir.system) {\n request.systemInstruction = {\n parts: [{ text: ir.system }],\n }\n }\n\n // Convert messages to contents\n for (const msg of ir.messages) {\n // Skip system messages (handled above)\n if (msg.role === 'system') continue\n\n // Handle tool messages specially (tool results)\n if (msg.role === 'tool') {\n // Tool results need to be added as function responses\n const resultContent = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)\n request.contents.push({\n role: 'user',\n parts: [{\n functionResponse: {\n name: msg.name ?? 'unknown',\n response: { result: resultContent },\n },\n }],\n })\n continue\n }\n\n const content = buildContent(msg)\n if (content) {\n request.contents.push(content)\n }\n }\n\n // Add tools if present\n if (ir.tools && ir.tools.length > 0) {\n request.tools = [\n {\n functionDeclarations: ir.tools.map((tool) => ({\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters\n ? {\n type: tool.function.parameters.type ?? 'object',\n properties: tool.function.parameters.properties,\n required: tool.function.parameters.required,\n }\n : undefined,\n })),\n },\n ]\n }\n\n // Add tool config if tool choice is specified\n if (ir.toolChoice) {\n let mode: 'AUTO' | 'ANY' | 'NONE' = 'AUTO'\n if (ir.toolChoice === 'none') mode = 'NONE'\n else if (ir.toolChoice === 'required') mode = 'ANY'\n else if (ir.toolChoice === 'auto') mode = 'AUTO'\n else if (typeof ir.toolChoice === 'object') {\n mode = 'ANY'\n request.toolConfig = {\n functionCallingConfig: {\n mode,\n allowedFunctionNames: [ir.toolChoice.function.name],\n },\n }\n }\n\n if (!request.toolConfig) {\n request.toolConfig = {\n functionCallingConfig: { mode },\n }\n }\n }\n\n // Add generation config\n if (ir.generation) {\n request.generationConfig = {}\n\n if (ir.generation.temperature !== undefined) {\n request.generationConfig.temperature = ir.generation.temperature\n }\n if (ir.generation.topP !== undefined) {\n request.generationConfig.topP = ir.generation.topP\n }\n if (ir.generation.topK !== undefined) {\n request.generationConfig.topK = ir.generation.topK\n }\n if (ir.generation.maxTokens !== undefined) {\n request.generationConfig.maxOutputTokens = ir.generation.maxTokens\n }\n if (ir.generation.stopSequences && ir.generation.stopSequences.length > 0) {\n request.generationConfig.stopSequences = ir.generation.stopSequences\n }\n if (ir.generation.responseFormat?.type === 'json_object') {\n request.generationConfig.responseMimeType = 'application/json'\n }\n }\n\n return request\n}\n\nfunction buildContent(msg: { role: string; content: string | ContentPart[]; toolCalls?: unknown[] }): GeminiContent | null {\n const role = msg.role === 'assistant' ? 'model' : 'user'\n const parts: GeminiPart[] = []\n\n if (typeof msg.content === 'string') {\n if (msg.content) {\n parts.push({ text: msg.content })\n }\n } else if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n if (part.type === 'text') {\n parts.push({ text: part.text })\n } else if (part.type === 'image') {\n const imgPart = part as ImageContent\n if (imgPart.source.type === 'base64') {\n parts.push({\n inlineData: {\n mimeType: imgPart.source.mediaType,\n data: imgPart.source.data,\n },\n })\n } else {\n parts.push({\n fileData: {\n mimeType: 'image/*',\n fileUri: imgPart.source.url,\n },\n })\n }\n }\n }\n }\n\n // Add tool calls as function calls (OpenAI-style toolCalls)\n if (msg.toolCalls && Array.isArray(msg.toolCalls)) {\n for (const toolCall of msg.toolCalls as Array<{ function: { name: string; arguments: string } }>) {\n parts.push({\n functionCall: {\n name: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n },\n })\n }\n }\n\n if (parts.length === 0) {\n return null\n }\n\n return { role, parts }\n}\n","import type { LLMResponseIR, ContentPart, TextContent } from '@amux.ai/llm-bridge'\n\nimport type { GeminiResponse, GeminiPart } from '../types'\n\n/**\n * Map IR finish reason to Gemini finish reason\n */\nfunction mapFinishReason(reason?: string): 'STOP' | 'MAX_TOKENS' | 'SAFETY' | 'OTHER' {\n if (!reason) return 'STOP'\n\n const reasonMap: Record<string, 'STOP' | 'MAX_TOKENS' | 'SAFETY' | 'OTHER'> = {\n stop: 'STOP',\n length: 'MAX_TOKENS',\n tool_calls: 'STOP',\n content_filter: 'SAFETY',\n error: 'OTHER',\n }\n return reasonMap[reason] ?? 'STOP'\n}\n\n/**\n * Build Gemini response from IR\n */\nexport function buildResponse(ir: LLMResponseIR): GeminiResponse {\n return {\n candidates: ir.choices.map((choice) => ({\n content: {\n role: 'model' as const,\n parts: buildParts(choice.message.content, choice.message.toolCalls),\n },\n finishReason: mapFinishReason(choice.finishReason),\n index: choice.index,\n })),\n usageMetadata: ir.usage\n ? {\n promptTokenCount: ir.usage.promptTokens,\n candidatesTokenCount: ir.usage.completionTokens,\n totalTokenCount: ir.usage.totalTokens,\n cachedContentTokenCount: ir.usage.details?.cachedTokens,\n }\n : undefined,\n responseId: ir.id,\n modelVersion: ir.model,\n }\n}\n\nfunction buildParts(\n content: string | ContentPart[],\n toolCalls?: Array<{ id: string; type: string; function: { name: string; arguments: string } }>\n): GeminiPart[] {\n const parts: GeminiPart[] = []\n\n if (typeof content === 'string') {\n if (content) {\n parts.push({ text: content })\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part.type === 'text') {\n parts.push({ text: (part as TextContent).text })\n }\n // Note: tool_use is no longer a ContentPart type, toolCalls are handled separately below\n }\n }\n\n // Add tool calls as function calls (OpenAI-style toolCalls)\n if (toolCalls) {\n for (const toolCall of toolCalls) {\n parts.push({\n functionCall: {\n name: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n },\n })\n }\n }\n\n return parts\n}\n","import type { LLMStreamEvent, SSEEvent, StreamEventBuilder } from '@amux.ai/llm-bridge'\n\n/**\n * Google Gemini stream event builder\n * Converts IR stream events to Gemini SSE format\n *\n * Gemini uses a different streaming format than OpenAI:\n * - Each chunk is a complete JSON object (not SSE format)\n * - Contains candidates array with content parts\n */\nexport function createStreamBuilder(): StreamEventBuilder {\n let responseId = `gemini-${Date.now()}`\n let model = ''\n\n return {\n process(event: LLMStreamEvent): SSEEvent[] {\n const events: SSEEvent[] = []\n\n // Update metadata from event\n if (event.id) responseId = event.id\n if (event.model) model = event.model\n\n // Handle start event\n if (event.type === 'start') {\n // Gemini doesn't have a separate start event\n // First content chunk serves as start\n return events\n }\n\n // Handle content delta\n if (event.type === 'content' && event.content?.delta) {\n events.push({\n event: 'data',\n data: {\n candidates: [{\n content: {\n role: 'model',\n parts: [{ text: event.content.delta }],\n },\n index: 0,\n }],\n modelVersion: model,\n responseId,\n },\n })\n }\n\n // Handle tool call (function call in Gemini)\n if (event.type === 'tool_call' && event.toolCall) {\n if (event.toolCall.name) {\n // Parse arguments if they're a string\n let args: Record<string, unknown> = {}\n if (event.toolCall.arguments) {\n try {\n args = JSON.parse(event.toolCall.arguments) as Record<string, unknown>\n } catch {\n args = {}\n }\n }\n\n events.push({\n event: 'data',\n data: {\n candidates: [{\n content: {\n role: 'model',\n parts: [{\n functionCall: {\n name: event.toolCall.name,\n args,\n },\n }],\n },\n index: 0,\n }],\n modelVersion: model,\n responseId,\n },\n })\n }\n }\n\n // Handle end event\n if (event.type === 'end') {\n const finishReason = mapFinishReason(event.finishReason)\n\n const finalChunk: {\n candidates: Array<{\n content: { role: string; parts: Array<{ text: string }> }\n finishReason: string\n index: number\n }>\n usageMetadata?: {\n promptTokenCount: number\n candidatesTokenCount: number\n totalTokenCount: number\n }\n modelVersion: string\n responseId: string\n } = {\n candidates: [{\n content: {\n role: 'model',\n parts: [{ text: '' }],\n },\n finishReason,\n index: 0,\n }],\n modelVersion: model,\n responseId,\n }\n\n // Include usage if available\n if (event.usage) {\n finalChunk.usageMetadata = {\n promptTokenCount: event.usage.promptTokens ?? 0,\n candidatesTokenCount: event.usage.completionTokens ?? 0,\n totalTokenCount: event.usage.totalTokens ?? 0,\n }\n }\n\n events.push({ event: 'data', data: finalChunk })\n }\n\n // Handle error event\n if (event.type === 'error' && event.error) {\n events.push({\n event: 'data',\n data: {\n error: {\n code: 500,\n message: event.error.message,\n status: 'INTERNAL',\n },\n },\n })\n }\n\n return events\n },\n }\n}\n\n/**\n * Map IR finish reason to Gemini finish reason\n */\nfunction mapFinishReason(reason?: string): string {\n if (!reason) return 'STOP'\n\n const reasonMap: Record<string, string> = {\n stop: 'STOP',\n length: 'MAX_TOKENS',\n tool_calls: 'STOP',\n content_filter: 'SAFETY',\n end_turn: 'STOP',\n max_tokens: 'MAX_TOKENS',\n }\n\n return reasonMap[reason] ?? 'STOP'\n}\n","import type {\n LLMAdapter,\n LLMRequestIR,\n LLMResponseIR,\n LLMStreamEvent,\n LLMErrorIR,\n AdapterInfo,\n} from '@amux.ai/llm-bridge'\n\nimport { parseRequest } from './inbound/request-parser'\nimport { parseResponse } from './inbound/response-parser'\nimport { parseStream } from './inbound/stream-parser'\nimport { parseError } from './inbound/error-parser'\nimport { buildRequest } from './outbound/request-builder'\nimport { buildResponse } from './outbound/response-builder'\nimport { createStreamBuilder } from './outbound/stream-builder'\n\n/**\n * Google Gemini adapter implementation\n * Uses native Gemini API format (not OpenAI-compatible)\n */\nexport const googleAdapter: LLMAdapter = {\n name: 'google',\n version: '1.0.0',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n multimodal: true, // Supports images, audio, video, PDFs\n systemPrompt: true, // Via systemInstruction\n toolChoice: true, // Via functionCallingConfig\n reasoning: false,\n webSearch: false,\n jsonMode: true,\n logprobs: false,\n seed: false,\n },\n\n inbound: {\n parseRequest: (request: unknown): LLMRequestIR => {\n return parseRequest(request)\n },\n\n parseResponse: (response: unknown): LLMResponseIR => {\n return parseResponse(response)\n },\n\n parseStream: (chunk: unknown): LLMStreamEvent | LLMStreamEvent[] | null => {\n return parseStream(chunk)\n },\n\n parseError: (error: unknown): LLMErrorIR => {\n return parseError(error)\n },\n },\n\n outbound: {\n buildRequest: (ir: LLMRequestIR): unknown => {\n return buildRequest(ir)\n },\n\n buildResponse: (ir: LLMResponseIR): unknown => {\n return buildResponse(ir)\n },\n\n createStreamBuilder,\n },\n\n getInfo(): AdapterInfo {\n return {\n name: this.name,\n version: this.version,\n capabilities: this.capabilities,\n endpoint: {\n baseUrl: 'https://generativelanguage.googleapis.com',\n chatPath: '/v1beta/models/{model}:streamGenerateContent', // Use streaming endpoint\n modelsPath: '/v1beta/models',\n },\n }\n },\n}\n\n// Export as geminiAdapter for backward compatibility\nexport const geminiAdapter = googleAdapter\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { LLMAdapter } from '@amux.ai/llm-bridge';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Google Gemini adapter implementation
|
|
5
|
+
* Uses native Gemini API format (not OpenAI-compatible)
|
|
6
|
+
*/
|
|
7
|
+
declare const googleAdapter: LLMAdapter;
|
|
8
|
+
declare const geminiAdapter: LLMAdapter;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Gemini content part types
|
|
12
|
+
*/
|
|
13
|
+
type GeminiPart = {
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
inlineData: {
|
|
17
|
+
mimeType: string;
|
|
18
|
+
data: string;
|
|
19
|
+
};
|
|
20
|
+
} | {
|
|
21
|
+
fileData: {
|
|
22
|
+
mimeType: string;
|
|
23
|
+
fileUri: string;
|
|
24
|
+
};
|
|
25
|
+
} | {
|
|
26
|
+
functionCall: {
|
|
27
|
+
name: string;
|
|
28
|
+
args: Record<string, unknown>;
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
functionResponse: {
|
|
32
|
+
name: string;
|
|
33
|
+
response: Record<string, unknown>;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Gemini content (message)
|
|
38
|
+
*/
|
|
39
|
+
interface GeminiContent {
|
|
40
|
+
role: 'user' | 'model';
|
|
41
|
+
parts: GeminiPart[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gemini function declaration
|
|
45
|
+
*/
|
|
46
|
+
interface GeminiFunctionDeclaration {
|
|
47
|
+
name: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
parameters?: {
|
|
50
|
+
type: string;
|
|
51
|
+
properties?: Record<string, unknown>;
|
|
52
|
+
required?: string[];
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gemini tool
|
|
57
|
+
*/
|
|
58
|
+
interface GeminiTool {
|
|
59
|
+
functionDeclarations?: GeminiFunctionDeclaration[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gemini tool config
|
|
63
|
+
*/
|
|
64
|
+
interface GeminiToolConfig {
|
|
65
|
+
functionCallingConfig?: {
|
|
66
|
+
mode: 'AUTO' | 'ANY' | 'NONE';
|
|
67
|
+
allowedFunctionNames?: string[];
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gemini safety setting
|
|
72
|
+
*/
|
|
73
|
+
interface GeminiSafetySetting {
|
|
74
|
+
category: string;
|
|
75
|
+
threshold: 'BLOCK_NONE' | 'BLOCK_ONLY_HIGH' | 'BLOCK_MEDIUM_AND_ABOVE' | 'BLOCK_LOW_AND_ABOVE';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gemini generation config
|
|
79
|
+
*/
|
|
80
|
+
interface GeminiGenerationConfig {
|
|
81
|
+
stopSequences?: string[];
|
|
82
|
+
responseMimeType?: 'text/plain' | 'application/json';
|
|
83
|
+
responseSchema?: Record<string, unknown>;
|
|
84
|
+
candidateCount?: number;
|
|
85
|
+
maxOutputTokens?: number;
|
|
86
|
+
temperature?: number;
|
|
87
|
+
topP?: number;
|
|
88
|
+
topK?: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Gemini request format (native API)
|
|
92
|
+
*/
|
|
93
|
+
interface GeminiRequest {
|
|
94
|
+
contents: GeminiContent[];
|
|
95
|
+
tools?: GeminiTool[];
|
|
96
|
+
toolConfig?: GeminiToolConfig;
|
|
97
|
+
safetySettings?: GeminiSafetySetting[];
|
|
98
|
+
systemInstruction?: {
|
|
99
|
+
parts: Array<{
|
|
100
|
+
text: string;
|
|
101
|
+
}>;
|
|
102
|
+
};
|
|
103
|
+
generationConfig?: GeminiGenerationConfig;
|
|
104
|
+
cachedContent?: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Gemini safety rating
|
|
108
|
+
*/
|
|
109
|
+
interface GeminiSafetyRating {
|
|
110
|
+
category: string;
|
|
111
|
+
probability: 'NEGLIGIBLE' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Gemini candidate
|
|
115
|
+
*/
|
|
116
|
+
interface GeminiCandidate {
|
|
117
|
+
content: GeminiContent;
|
|
118
|
+
finishReason?: 'STOP' | 'MAX_TOKENS' | 'SAFETY' | 'RECITATION' | 'OTHER';
|
|
119
|
+
index?: number;
|
|
120
|
+
safetyRatings?: GeminiSafetyRating[];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Gemini usage metadata
|
|
124
|
+
*/
|
|
125
|
+
interface GeminiUsageMetadata {
|
|
126
|
+
promptTokenCount: number;
|
|
127
|
+
candidatesTokenCount: number;
|
|
128
|
+
totalTokenCount: number;
|
|
129
|
+
cachedContentTokenCount?: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Gemini response format
|
|
133
|
+
*/
|
|
134
|
+
interface GeminiResponse {
|
|
135
|
+
candidates: GeminiCandidate[];
|
|
136
|
+
promptFeedback?: {
|
|
137
|
+
safetyRatings?: GeminiSafetyRating[];
|
|
138
|
+
blockReason?: 'SAFETY' | 'OTHER';
|
|
139
|
+
};
|
|
140
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
141
|
+
modelVersion?: string;
|
|
142
|
+
responseId?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Gemini stream chunk format
|
|
146
|
+
*/
|
|
147
|
+
interface GeminiStreamChunk {
|
|
148
|
+
candidates?: GeminiCandidate[];
|
|
149
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
150
|
+
modelVersion?: string;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Gemini error format
|
|
154
|
+
*/
|
|
155
|
+
interface GeminiError {
|
|
156
|
+
error: {
|
|
157
|
+
code: number;
|
|
158
|
+
message: string;
|
|
159
|
+
status: string;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { type GeminiCandidate, type GeminiContent, type GeminiError, type GeminiFunctionDeclaration, type GeminiGenerationConfig, type GeminiPart, type GeminiRequest, type GeminiResponse, type GeminiSafetyRating, type GeminiSafetySetting, type GeminiStreamChunk, type GeminiTool, type GeminiToolConfig, type GeminiUsageMetadata, geminiAdapter, googleAdapter };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { LLMAdapter } from '@amux.ai/llm-bridge';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Google Gemini adapter implementation
|
|
5
|
+
* Uses native Gemini API format (not OpenAI-compatible)
|
|
6
|
+
*/
|
|
7
|
+
declare const googleAdapter: LLMAdapter;
|
|
8
|
+
declare const geminiAdapter: LLMAdapter;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Gemini content part types
|
|
12
|
+
*/
|
|
13
|
+
type GeminiPart = {
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
inlineData: {
|
|
17
|
+
mimeType: string;
|
|
18
|
+
data: string;
|
|
19
|
+
};
|
|
20
|
+
} | {
|
|
21
|
+
fileData: {
|
|
22
|
+
mimeType: string;
|
|
23
|
+
fileUri: string;
|
|
24
|
+
};
|
|
25
|
+
} | {
|
|
26
|
+
functionCall: {
|
|
27
|
+
name: string;
|
|
28
|
+
args: Record<string, unknown>;
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
functionResponse: {
|
|
32
|
+
name: string;
|
|
33
|
+
response: Record<string, unknown>;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Gemini content (message)
|
|
38
|
+
*/
|
|
39
|
+
interface GeminiContent {
|
|
40
|
+
role: 'user' | 'model';
|
|
41
|
+
parts: GeminiPart[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gemini function declaration
|
|
45
|
+
*/
|
|
46
|
+
interface GeminiFunctionDeclaration {
|
|
47
|
+
name: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
parameters?: {
|
|
50
|
+
type: string;
|
|
51
|
+
properties?: Record<string, unknown>;
|
|
52
|
+
required?: string[];
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gemini tool
|
|
57
|
+
*/
|
|
58
|
+
interface GeminiTool {
|
|
59
|
+
functionDeclarations?: GeminiFunctionDeclaration[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gemini tool config
|
|
63
|
+
*/
|
|
64
|
+
interface GeminiToolConfig {
|
|
65
|
+
functionCallingConfig?: {
|
|
66
|
+
mode: 'AUTO' | 'ANY' | 'NONE';
|
|
67
|
+
allowedFunctionNames?: string[];
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gemini safety setting
|
|
72
|
+
*/
|
|
73
|
+
interface GeminiSafetySetting {
|
|
74
|
+
category: string;
|
|
75
|
+
threshold: 'BLOCK_NONE' | 'BLOCK_ONLY_HIGH' | 'BLOCK_MEDIUM_AND_ABOVE' | 'BLOCK_LOW_AND_ABOVE';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gemini generation config
|
|
79
|
+
*/
|
|
80
|
+
interface GeminiGenerationConfig {
|
|
81
|
+
stopSequences?: string[];
|
|
82
|
+
responseMimeType?: 'text/plain' | 'application/json';
|
|
83
|
+
responseSchema?: Record<string, unknown>;
|
|
84
|
+
candidateCount?: number;
|
|
85
|
+
maxOutputTokens?: number;
|
|
86
|
+
temperature?: number;
|
|
87
|
+
topP?: number;
|
|
88
|
+
topK?: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Gemini request format (native API)
|
|
92
|
+
*/
|
|
93
|
+
interface GeminiRequest {
|
|
94
|
+
contents: GeminiContent[];
|
|
95
|
+
tools?: GeminiTool[];
|
|
96
|
+
toolConfig?: GeminiToolConfig;
|
|
97
|
+
safetySettings?: GeminiSafetySetting[];
|
|
98
|
+
systemInstruction?: {
|
|
99
|
+
parts: Array<{
|
|
100
|
+
text: string;
|
|
101
|
+
}>;
|
|
102
|
+
};
|
|
103
|
+
generationConfig?: GeminiGenerationConfig;
|
|
104
|
+
cachedContent?: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Gemini safety rating
|
|
108
|
+
*/
|
|
109
|
+
interface GeminiSafetyRating {
|
|
110
|
+
category: string;
|
|
111
|
+
probability: 'NEGLIGIBLE' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Gemini candidate
|
|
115
|
+
*/
|
|
116
|
+
interface GeminiCandidate {
|
|
117
|
+
content: GeminiContent;
|
|
118
|
+
finishReason?: 'STOP' | 'MAX_TOKENS' | 'SAFETY' | 'RECITATION' | 'OTHER';
|
|
119
|
+
index?: number;
|
|
120
|
+
safetyRatings?: GeminiSafetyRating[];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Gemini usage metadata
|
|
124
|
+
*/
|
|
125
|
+
interface GeminiUsageMetadata {
|
|
126
|
+
promptTokenCount: number;
|
|
127
|
+
candidatesTokenCount: number;
|
|
128
|
+
totalTokenCount: number;
|
|
129
|
+
cachedContentTokenCount?: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Gemini response format
|
|
133
|
+
*/
|
|
134
|
+
interface GeminiResponse {
|
|
135
|
+
candidates: GeminiCandidate[];
|
|
136
|
+
promptFeedback?: {
|
|
137
|
+
safetyRatings?: GeminiSafetyRating[];
|
|
138
|
+
blockReason?: 'SAFETY' | 'OTHER';
|
|
139
|
+
};
|
|
140
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
141
|
+
modelVersion?: string;
|
|
142
|
+
responseId?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Gemini stream chunk format
|
|
146
|
+
*/
|
|
147
|
+
interface GeminiStreamChunk {
|
|
148
|
+
candidates?: GeminiCandidate[];
|
|
149
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
150
|
+
modelVersion?: string;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Gemini error format
|
|
154
|
+
*/
|
|
155
|
+
interface GeminiError {
|
|
156
|
+
error: {
|
|
157
|
+
code: number;
|
|
158
|
+
message: string;
|
|
159
|
+
status: string;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { type GeminiCandidate, type GeminiContent, type GeminiError, type GeminiFunctionDeclaration, type GeminiGenerationConfig, type GeminiPart, type GeminiRequest, type GeminiResponse, type GeminiSafetyRating, type GeminiSafetySetting, type GeminiStreamChunk, type GeminiTool, type GeminiToolConfig, type GeminiUsageMetadata, geminiAdapter, googleAdapter };
|