genkitx-azure-openai
Version:
Genkit AI framework plugin for Azure OpenAI APIs.
1 lines • 6.61 kB
Source Map (JSON)
{"version":3,"sources":["../src/tts.ts"],"sourcesContent":["/**\n * Copyright 2026 Xavier Portilla Edo\n * Copyright 2026 Google LLC\n * Copyright 2026 Bloom Inc.\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 */\nimport type { GenerateRequest, GenerateResponseData, Genkit } from \"genkit\";\nimport { GenerationCommonConfigSchema, Message, z } from \"genkit\";\nimport type { ModelAction } from \"genkit/model\";\nimport { modelRef } from \"genkit/model\";\nimport type AzureOpenAI from \"openai\";\nimport { type SpeechCreateParams } from \"openai/resources/audio/index\";\n\nexport const TTSConfigSchema = GenerationCommonConfigSchema.extend({\n voice: z\n .enum([\"alloy\", \"echo\", \"fable\", \"onyx\", \"nova\", \"shimmer\"])\n .optional()\n .default(\"alloy\"),\n speed: z.number().min(0.25).max(4.0).optional(),\n response_format: z\n .enum([\"mp3\", \"opus\", \"aac\", \"flac\", \"wav\", \"pcm\"])\n .optional(),\n});\n\nexport const tts1 = modelRef({\n name: \"azure-openai/tts-1\",\n info: {\n label: \"OpenAI - Text-to-speech 1\",\n supports: {\n media: false,\n output: [\"media\"],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n },\n configSchema: TTSConfigSchema,\n});\n\nexport const tts1Hd = modelRef({\n name: \"azure-openai/tts-1-hd\",\n info: {\n label: \"OpenAI - Text-to-speech 1 HD\",\n supports: {\n media: false,\n output: [\"media\"],\n multiturn: false,\n systemRole: false,\n tools: false,\n },\n },\n configSchema: TTSConfigSchema,\n});\n\nexport const SUPPORTED_TTS_MODELS = {\n \"tts-1\": tts1,\n \"tts-1-hd\": tts1Hd,\n};\n\nexport const RESPONSE_FORMAT_MEDIA_TYPES = {\n mp3: \"audio/mpeg\",\n opus: \"audio/opus\",\n aac: \"audio/aac\",\n flac: \"audio/flac\",\n wav: \"audio/wav\",\n pcm: \"audio/L16\",\n};\n\nfunction toTTSRequest(\n modelName: string,\n request: GenerateRequest<typeof TTSConfigSchema>,\n): SpeechCreateParams {\n const mappedModelName = request.config?.version || modelName;\n const options: SpeechCreateParams = {\n model: mappedModelName,\n input: new Message(request.messages[0]).text,\n voice: request.config?.voice ?? \"alloy\",\n speed: request.config?.speed,\n response_format: request.config?.response_format,\n };\n for (const k in options) {\n if (options[k as keyof typeof options] === undefined) {\n delete options[k as keyof typeof options];\n }\n }\n return options;\n}\n\nfunction toGenerateResponse(\n result: Buffer,\n responseFormat: z.infer<typeof TTSConfigSchema>[\"response_format\"] = \"mp3\",\n): GenerateResponseData {\n const mediaType = RESPONSE_FORMAT_MEDIA_TYPES[responseFormat];\n return {\n candidates: [\n {\n index: 0,\n finishReason: \"stop\",\n message: {\n role: \"model\",\n content: [\n {\n media: {\n contentType: mediaType,\n url: `data:${mediaType};base64,${result.toString(\"base64\")}`,\n },\n },\n ],\n },\n },\n ],\n };\n}\n\nexport function ttsModel(\n ai: Genkit,\n name: string,\n client: AzureOpenAI,\n): ModelAction<typeof TTSConfigSchema> {\n const modelId = `azure-openai/${name}`;\n const model = SUPPORTED_TTS_MODELS[name as keyof typeof SUPPORTED_TTS_MODELS];\n if (!model) throw new Error(`Unsupported model: ${name}`);\n\n return ai.defineModel<typeof TTSConfigSchema>(\n {\n name: modelId,\n ...model.info,\n configSchema: model.configSchema,\n },\n async (request) => {\n const ttsRequest = toTTSRequest(name, request);\n const result = await client.audio.speech.create(ttsRequest);\n const resultArrayBuffer = await result.arrayBuffer();\n const resultBuffer = Buffer.from(new Uint8Array(resultArrayBuffer));\n return toGenerateResponse(resultBuffer, ttsRequest.response_format);\n },\n );\n}\n"],"mappings":"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","names":[]}