UNPKG

genkitx-azure-openai

Version:

Firebase Genkit AI framework plugin for Azure OpenAI APIs.

1 lines 22.5 kB
{"version":3,"sources":["../src/gpt.ts"],"sourcesContent":["/**\n * Copyright 2024 The Fire Company\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GenerationCommonConfigSchema, Message, z } from 'genkit';\nimport type {\n GenerateRequest,\n Genkit,\n MessageData,\n Part,\n Role,\n ToolRequestPart,\n} from 'genkit';\nimport { CandidateData, modelRef, ToolDefinition } from 'genkit/model';\nimport { AzureOpenAI } from 'openai';\nimport {\n type ChatCompletion,\n type ChatCompletionChunk,\n type ChatCompletionContentPart,\n type ChatCompletionCreateParamsNonStreaming,\n type ChatCompletionMessageParam,\n type ChatCompletionMessageToolCall,\n type ChatCompletionRole,\n type ChatCompletionTool,\n type CompletionChoice,\n} from 'openai/resources/index.mjs';\n\ntype VisualDetailLevel = 'low' | 'auto' | 'high';\n\nconst MODELS_SUPPORTING_OPENAI_RESPONSE_FORMAT = [\n 'gpt-4',\n 'gpt-4-32k',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-o1',\n 'gpt-o1-mini',\n 'gpt-o1-preview',\n 'gpt-3.5-turbo',\n 'gpt-3.5-turbo-instruct',\n 'gpt-3.5-turbo-26k',\n];\n\nexport const OpenAiConfigSchema = GenerationCommonConfigSchema.extend({\n frequencyPenalty: z.number().min(-2).max(2).optional(),\n logitBias: z.record(z.string(), z.number().min(-100).max(100)).optional(),\n logProbs: z.boolean().optional(),\n presencePenalty: z.number().min(-2).max(2).optional(),\n seed: z.number().int().optional(),\n topLogProbs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n visualDetailLevel: z.enum(['auto', 'low', 'high']).optional(),\n});\n\nexport const gpt4o = modelRef({\n name: 'azure-openai/gpt-4o',\n info: {\n versions: ['gpt-4o', 'gpt-4o-mini'],\n label: 'OpenAI - GPT-4o',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gpt4 = modelRef({\n name: 'azure-openai/gpt-4',\n info: {\n versions: ['gpt-4', 'gpt-4-32k'],\n label: 'OpenAI - GPT-4',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gpt45 = modelRef({\n name: 'azure-openai/gpt-4.5',\n info: {\n versions: ['gpt-4.5-preview'],\n label: 'OpenAI - GPT-4.5',\n supports: {\n multiturn: true,\n tools: true,\n media: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gptO1 = modelRef({\n name: 'azure-openai/gpt-o1',\n info: {\n versions: ['gpt-o1'],\n label: 'OpenAI - GPT-o1',\n supports: {\n multiturn: true,\n tools: false,\n media: true,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gptO1Mini = modelRef({\n name: 'azure-openai/gpt-o1-mini',\n info: {\n versions: ['o1-mini'],\n label: 'OpenAI - GPT-o1 Mini',\n supports: {\n multiturn: true,\n tools: true,\n media: false,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gptO1Preview = modelRef({\n name: 'azure-openai/gpt-o1-preview',\n info: {\n versions: ['o1-preview'],\n label: 'OpenAI - GPT-o1 Preview',\n supports: {\n multiturn: true,\n tools: true,\n media: false,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gptO3Mini = modelRef({\n name: 'azure-openai/gpt-o3-mini',\n info: {\n versions: ['o3-mini'],\n label: 'OpenAI - GPT-o3 Mini',\n supports: {\n multiturn: true,\n tools: true,\n media: false,\n systemRole: true,\n output: ['text'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const gpt35Turbo = modelRef({\n name: 'azure-openai/gpt-3.5-turbo',\n info: {\n versions: ['gpt-3.5-turbo', 'gpt-35-turbo-instruct', 'gpt-35-turbo-16k'],\n label: 'OpenAI - GPT-3.5 Turbo',\n supports: {\n multiturn: true,\n tools: true,\n media: false,\n systemRole: true,\n output: ['json', 'text'],\n },\n },\n configSchema: OpenAiConfigSchema,\n});\n\nexport const SUPPORTED_GPT_MODELS = {\n 'gpt-o1-mini': gptO1Mini,\n 'gpt-o1-preview': gptO1Preview,\n 'gpt-o1': gptO1,\n 'gpt-o3-mini': gptO3Mini,\n 'gpt-4': gpt4,\n 'gpt-4o': gpt4o,\n 'gpt-4.5': gpt45,\n 'gpt-3.5-turbo': gpt35Turbo,\n};\n\nfunction toOpenAIRole(role: Role): ChatCompletionRole {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'tool';\n default:\n throw new Error(`role ${role} doesn't map to an OpenAI role.`);\n }\n}\n\nfunction toOpenAiTool(tool: ToolDefinition): ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n parameters: tool.inputSchema !== null ? tool.inputSchema : undefined,\n },\n };\n}\n\nexport function toOpenAiTextAndMedia(\n part: Part,\n visualDetailLevel: VisualDetailLevel\n): ChatCompletionContentPart {\n if (part.text) {\n return {\n type: 'text',\n text: part.text,\n };\n } else if (part.media) {\n return {\n type: 'image_url',\n image_url: {\n url: part.media.url,\n detail: visualDetailLevel,\n },\n };\n }\n throw Error(\n `Unsupported genkit part fields encountered for current message role: ${part}.`\n );\n}\n\nexport function toOpenAiMessages(\n messages: MessageData[],\n visualDetailLevel: VisualDetailLevel = 'auto'\n): ChatCompletionMessageParam[] {\n const openAiMsgs: ChatCompletionMessageParam[] = [];\n for (const message of messages) {\n const msg = new Message(message);\n const role = toOpenAIRole(message.role);\n switch (role) {\n case 'user':\n openAiMsgs.push({\n role: role,\n content: msg.content.map((part) =>\n toOpenAiTextAndMedia(part, visualDetailLevel)\n ),\n });\n break;\n case 'system':\n openAiMsgs.push({\n role: role,\n content: msg.text,\n });\n break;\n case 'assistant':\n const toolCalls: ChatCompletionMessageToolCall[] = msg.content\n .filter((part) => part.toolRequest)\n .map((part) => {\n if (!part.toolRequest) {\n throw Error(\n 'Mapping genkit message to openai tool call content part but message.toolRequest not provided.'\n );\n }\n return {\n id: part.toolRequest.ref || '',\n type: 'function',\n function: {\n name: part.toolRequest.name,\n arguments: JSON.stringify(part.toolRequest.input),\n },\n };\n });\n if (toolCalls?.length > 0) {\n openAiMsgs.push({\n role: role,\n tool_calls: toolCalls,\n });\n } else {\n openAiMsgs.push({\n role: role,\n content: msg.text,\n });\n }\n break;\n case 'tool':\n const toolResponseParts = msg.toolResponseParts();\n toolResponseParts.map((part) => {\n openAiMsgs.push({\n role: role,\n tool_call_id: part.toolResponse.ref || '',\n content:\n typeof part.toolResponse.output === 'string'\n ? part.toolResponse.output\n : JSON.stringify(part.toolResponse.output),\n });\n });\n break;\n default:\n throw new Error('unrecognized role');\n }\n }\n return openAiMsgs;\n}\n\nconst finishReasonMap: Record<\n // OpenAI Node SDK doesn't support tool_call in the enum, but it is returned from the API\n CompletionChoice['finish_reason'] | 'tool_calls',\n CandidateData['finishReason']\n> = {\n length: 'length',\n stop: 'stop',\n tool_calls: 'stop',\n content_filter: 'blocked',\n};\n\nfunction fromOpenAiToolCall(\n toolCall:\n | ChatCompletionMessageToolCall\n | ChatCompletionChunk.Choice.Delta.ToolCall\n) {\n if (!toolCall.function) {\n throw Error(\n `Unexpected openAI chunk choice. tool_calls was provided but one or more tool_calls is missing.`\n );\n }\n const f = toolCall.function;\n return {\n toolRequest: {\n name: f.name,\n ref: toolCall.id,\n input: f.arguments ? JSON.parse(f.arguments) : f.arguments,\n },\n };\n}\n\nfunction fromOpenAiChoice(\n choice: ChatCompletion['choices'][0],\n jsonMode = false\n): CandidateData {\n const toolRequestParts = choice.message.tool_calls?.map(fromOpenAiToolCall);\n return {\n index: choice.index,\n finishReason: finishReasonMap[choice.finish_reason] || 'other',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.message.content!) }\n : { text: choice.message.content! },\n ],\n },\n custom: {},\n };\n}\n\nfunction fromOpenAiChunkChoice(\n choice: ChatCompletionChunk['choices'][0],\n jsonMode = false\n): CandidateData {\n const toolRequestParts = choice.delta.tool_calls?.map(fromOpenAiToolCall);\n return {\n index: choice.index,\n finishReason: choice.finish_reason\n ? finishReasonMap[choice.finish_reason] || 'other'\n : 'unknown',\n message: {\n role: 'model',\n content: toolRequestParts\n ? // Note: Not sure why I have to cast here exactly.\n // Otherwise it thinks toolRequest must be 'undefined' if provided\n (toolRequestParts as ToolRequestPart[])\n : [\n jsonMode\n ? { data: JSON.parse(choice.delta.content!) }\n : { text: choice.delta.content! },\n ],\n },\n custom: {},\n };\n}\n\nexport function toOpenAiRequestBody(\n modelName: string,\n request: GenerateRequest\n) {\n const mapToSnakeCase = <T extends Record<string, any>>(\n obj: T\n ): Record<string, any> => {\n return Object.entries(obj).reduce((acc, [key, value]) => {\n const snakeCaseKey = key.replace(\n /[A-Z]/g,\n (letter) => `_${letter.toLowerCase()}`\n );\n acc[snakeCaseKey] = value;\n return acc;\n }, {});\n };\n const model = SUPPORTED_GPT_MODELS[modelName];\n if (!model) throw new Error(`Unsupported model: ${modelName}`);\n const openAiMessages = toOpenAiMessages(\n request.messages,\n request.config?.visualDetailLevel\n );\n const mappedModelName = request.config?.version || modelName;\n const body = {\n messages: openAiMessages,\n tools: request.tools?.map(toOpenAiTool),\n model: mappedModelName,\n max_tokens: request.config?.maxOutputTokens,\n temperature: request.config?.temperature,\n top_p: request.config?.topP,\n n: request.candidates,\n stop: request.config?.stopSequences,\n ...mapToSnakeCase(request.config?.custom || {}),\n } as ChatCompletionCreateParamsNonStreaming;\n\n const response_format = request.output?.format;\n if (\n response_format &&\n MODELS_SUPPORTING_OPENAI_RESPONSE_FORMAT.includes(mappedModelName)\n ) {\n if (\n response_format === 'json' &&\n model.info.supports?.output?.includes('json')\n ) {\n body.response_format = {\n type: 'json_object',\n };\n } else if (\n response_format === 'text' &&\n model.info.supports?.output?.includes('text')\n ) {\n body.response_format = {\n type: 'text',\n };\n } else {\n throw new Error(\n `${response_format} format is not supported for GPT models currently`\n );\n }\n }\n for (const key in body) {\n if (!body[key] || (Array.isArray(body[key]) && !body[key].length))\n delete body[key];\n }\n return body;\n}\n\n/**\n *\n */\nexport function gptModel(ai: Genkit, name: string, client: AzureOpenAI) {\n const modelId = `azure-openai/${name}`;\n const model = SUPPORTED_GPT_MODELS[name];\n if (!model) throw new Error(`Unsupported model: ${name}`);\n\n return ai.defineModel(\n {\n name: modelId,\n ...model.info,\n configSchema: SUPPORTED_GPT_MODELS[name].configSchema,\n },\n async (request, streamingCallback) => {\n let response: ChatCompletion;\n const body = toOpenAiRequestBody(name, request);\n if (streamingCallback) {\n const stream = client.beta.chat.completions.stream({\n ...body,\n stream: true,\n });\n for await (const chunk of stream) {\n chunk.choices?.forEach((chunk) => {\n const c = fromOpenAiChunkChoice(chunk);\n streamingCallback({\n index: c.index,\n content: c.message.content,\n });\n });\n }\n response = await stream.finalChatCompletion();\n } else {\n response = await client.chat.completions.create(body);\n }\n return {\n candidates: response.choices.map((c) =>\n fromOpenAiChoice(c, request.output?.format === 'json')\n ),\n usage: {\n inputTokens: response.usage?.prompt_tokens,\n outputTokens: response.usage?.completion_tokens,\n totalTokens: response.usage?.total_tokens,\n },\n custom: response,\n };\n }\n );\n}\n"],"mappings":"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","names":["chunk","_a"]}