@workglow/google-gemini 0.2.28

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.
Files changed (59) hide show
  1. package/dist/ai-provider/GoogleGeminiProvider.d.ts +27 -0
  2. package/dist/ai-provider/GoogleGeminiProvider.d.ts.map +1 -0
  3. package/dist/ai-provider/GoogleGeminiQueuedProvider.d.ts +18 -0
  4. package/dist/ai-provider/GoogleGeminiQueuedProvider.d.ts.map +1 -0
  5. package/dist/ai-provider/common/Gemini_Chat.d.ts +10 -0
  6. package/dist/ai-provider/common/Gemini_Chat.d.ts.map +1 -0
  7. package/dist/ai-provider/common/Gemini_Client.d.ts +10 -0
  8. package/dist/ai-provider/common/Gemini_Client.d.ts.map +1 -0
  9. package/dist/ai-provider/common/Gemini_Constants.d.ts +7 -0
  10. package/dist/ai-provider/common/Gemini_Constants.d.ts.map +1 -0
  11. package/dist/ai-provider/common/Gemini_CountTokens.d.ts +10 -0
  12. package/dist/ai-provider/common/Gemini_CountTokens.d.ts.map +1 -0
  13. package/dist/ai-provider/common/Gemini_ImageEdit.d.ts +15 -0
  14. package/dist/ai-provider/common/Gemini_ImageEdit.d.ts.map +1 -0
  15. package/dist/ai-provider/common/Gemini_ImageGenerate.d.ts +16 -0
  16. package/dist/ai-provider/common/Gemini_ImageGenerate.d.ts.map +1 -0
  17. package/dist/ai-provider/common/Gemini_ImageValidation.d.ts +14 -0
  18. package/dist/ai-provider/common/Gemini_ImageValidation.d.ts.map +1 -0
  19. package/dist/ai-provider/common/Gemini_JobRunFns.d.ts +13 -0
  20. package/dist/ai-provider/common/Gemini_JobRunFns.d.ts.map +1 -0
  21. package/dist/ai-provider/common/Gemini_ModelInfo.d.ts +9 -0
  22. package/dist/ai-provider/common/Gemini_ModelInfo.d.ts.map +1 -0
  23. package/dist/ai-provider/common/Gemini_ModelSchema.d.ts +170 -0
  24. package/dist/ai-provider/common/Gemini_ModelSchema.d.ts.map +1 -0
  25. package/dist/ai-provider/common/Gemini_ModelSearch.d.ts +8 -0
  26. package/dist/ai-provider/common/Gemini_ModelSearch.d.ts.map +1 -0
  27. package/dist/ai-provider/common/Gemini_Schema.d.ts +11 -0
  28. package/dist/ai-provider/common/Gemini_Schema.d.ts.map +1 -0
  29. package/dist/ai-provider/common/Gemini_StructuredGeneration.d.ts +10 -0
  30. package/dist/ai-provider/common/Gemini_StructuredGeneration.d.ts.map +1 -0
  31. package/dist/ai-provider/common/Gemini_TextEmbedding.d.ts +9 -0
  32. package/dist/ai-provider/common/Gemini_TextEmbedding.d.ts.map +1 -0
  33. package/dist/ai-provider/common/Gemini_TextGeneration.d.ts +10 -0
  34. package/dist/ai-provider/common/Gemini_TextGeneration.d.ts.map +1 -0
  35. package/dist/ai-provider/common/Gemini_TextRewriter.d.ts +10 -0
  36. package/dist/ai-provider/common/Gemini_TextRewriter.d.ts.map +1 -0
  37. package/dist/ai-provider/common/Gemini_TextSummary.d.ts +10 -0
  38. package/dist/ai-provider/common/Gemini_TextSummary.d.ts.map +1 -0
  39. package/dist/ai-provider/common/Gemini_ToolCalling.d.ts +11 -0
  40. package/dist/ai-provider/common/Gemini_ToolCalling.d.ts.map +1 -0
  41. package/dist/ai-provider/index.d.ts +11 -0
  42. package/dist/ai-provider/index.d.ts.map +1 -0
  43. package/dist/ai-provider/registerGemini.d.ts +10 -0
  44. package/dist/ai-provider/registerGemini.d.ts.map +1 -0
  45. package/dist/ai-provider/registerGeminiInline.d.ts +8 -0
  46. package/dist/ai-provider/registerGeminiInline.d.ts.map +1 -0
  47. package/dist/ai-provider/registerGeminiWorker.d.ts +7 -0
  48. package/dist/ai-provider/registerGeminiWorker.d.ts.map +1 -0
  49. package/dist/ai-provider/runtime.d.ts +16 -0
  50. package/dist/ai-provider/runtime.d.ts.map +1 -0
  51. package/dist/ai-provider-runtime.d.ts +7 -0
  52. package/dist/ai-provider-runtime.d.ts.map +1 -0
  53. package/dist/ai-provider-runtime.js +871 -0
  54. package/dist/ai-provider-runtime.js.map +30 -0
  55. package/dist/ai-provider.d.ts +7 -0
  56. package/dist/ai-provider.d.ts.map +1 -0
  57. package/dist/ai-provider.js +233 -0
  58. package/dist/ai-provider.js.map +15 -0
  59. package/package.json +60 -0
@@ -0,0 +1,30 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ai-provider/common/Gemini_Client.ts", "../src/ai-provider/registerGeminiInline.ts", "../src/ai-provider/common/Gemini_ModelSearch.ts", "../src/ai-provider/common/Gemini_Constants.ts", "../src/ai-provider/common/Gemini_Schema.ts", "../src/ai-provider/common/Gemini_ToolCalling.ts", "../src/ai-provider/common/Gemini_Chat.ts", "../src/ai-provider/common/Gemini_CountTokens.ts", "../src/ai-provider/common/Gemini_ImageEdit.ts", "../src/ai-provider/common/Gemini_ImageGenerate.ts", "../src/ai-provider/common/Gemini_ModelInfo.ts", "../src/ai-provider/common/Gemini_StructuredGeneration.ts", "../src/ai-provider/common/Gemini_TextEmbedding.ts", "../src/ai-provider/common/Gemini_TextGeneration.ts", "../src/ai-provider/common/Gemini_TextRewriter.ts", "../src/ai-provider/common/Gemini_TextSummary.ts", "../src/ai-provider/common/Gemini_JobRunFns.ts", "../src/ai-provider/GoogleGeminiQueuedProvider.ts", "../src/ai-provider/common/Gemini_ImageValidation.ts", "../src/ai-provider/registerGeminiWorker.ts", "../src/ai-provider/GoogleGeminiProvider.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\n\nlet _sdk: typeof import(\"@google/generative-ai\") | undefined;\n\nexport async function loadGeminiSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"@google/generative-ai\");\n } catch {\n throw new Error(\n \"@google/generative-ai is required for Gemini tasks. Install it with: bun add @google/generative-ai\"\n );\n }\n }\n return _sdk.GoogleGenerativeAI;\n}\n\ninterface ResolvedProviderConfig {\n readonly credential_key?: string;\n readonly api_key?: string;\n readonly model_name?: string;\n readonly embedding_task_type?: string | null;\n}\n\nexport function getApiKey(model: GeminiModelConfig | undefined): string {\n const config = model?.provider_config as ResolvedProviderConfig | undefined;\n const apiKey =\n config?.credential_key ||\n config?.api_key ||\n (typeof process !== \"undefined\"\n ? process.env?.GOOGLE_API_KEY || process.env?.GEMINI_API_KEY\n : undefined);\n if (!apiKey) {\n throw new Error(\n \"Missing Google API key: set provider_config.credential_key or the GOOGLE_API_KEY / GEMINI_API_KEY environment variable.\"\n );\n }\n return apiKey;\n}\n\nexport function getModelName(model: GeminiModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n",
6
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderInline } from \"@workglow/ai-provider/common\";\nimport { GEMINI_PREVIEW_TASKS, GEMINI_STREAM_TASKS, GEMINI_TASKS } from \"./common/Gemini_JobRunFns\";\nimport { GoogleGeminiQueuedProvider } from \"./GoogleGeminiQueuedProvider\";\nimport { registerGeminiImageValidator } from \"./common/Gemini_ImageValidation\";\n\nexport async function registerGeminiInline(options?: AiProviderRegisterOptions): Promise<void> {\n registerGeminiImageValidator();\n await registerProviderInline(\n new GoogleGeminiQueuedProvider(GEMINI_TASKS, GEMINI_STREAM_TASKS, GEMINI_PREVIEW_TASKS),\n \"Google Gemini\",\n options\n );\n}\n",
7
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelSearchResultItem,\n ModelSearchTaskInput,\n ModelSearchTaskOutput,\n} from \"@workglow/ai\";\nimport { normalizedModelSearchQuery } from \"@workglow/ai-provider/common\";\nimport { GOOGLE_GEMINI } from \"./Gemini_Constants\";\n\ninterface GeminiModelEntry {\n readonly label: string;\n readonly value: string;\n readonly tasks?: readonly string[];\n}\n\nconst GEMINI_MODELS: readonly GeminiModelEntry[] = [\n { label: \"gemini-3.1-pro-preview\", value: \"gemini-3.1-pro-preview\" },\n { label: \"gemini-3-flash-preview\", value: \"gemini-3-flash-preview\" },\n { label: \"gemini-3.1-flash-lite-preview\", value: \"gemini-3.1-flash-lite-preview\" },\n { label: \"gemini-2.5-flash\", value: \"gemini-2.5-flash\" },\n { label: \"gemini-2.5-pro\", value: \"gemini-2.5-pro\" },\n // Embedding models\n {\n label: \"gemini-embedding-2\",\n value: \"gemini-embedding-2\",\n tasks: [\"TextEmbeddingTask\"],\n },\n {\n label: \"gemini-embedding-001\",\n value: \"gemini-embedding-001\",\n tasks: [\"TextEmbeddingTask\"],\n },\n // Image-output models\n {\n label: \"gemini-3.1-flash-image-preview\",\n value: \"gemini-3.1-flash-image-preview\",\n tasks: [\"ImageGenerateTask\", \"ImageEditTask\"],\n },\n {\n label: \"gemini-3-pro-image-preview\",\n value: \"gemini-3-pro-image-preview\",\n tasks: [\"ImageGenerateTask\", \"ImageEditTask\"],\n },\n {\n label: \"imagen-4.0-generate-001\",\n value: \"imagen-4.0-generate-001\",\n tasks: [\"ImageGenerateTask\"],\n },\n];\n\ninterface GeminiApiModel {\n readonly name: string;\n readonly displayName?: string;\n readonly description?: string;\n readonly supportedGenerationMethods?: readonly string[];\n}\n\nfunction tasksForGeminiApiModel(model: GeminiApiModel, id: string): string[] {\n const staticEntry = GEMINI_MODELS.find((m) => m.value === id);\n if (staticEntry?.tasks) return [...staticEntry.tasks];\n\n const methods = model.supportedGenerationMethods ?? [];\n if (methods.some((method) => method.toLowerCase().includes(\"embed\"))) {\n return [\"TextEmbeddingTask\"];\n }\n return [];\n}\n\nfunction mapGeminiModel(model: GeminiApiModel): ModelSearchResultItem {\n const id = model.name.startsWith(\"models/\") ? model.name.slice(\"models/\".length) : model.name;\n const title = model.displayName || id;\n return {\n id,\n label: model.displayName ? `${id} ${model.displayName}` : id,\n description: model.description ?? \"\",\n record: {\n model_id: id,\n provider: GOOGLE_GEMINI,\n title,\n description: model.description ?? \"\",\n tasks: tasksForGeminiApiModel(model, id),\n provider_config: { model_name: id },\n metadata: {},\n },\n raw: model,\n };\n}\n\nasync function listGeminiModels(\n credentialKey: string,\n signal?: AbortSignal\n): Promise<ModelSearchResultItem[]> {\n const params = new URLSearchParams({ key: credentialKey });\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?${params}`,\n {\n signal,\n }\n );\n if (!response.ok) throw new Error(`Gemini API returned ${response.status}`);\n const body = (await response.json()) as { models?: GeminiApiModel[] };\n return (body.models ?? []).map(mapGeminiModel);\n}\n\nexport const Gemini_ModelSearch: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _onProgress, signal) => {\n const q = normalizedModelSearchQuery(input.query);\n if (input.credential_key) {\n const models = await listGeminiModels(input.credential_key, signal);\n const results = q\n ? models.filter((m) => m.id.toLowerCase().includes(q) || m.label.toLowerCase().includes(q))\n : models;\n return { results };\n }\n\n const filtered = q\n ? GEMINI_MODELS.filter(\n (m) => m.value.toLowerCase().includes(q) || m.label.toLowerCase().includes(q)\n )\n : GEMINI_MODELS;\n const results: ModelSearchResultItem[] = filtered.map((m) => ({\n id: m.value,\n label: m.label,\n description: \"\",\n record: {\n model_id: m.value,\n provider: GOOGLE_GEMINI,\n title: m.value,\n description: \"\",\n tasks: m.tasks ? [...m.tasks] : [],\n provider_config: { model_name: m.value },\n metadata: {},\n },\n raw: m,\n }));\n return { results };\n};\n",
8
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const GOOGLE_GEMINI = \"GOOGLE_GEMINI\";\n",
9
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Recursively strip JSON Schema properties that the Gemini API does not support\n * (e.g. `additionalProperties`). Returns a shallow-cloned schema without mutating the original.\n */\nexport function sanitizeSchemaForGemini(schema: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"additionalProperties\") continue;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[key] = sanitizeSchemaForGemini(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n",
10
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { FunctionCallingMode } from \"@google/generative-ai\";\nimport { buildToolDescription, filterValidToolCalls } from \"@workglow/ai/worker\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ChatMessage,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\nimport { sanitizeSchemaForGemini } from \"./Gemini_Schema\";\n\nexport function buildGeminiContents(\n messages: ReadonlyArray<ChatMessage> | undefined,\n prompt: unknown\n): any[] {\n if (!messages || messages.length === 0) {\n return [{ role: \"user\", parts: [{ text: prompt }] }];\n }\n\n // Index tool_use ids → names from any prior assistant turn (Gemini wants\n // the function name on the functionResponse, not just the id).\n const toolUseNames = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role !== \"assistant\") continue;\n for (const block of msg.content) {\n if (block.type === \"tool_use\") {\n toolUseNames.set(block.id, block.name);\n }\n }\n }\n\n const contents: any[] = [];\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const parts: any[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n parts.push({ text: block.text });\n } else if (block.type === \"image\") {\n parts.push({ inlineData: { mimeType: block.mimeType, data: block.data } });\n }\n }\n contents.push({ role: \"user\", parts });\n } else if (msg.role === \"assistant\") {\n const parts: any[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\" && block.text) {\n parts.push({ text: block.text });\n } else if (block.type === \"tool_use\") {\n parts.push({ functionCall: { name: block.name, args: block.input } });\n }\n }\n if (parts.length > 0) contents.push({ role: \"model\", parts });\n } else if (msg.role === \"tool\") {\n const parts: any[] = [];\n for (const block of msg.content) {\n if (block.type !== \"tool_result\") continue;\n const name = toolUseNames.get(block.tool_use_id) ?? \"unknown\";\n const textContent = block.content\n .filter((b) => b.type === \"text\")\n .map((b) => (b as { type: \"text\"; text: string }).text)\n .join(\"\");\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(textContent);\n } catch {\n response = { result: textContent };\n }\n parts.push({ functionResponse: { name, response } });\n }\n if (parts.length > 0) contents.push({ role: \"user\", parts });\n }\n }\n return contents;\n}\n\nfunction mapGeminiToolConfig(\n toolChoice: string | undefined\n):\n | { functionCallingConfig: { mode: FunctionCallingMode; allowedFunctionNames?: string[] } }\n | undefined {\n if (!toolChoice || toolChoice === \"auto\") {\n return { functionCallingConfig: { mode: \"AUTO\" as FunctionCallingMode } };\n }\n if (toolChoice === \"none\") {\n return { functionCallingConfig: { mode: \"NONE\" as FunctionCallingMode } };\n }\n if (toolChoice === \"required\") {\n return { functionCallingConfig: { mode: \"ANY\" as FunctionCallingMode } };\n }\n return {\n functionCallingConfig: {\n mode: \"ANY\" as FunctionCallingMode,\n allowedFunctionNames: [toolChoice],\n },\n };\n}\n\nexport const Gemini_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Gemini tool calling\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n\n const functionDeclarations = input.tools.map((t: ToolDefinition) => ({\n name: t.name,\n description: buildToolDescription(t),\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown>) as any,\n }));\n\n const toolConfig = mapGeminiToolConfig(input.toolChoice);\n\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n tools: [{ functionDeclarations }],\n toolConfig: toolConfig as any,\n systemInstruction: input.systemPrompt || undefined,\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const contents = buildGeminiContents(input.messages, input.prompt);\n\n const result = await genModel.generateContent({ contents });\n\n const parts = result.response.candidates?.[0]?.content?.parts ?? [];\n\n const textParts: string[] = [];\n const toolCalls: ToolCalls = [];\n let callIndex = 0;\n\n for (const part of parts) {\n if (\"text\" in part && part.text) {\n textParts.push(part.text);\n }\n if (\"functionCall\" in part && part.functionCall) {\n const id = `call_${callIndex++}`;\n toolCalls.push({\n id,\n name: part.functionCall.name,\n input: (part.functionCall.args as Record<string, unknown>) ?? {},\n });\n }\n }\n\n update_progress(100, \"Completed Gemini tool calling\");\n return { text: textParts.join(\"\"), toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const Gemini_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n\n const functionDeclarations = input.tools.map((t: ToolDefinition) => ({\n name: t.name,\n description: buildToolDescription(t),\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown>) as any,\n }));\n\n const toolConfig = mapGeminiToolConfig(input.toolChoice);\n\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n tools: [{ functionDeclarations }],\n toolConfig: toolConfig as any,\n systemInstruction: input.systemPrompt || undefined,\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const contents = buildGeminiContents(input.messages, input.prompt);\n\n const result = await genModel.generateContentStream({ contents }, { signal });\n\n let callIndex = 0;\n\n for await (const chunk of result.stream) {\n const parts = chunk.candidates?.[0]?.content?.parts ?? [];\n for (const part of parts) {\n if (\"text\" in part && part.text) {\n yield { type: \"text-delta\", port: \"text\", textDelta: part.text };\n }\n if (\"functionCall\" in part && part.functionCall) {\n const id = `call_${callIndex++}`;\n yield {\n type: \"object-delta\",\n port: \"toolCalls\",\n objectDelta: [\n {\n id,\n name: part.functionCall.name,\n input: (part.functionCall.args as Record<string, unknown>) ?? {},\n },\n ],\n };\n }\n }\n }\n\n yield { type: \"finish\", data: { text: \"\", toolCalls: [] } as ToolCallingTaskOutput };\n};\n",
11
+ "/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiChatProviderInput,\n AiChatProviderOutput,\n AiProviderRunFn,\n AiProviderStreamFn,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\nimport { buildGeminiContents } from \"./Gemini_ToolCalling\";\n\nexport const Gemini_Chat: AiProviderRunFn<\n AiChatProviderInput,\n AiChatProviderOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Gemini chat turn\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: input.systemPrompt || undefined,\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const contents = buildGeminiContents(input.messages, input.prompt);\n\n const result = await genModel.generateContent({ contents });\n const text = result.response.text() ?? \"\";\n update_progress(100, \"Turn complete\");\n return { text };\n};\n\nexport const Gemini_Chat_Stream: AiProviderStreamFn<\n AiChatProviderInput,\n AiChatProviderOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<AiChatProviderOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: input.systemPrompt || undefined,\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const contents = buildGeminiContents(input.messages, input.prompt);\n\n const result = await genModel.generateContentStream({ contents }, { signal });\n\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) {\n yield { type: \"text-delta\", port: \"text\", textDelta: text };\n }\n }\n yield { type: \"finish\", data: {} as AiChatProviderOutput };\n};\n",
12
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderPreviewRunFn,\n AiProviderRunFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n} from \"@workglow/ai\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nexport const Gemini_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n GeminiModelConfig\n> = async (input, model, onProgress, signal) => {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({ model: getModelName(model) });\n const result = await genModel.countTokens(input.text);\n return { count: result.totalTokens };\n};\n\nexport const Gemini_CountTokens_Preview: AiProviderPreviewRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n GeminiModelConfig\n> = async (input, _model) => {\n return { count: Math.ceil(input.text.length / 4) };\n};\n",
13
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ImageEditTaskInput,\n ImageEditTaskOutput,\n ModelConfig,\n} from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { ImageValue } from \"@workglow/util/media\";\nimport { getLogger } from \"@workglow/util/worker\";\n\nimport { dataUriToImageValue, imageValueToPngBytes } from \"@workglow/ai-provider/common\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\n\nfunction modelIdOf(model: ModelConfig | undefined): string {\n return (\n model?.model_id ??\n (model?.provider_config as { model_name?: string } | undefined)?.model_name ??\n \"gemini\"\n );\n}\n\n/** Decode a base64 inline image part into an ImageValue. */\nasync function decodeInlineImage(mimeType: string, data: string): Promise<ImageValue> {\n return dataUriToImageValue(`data:${mimeType};base64,${data}`);\n}\n\n/**\n * Encode an inbound `ImageValue` (or a legacy data URI string) as base64 PNG\n * for use in an inlineData Part.\n */\nasync function gpuImageToInlinePart(\n image: ImageValue | string\n): Promise<{ inlineData: { mimeType: string; data: string } }> {\n if (typeof image === \"string\" && image.startsWith(\"data:\")) {\n // Data URI materialized at an earlier worker boundary — extract base64 directly.\n const base64 = image.replace(/^data:[^;]+;base64,/, \"\");\n return { inlineData: { mimeType: \"image/png\", data: base64 } };\n }\n const bytes = await imageValueToPngBytes(image);\n // Convert raw bytes to base64 for the inlineData part. Buffer.toString\n // is used in node; fall back to btoa over chunks in browser-like runtimes.\n let base64: string;\n if (typeof Buffer !== \"undefined\") {\n base64 = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"base64\");\n } else {\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64 = btoa(binary);\n }\n return { inlineData: { mimeType: \"image/png\", data: base64 } };\n}\n\n/** Non-streaming path. */\nexport const Gemini_ImageEdit: AiProviderRunFn<\n ImageEditTaskInput,\n ImageEditTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timer = `gemini:ImageEdit:${modelIdOf(model)}`;\n logger.time(timer, { model: modelIdOf(model) });\n update_progress(0, \"Starting Gemini image edit\");\n\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const modelName = getModelName(model);\n const genModel = genAI.getGenerativeModel({ model: modelName });\n\n // image/additionalImages may be data URI strings if the input crossed\n // an earlier worker boundary in legacy form; otherwise they are ImageValue\n // POJOs from the standard image hydration resolver.\n const primaryPart = await gpuImageToInlinePart(input.image as unknown as ImageValue | string);\n\n const additionalParts: Array<{ inlineData: { mimeType: string; data: string } }> =\n input.additionalImages && (input.additionalImages as Array<ImageValue | string>).length > 0\n ? await Promise.all(\n (input.additionalImages as Array<ImageValue | string>).map((g) => gpuImageToInlinePart(g))\n )\n : [];\n\n const parts: Array<any> = [{ text: input.prompt }, primaryPart, ...additionalParts];\n\n try {\n const result = await genModel.generateContent({ contents: [{ role: \"user\", parts }] }, {\n signal,\n } as any);\n\n const response = result.response;\n\n // Check for safety blocks\n if (\n !response.candidates ||\n response.candidates.length === 0 ||\n response.promptFeedback?.blockReason\n ) {\n const reason = response.promptFeedback?.blockReason ?? \"SAFETY\";\n throw new ImageGenerationContentPolicyError(modelIdOf(model), `Blocked: ${reason}`);\n }\n\n // Find the inline image part\n const candidateParts = response.candidates[0]?.content?.parts ?? [];\n const imagePart = candidateParts.find(\n (p: any) => p.inlineData && p.inlineData.mimeType && p.inlineData.data\n ) as { inlineData: { mimeType: string; data: string } } | undefined;\n\n if (!imagePart) {\n throw new ImageGenerationProviderError(\n modelIdOf(model),\n \"No image part in response (Gemini did not return an inline image)\"\n );\n }\n\n const image = await decodeInlineImage(imagePart.inlineData.mimeType, imagePart.inlineData.data);\n update_progress(100, \"Completed Gemini image edit\");\n logger.timeEnd(timer, { model: modelIdOf(model) });\n return { image };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation|blocked|SAFETY|PROHIBITED/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n\n/**\n * One-shot stream wrapper. Gemini does not support partial image streaming,\n * so we call the non-streaming run function, yield one snapshot, then finish.\n */\nexport const Gemini_ImageEdit_Stream: AiProviderStreamFn<\n ImageEditTaskInput,\n ImageEditTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ImageEditTaskOutput>> {\n const noop = () => {};\n const result = await Gemini_ImageEdit(input, model, noop, signal);\n yield { type: \"snapshot\", data: result } as StreamEvent<ImageEditTaskOutput>;\n yield { type: \"finish\", data: {} as ImageEditTaskOutput };\n};\n",
14
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n ModelConfig,\n} from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { ImageValue } from \"@workglow/util/media\";\nimport { getLogger } from \"@workglow/util/worker\";\n\nimport { dataUriToImageValue } from \"@workglow/ai-provider/common\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nfunction modelIdOf(model: ModelConfig | undefined): string {\n return (\n model?.model_id ??\n (model?.provider_config as { model_name?: string } | undefined)?.model_name ??\n \"gemini\"\n );\n}\n\n/** Decode a base64 string with an explicit mime type into an ImageValue. */\nasync function decodeInlineImage(mimeType: string, data: string): Promise<ImageValue> {\n return dataUriToImageValue(`data:${mimeType};base64,${data}`);\n}\n\n/** Non-streaming path. */\nexport const Gemini_ImageGenerate: AiProviderRunFn<\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timer = `gemini:ImageGenerate:${modelIdOf(model)}`;\n logger.time(timer, { model: modelIdOf(model) });\n update_progress(0, \"Starting Gemini image generation\");\n\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const modelName = getModelName(model);\n const genModel = genAI.getGenerativeModel({ model: modelName });\n\n const parts: Array<{ text: string }> = [{ text: input.prompt }];\n\n try {\n const result = await genModel.generateContent({ contents: [{ role: \"user\", parts }] }, {\n signal,\n } as any);\n\n const response = result.response;\n\n // Check for safety blocks\n if (\n !response.candidates ||\n response.candidates.length === 0 ||\n response.promptFeedback?.blockReason\n ) {\n const reason = response.promptFeedback?.blockReason ?? \"SAFETY\";\n throw new ImageGenerationContentPolicyError(modelIdOf(model), `Blocked: ${reason}`);\n }\n\n // Find the inline image part\n const candidateParts = response.candidates[0]?.content?.parts ?? [];\n const imagePart = candidateParts.find(\n (p: any) => p.inlineData && p.inlineData.mimeType && p.inlineData.data\n ) as { inlineData: { mimeType: string; data: string } } | undefined;\n\n if (!imagePart) {\n throw new ImageGenerationProviderError(\n modelIdOf(model),\n \"No image part in response (Gemini did not return an inline image)\"\n );\n }\n\n const image = await decodeInlineImage(imagePart.inlineData.mimeType, imagePart.inlineData.data);\n update_progress(100, \"Completed Gemini image generation\");\n logger.timeEnd(timer, { model: modelIdOf(model) });\n return { image };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation|blocked|SAFETY|PROHIBITED/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n\n/**\n * One-shot stream wrapper. Gemini's @google/generative-ai SDK does not support\n * partial image streaming, so we call the non-streaming run function, yield one\n * snapshot, then finish.\n */\nexport const Gemini_ImageGenerate_Stream: AiProviderStreamFn<\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ImageGenerateTaskOutput>> {\n const noop = () => {};\n const result = await Gemini_ImageGenerate(input, model, noop, signal);\n yield { type: \"snapshot\", data: result } as StreamEvent<ImageGenerateTaskOutput>;\n yield { type: \"finish\", data: {} as ImageGenerateTaskOutput };\n};\n",
15
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\n\n/** Known Gemini embedding model dimensions. */\nconst GEMINI_EMBEDDING_DIMENSIONS: Record<string, { native_dimensions: number; mrl: boolean }> = {\n \"text-embedding-004\": { native_dimensions: 768, mrl: true },\n \"embedding-001\": { native_dimensions: 768, mrl: false },\n};\n\nexport const Gemini_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n GeminiModelConfig\n> = async (input, model) => {\n if (input.detail === \"dimensions\") {\n const pc = model?.provider_config as Record<string, unknown>;\n let native_dimensions =\n typeof pc?.native_dimensions === \"number\" ? pc.native_dimensions : undefined;\n let mrl = typeof pc?.mrl === \"boolean\" ? pc.mrl : undefined;\n if (native_dimensions === undefined) {\n const modelName = (pc?.model_name as string) ?? \"\";\n const known = GEMINI_EMBEDDING_DIMENSIONS[modelName];\n if (known) {\n native_dimensions = known.native_dimensions;\n mrl = mrl ?? known.mrl;\n }\n }\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n ...(native_dimensions !== undefined ? { native_dimensions } : {}),\n ...(mrl !== undefined ? { mrl } : {}),\n };\n }\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n };\n};\n",
16
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\nimport { sanitizeSchemaForGemini } from \"./Gemini_Schema\";\n\nexport const Gemini_StructuredGeneration: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal, outputSchema) => {\n update_progress(0, \"Starting Gemini structured generation\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n\n const schema = input.outputSchema ?? outputSchema;\n\n const sanitizedSchema = sanitizeSchemaForGemini(schema as Record<string, unknown>);\n\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n generationConfig: {\n responseMimeType: \"application/json\",\n responseSchema: sanitizedSchema as any,\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text: input.prompt as string }] }],\n });\n\n const text = result.response.text();\n update_progress(100, \"Completed Gemini structured generation\");\n return { object: JSON.parse(text) };\n};\n\nexport const Gemini_StructuredGeneration_Stream: AiProviderStreamFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n GeminiModelConfig\n> = async function* (\n input,\n model,\n signal,\n outputSchema\n): AsyncIterable<StreamEvent<StructuredGenerationTaskOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n\n const schema = input.outputSchema ?? outputSchema;\n\n const sanitizedSchema = sanitizeSchemaForGemini(schema as Record<string, unknown>);\n\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n generationConfig: {\n responseMimeType: \"application/json\",\n responseSchema: sanitizedSchema as any,\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n },\n });\n\n const result = await genModel.generateContentStream(\n { contents: [{ role: \"user\", parts: [{ text: input.prompt as string }] }] },\n { signal }\n );\n\n let accumulatedJson = \"\";\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) {\n accumulatedJson += text;\n const partial = parsePartialJson(accumulatedJson);\n if (partial !== undefined) {\n yield { type: \"object-delta\", port: \"object\", objectDelta: partial };\n }\n }\n }\n\n let finalObject: Record<string, unknown>;\n try {\n finalObject = JSON.parse(accumulatedJson);\n } catch {\n finalObject = parsePartialJson(accumulatedJson) ?? {};\n }\n yield { type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput };\n};\n",
17
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { TaskType } from \"@google/generative-ai\";\nimport type {\n AiProviderRunFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nexport const Gemini_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `gemini:TextEmbedding:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting Gemini text embedding\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const embeddingModel = genAI.getGenerativeModel({\n model: getModelName(model),\n });\n\n const taskType =\n (model?.provider_config?.embedding_task_type as TaskType) || (\"RETRIEVAL_DOCUMENT\" as TaskType);\n\n if (Array.isArray(input.text)) {\n const result = await embeddingModel.batchEmbedContents({\n requests: input.text.map((t) => ({\n content: { role: \"user\", parts: [{ text: t }] },\n taskType,\n })),\n });\n update_progress(100, \"Completed Gemini text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name, batch: true });\n return {\n vector: result.embeddings.map((e) => new Float32Array(e.values)),\n };\n }\n\n const result = await embeddingModel.embedContent({\n content: { role: \"user\", parts: [{ text: input.text as string }] },\n taskType,\n });\n\n update_progress(100, \"Completed Gemini text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { vector: new Float32Array(result.embedding.values) };\n};\n",
18
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nexport const Gemini_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `gemini:TextGeneration:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting Gemini text generation\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n topP: input.topP,\n },\n });\n\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text: input.prompt }] }],\n });\n\n const text = result.response.text();\n update_progress(100, \"Completed Gemini text generation\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { text };\n};\n\nexport const Gemini_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n generationConfig: {\n maxOutputTokens: input.maxTokens,\n temperature: input.temperature,\n topP: input.topP,\n },\n });\n\n const result = await genModel.generateContentStream(\n { contents: [{ role: \"user\", parts: [{ text: input.prompt }] }] },\n { signal }\n );\n\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) {\n yield { type: \"text-delta\", port: \"text\", textDelta: text };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n",
19
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nexport const Gemini_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Gemini text rewriting\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: input.prompt,\n });\n\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text: input.text }] }],\n });\n\n const text = result.response.text();\n update_progress(100, \"Completed Gemini text rewriting\");\n return { text };\n};\n\nexport const Gemini_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: input.prompt,\n });\n\n const result = await genModel.generateContentStream(\n { contents: [{ role: \"user\", parts: [{ text: input.text }] }] },\n { signal }\n );\n\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) {\n yield { type: \"text-delta\", port: \"text\", textDelta: text };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n",
20
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { getApiKey, getModelName, loadGeminiSDK } from \"./Gemini_Client\";\n\nexport const Gemini_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n GeminiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Gemini text summarization\");\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: \"Summarize the following text concisely.\",\n });\n\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text: input.text }] }],\n });\n\n const text = result.response.text();\n update_progress(100, \"Completed Gemini text summarization\");\n return { text };\n};\n\nexport const Gemini_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n GeminiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const GoogleGenerativeAI = await loadGeminiSDK();\n const genAI = new GoogleGenerativeAI(getApiKey(model));\n const genModel = genAI.getGenerativeModel({\n model: getModelName(model),\n systemInstruction: \"Summarize the following text concisely.\",\n });\n\n const result = await genModel.generateContentStream(\n { contents: [{ role: \"user\", parts: [{ text: input.text }] }] },\n { signal }\n );\n\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) {\n yield { type: \"text-delta\", port: \"text\", textDelta: text };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n",
21
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { GeminiModelConfig } from \"./Gemini_ModelSchema\";\nimport { Gemini_ModelSearch } from \"./Gemini_ModelSearch\";\n\nexport { loadGeminiSDK, getApiKey, getModelName } from \"./Gemini_Client\";\nexport { sanitizeSchemaForGemini } from \"./Gemini_Schema\";\n\nimport { Gemini_Chat, Gemini_Chat_Stream } from \"./Gemini_Chat\";\nimport { Gemini_CountTokens, Gemini_CountTokens_Preview } from \"./Gemini_CountTokens\";\nimport { Gemini_ImageEdit, Gemini_ImageEdit_Stream } from \"./Gemini_ImageEdit\";\nimport { Gemini_ImageGenerate, Gemini_ImageGenerate_Stream } from \"./Gemini_ImageGenerate\";\nimport { Gemini_ModelInfo } from \"./Gemini_ModelInfo\";\nimport {\n Gemini_StructuredGeneration,\n Gemini_StructuredGeneration_Stream,\n} from \"./Gemini_StructuredGeneration\";\nimport { Gemini_TextEmbedding } from \"./Gemini_TextEmbedding\";\nimport { Gemini_TextGeneration, Gemini_TextGeneration_Stream } from \"./Gemini_TextGeneration\";\nimport { Gemini_TextRewriter, Gemini_TextRewriter_Stream } from \"./Gemini_TextRewriter\";\nimport { Gemini_TextSummary, Gemini_TextSummary_Stream } from \"./Gemini_TextSummary\";\nimport { Gemini_ToolCalling, Gemini_ToolCalling_Stream } from \"./Gemini_ToolCalling\";\n\nexport const GEMINI_TASKS: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>> = {\n AiChatTask: Gemini_Chat,\n CountTokensTask: Gemini_CountTokens,\n ModelInfoTask: Gemini_ModelInfo,\n TextGenerationTask: Gemini_TextGeneration,\n TextEmbeddingTask: Gemini_TextEmbedding,\n TextRewriterTask: Gemini_TextRewriter,\n TextSummaryTask: Gemini_TextSummary,\n StructuredGenerationTask: Gemini_StructuredGeneration,\n ToolCallingTask: Gemini_ToolCalling,\n ModelSearchTask: Gemini_ModelSearch,\n ImageGenerateTask: Gemini_ImageGenerate,\n ImageEditTask: Gemini_ImageEdit,\n};\n\nexport const GEMINI_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, GeminiModelConfig>\n> = {\n AiChatTask: Gemini_Chat_Stream,\n TextGenerationTask: Gemini_TextGeneration_Stream,\n TextRewriterTask: Gemini_TextRewriter_Stream,\n TextSummaryTask: Gemini_TextSummary_Stream,\n StructuredGenerationTask: Gemini_StructuredGeneration_Stream,\n ToolCallingTask: Gemini_ToolCalling_Stream,\n ImageGenerateTask: Gemini_ImageGenerate_Stream,\n ImageEditTask: Gemini_ImageEdit_Stream,\n};\n\nexport const GEMINI_PREVIEW_TASKS: Record<\n string,\n AiProviderPreviewRunFn<any, any, GeminiModelConfig>\n> = {\n CountTokensTask: Gemini_CountTokens_Preview,\n};\n",
22
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai\";\nimport type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport { GOOGLE_GEMINI } from \"./common/Gemini_Constants\";\nimport type { GeminiModelConfig } from \"./common/Gemini_ModelSchema\";\n\n/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */\nexport class GoogleGeminiQueuedProvider extends AiProvider<GeminiModelConfig> {\n readonly name = GOOGLE_GEMINI;\n readonly displayName = \"Google Gemini\";\n readonly isLocal = false;\n readonly supportsBrowser = true;\n\n readonly taskTypes = [\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n \"ImageGenerateTask\",\n \"ImageEditTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, GeminiModelConfig>>,\n previewTasks?: Record<string, AiProviderPreviewRunFn<any, any, GeminiModelConfig>>\n ) {\n super(tasks, streamTasks, previewTasks);\n }\n}\n",
23
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiImageOutputTask, ProviderUnsupportedFeatureError } from \"@workglow/ai\";\nimport type { ModelConfig } from \"@workglow/ai\";\n\nimport { GOOGLE_GEMINI } from \"./Gemini_Constants\";\n\n/**\n * Registers the Gemini per-provider image validator. Called at provider registration time\n * (both inline and worker-backed paths) so it runs on the main thread before any dispatch.\n *\n * Currently validates:\n * - ImageEditTask + non-null mask → throws (Gemini does not support mask-based inpainting).\n */\nexport function registerGeminiImageValidator(): void {\n AiImageOutputTask.registerProviderImageValidator(\n GOOGLE_GEMINI,\n (taskType, input, model: ModelConfig) => {\n if (taskType !== \"ImageEditTask\") return;\n if (input[\"mask\"] !== undefined && input[\"mask\"] !== null) {\n throw new ProviderUnsupportedFeatureError(\n \"mask\",\n model.model_id ?? \"gemini\",\n \"Gemini does not support mask-based inpainting; remove the mask or use OpenAI gpt-image-2\"\n );\n }\n }\n );\n}\n",
24
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { registerProviderWorker } from \"@workglow/ai-provider/common\";\nimport { GEMINI_PREVIEW_TASKS, GEMINI_STREAM_TASKS, GEMINI_TASKS } from \"./common/Gemini_JobRunFns\";\nimport { GoogleGeminiProvider } from \"./GoogleGeminiProvider\";\n\nexport async function registerGeminiWorker(): Promise<void> {\n await registerProviderWorker(\n (ws) =>\n new GoogleGeminiProvider(\n GEMINI_TASKS,\n GEMINI_STREAM_TASKS,\n GEMINI_PREVIEW_TASKS\n ).registerOnWorkerServer(ws),\n \"Google Gemini\"\n );\n}\n",
25
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport type {\n AiProviderPreviewRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n} from \"@workglow/ai/worker\";\nimport { GOOGLE_GEMINI } from \"./common/Gemini_Constants\";\nimport type { GeminiModelConfig } from \"./common/Gemini_ModelSchema\";\n\n/**\n * AI provider for Google Gemini cloud models.\n *\n * Supports text generation, text embedding, text rewriting, and text summarization\n * via the Google Generative AI API using the `@google/generative-ai` SDK.\n *\n * Task run functions are injected via the constructor so that the SDK\n * is only imported where actually needed (inline mode, worker server), not on\n * the main thread in worker mode.\n */\nexport class GoogleGeminiProvider extends AiProvider<GeminiModelConfig> {\n readonly name = GOOGLE_GEMINI;\n readonly displayName = \"Google Gemini\";\n readonly isLocal = false;\n readonly supportsBrowser = true;\n\n readonly taskTypes = [\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n \"ImageGenerateTask\",\n \"ImageEditTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, GeminiModelConfig>>,\n previewTasks?: Record<string, AiProviderPreviewRunFn<any, any, GeminiModelConfig>>\n ) {\n super(tasks, streamTasks, previewTasks);\n }\n}\n"
26
+ ],
27
+ "mappings": "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",
28
+ "debugId": "77A1873DA035E57D64756E2164756E21",
29
+ "names": []
30
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Steven Roussey <sroussey@gmail.com>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./ai-provider/index";
7
+ //# sourceMappingURL=ai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../src/ai-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,233 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined")
5
+ return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+
9
+ // src/ai-provider/common/Gemini_Constants.ts
10
+ var GOOGLE_GEMINI = "GOOGLE_GEMINI";
11
+
12
+ // src/ai-provider/common/Gemini_ImageValidation.ts
13
+ import { AiImageOutputTask, ProviderUnsupportedFeatureError } from "@workglow/ai";
14
+ function registerGeminiImageValidator() {
15
+ AiImageOutputTask.registerProviderImageValidator(GOOGLE_GEMINI, (taskType, input, model) => {
16
+ if (taskType !== "ImageEditTask")
17
+ return;
18
+ if (input["mask"] !== undefined && input["mask"] !== null) {
19
+ throw new ProviderUnsupportedFeatureError("mask", model.model_id ?? "gemini", "Gemini does not support mask-based inpainting; remove the mask or use OpenAI gpt-image-2");
20
+ }
21
+ });
22
+ }
23
+
24
+ // src/ai-provider/common/Gemini_ModelSchema.ts
25
+ import { ModelConfigSchema, ModelRecordSchema } from "@workglow/ai/worker";
26
+ var GeminiModelSchema = {
27
+ type: "object",
28
+ properties: {
29
+ provider: {
30
+ const: GOOGLE_GEMINI,
31
+ description: "Discriminator: Google Gemini cloud provider."
32
+ },
33
+ provider_config: {
34
+ type: "object",
35
+ description: "Google Gemini-specific configuration.",
36
+ properties: {
37
+ model_name: {
38
+ type: "string",
39
+ description: "The Gemini model identifier (e.g., 'gemini-2.0-flash', 'text-embedding-004')."
40
+ },
41
+ credential_key: {
42
+ type: "string",
43
+ format: "credential",
44
+ description: "Key to look up in the credential store for the API key.",
45
+ "x-ui-hidden": true
46
+ },
47
+ embedding_task_type: {
48
+ oneOf: [
49
+ { type: "null" },
50
+ {
51
+ type: "string",
52
+ enum: [
53
+ "RETRIEVAL_QUERY",
54
+ "RETRIEVAL_DOCUMENT",
55
+ "SEMANTIC_SIMILARITY",
56
+ "CLASSIFICATION",
57
+ "CLUSTERING"
58
+ ]
59
+ }
60
+ ],
61
+ description: "Task type hint for embedding models.",
62
+ default: null
63
+ }
64
+ },
65
+ required: ["model_name"],
66
+ additionalProperties: false
67
+ }
68
+ },
69
+ required: ["provider", "provider_config"],
70
+ additionalProperties: true
71
+ };
72
+ var GeminiModelRecordSchema = {
73
+ type: "object",
74
+ properties: {
75
+ ...ModelRecordSchema.properties,
76
+ ...GeminiModelSchema.properties
77
+ },
78
+ required: [...ModelRecordSchema.required, ...GeminiModelSchema.required],
79
+ additionalProperties: false
80
+ };
81
+ var GeminiModelConfigSchema = {
82
+ type: "object",
83
+ properties: {
84
+ ...ModelConfigSchema.properties,
85
+ ...GeminiModelSchema.properties
86
+ },
87
+ required: [...ModelConfigSchema.required, ...GeminiModelSchema.required],
88
+ additionalProperties: false
89
+ };
90
+
91
+ // src/ai-provider/common/Gemini_ModelSearch.ts
92
+ import { normalizedModelSearchQuery } from "@workglow/ai-provider/common";
93
+ var GEMINI_MODELS = [
94
+ { label: "gemini-3.1-pro-preview", value: "gemini-3.1-pro-preview" },
95
+ { label: "gemini-3-flash-preview", value: "gemini-3-flash-preview" },
96
+ { label: "gemini-3.1-flash-lite-preview", value: "gemini-3.1-flash-lite-preview" },
97
+ { label: "gemini-2.5-flash", value: "gemini-2.5-flash" },
98
+ { label: "gemini-2.5-pro", value: "gemini-2.5-pro" },
99
+ {
100
+ label: "gemini-embedding-2",
101
+ value: "gemini-embedding-2",
102
+ tasks: ["TextEmbeddingTask"]
103
+ },
104
+ {
105
+ label: "gemini-embedding-001",
106
+ value: "gemini-embedding-001",
107
+ tasks: ["TextEmbeddingTask"]
108
+ },
109
+ {
110
+ label: "gemini-3.1-flash-image-preview",
111
+ value: "gemini-3.1-flash-image-preview",
112
+ tasks: ["ImageGenerateTask", "ImageEditTask"]
113
+ },
114
+ {
115
+ label: "gemini-3-pro-image-preview",
116
+ value: "gemini-3-pro-image-preview",
117
+ tasks: ["ImageGenerateTask", "ImageEditTask"]
118
+ },
119
+ {
120
+ label: "imagen-4.0-generate-001",
121
+ value: "imagen-4.0-generate-001",
122
+ tasks: ["ImageGenerateTask"]
123
+ }
124
+ ];
125
+ function tasksForGeminiApiModel(model, id) {
126
+ const staticEntry = GEMINI_MODELS.find((m) => m.value === id);
127
+ if (staticEntry?.tasks)
128
+ return [...staticEntry.tasks];
129
+ const methods = model.supportedGenerationMethods ?? [];
130
+ if (methods.some((method) => method.toLowerCase().includes("embed"))) {
131
+ return ["TextEmbeddingTask"];
132
+ }
133
+ return [];
134
+ }
135
+ function mapGeminiModel(model) {
136
+ const id = model.name.startsWith("models/") ? model.name.slice("models/".length) : model.name;
137
+ const title = model.displayName || id;
138
+ return {
139
+ id,
140
+ label: model.displayName ? `${id} ${model.displayName}` : id,
141
+ description: model.description ?? "",
142
+ record: {
143
+ model_id: id,
144
+ provider: GOOGLE_GEMINI,
145
+ title,
146
+ description: model.description ?? "",
147
+ tasks: tasksForGeminiApiModel(model, id),
148
+ provider_config: { model_name: id },
149
+ metadata: {}
150
+ },
151
+ raw: model
152
+ };
153
+ }
154
+ async function listGeminiModels(credentialKey, signal) {
155
+ const params = new URLSearchParams({ key: credentialKey });
156
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?${params}`, {
157
+ signal
158
+ });
159
+ if (!response.ok)
160
+ throw new Error(`Gemini API returned ${response.status}`);
161
+ const body = await response.json();
162
+ return (body.models ?? []).map(mapGeminiModel);
163
+ }
164
+ var Gemini_ModelSearch = async (input, _model, _onProgress, signal) => {
165
+ const q = normalizedModelSearchQuery(input.query);
166
+ if (input.credential_key) {
167
+ const models = await listGeminiModels(input.credential_key, signal);
168
+ const results2 = q ? models.filter((m) => m.id.toLowerCase().includes(q) || m.label.toLowerCase().includes(q)) : models;
169
+ return { results: results2 };
170
+ }
171
+ const filtered = q ? GEMINI_MODELS.filter((m) => m.value.toLowerCase().includes(q) || m.label.toLowerCase().includes(q)) : GEMINI_MODELS;
172
+ const results = filtered.map((m) => ({
173
+ id: m.value,
174
+ label: m.label,
175
+ description: "",
176
+ record: {
177
+ model_id: m.value,
178
+ provider: GOOGLE_GEMINI,
179
+ title: m.value,
180
+ description: "",
181
+ tasks: m.tasks ? [...m.tasks] : [],
182
+ provider_config: { model_name: m.value },
183
+ metadata: {}
184
+ },
185
+ raw: m
186
+ }));
187
+ return { results };
188
+ };
189
+
190
+ // src/ai-provider/registerGemini.ts
191
+ import { registerProviderWithWorker } from "@workglow/ai-provider/common";
192
+
193
+ // src/ai-provider/GoogleGeminiQueuedProvider.ts
194
+ import { AiProvider } from "@workglow/ai";
195
+ class GoogleGeminiQueuedProvider extends AiProvider {
196
+ name = GOOGLE_GEMINI;
197
+ displayName = "Google Gemini";
198
+ isLocal = false;
199
+ supportsBrowser = true;
200
+ taskTypes = [
201
+ "CountTokensTask",
202
+ "ModelInfoTask",
203
+ "TextGenerationTask",
204
+ "TextEmbeddingTask",
205
+ "TextRewriterTask",
206
+ "TextSummaryTask",
207
+ "StructuredGenerationTask",
208
+ "ToolCallingTask",
209
+ "ModelSearchTask",
210
+ "ImageGenerateTask",
211
+ "ImageEditTask"
212
+ ];
213
+ constructor(tasks, streamTasks, previewTasks) {
214
+ super(tasks, streamTasks, previewTasks);
215
+ }
216
+ }
217
+
218
+ // src/ai-provider/registerGemini.ts
219
+ async function registerGemini(options) {
220
+ registerGeminiImageValidator();
221
+ await registerProviderWithWorker(new GoogleGeminiQueuedProvider, "Google Gemini", options);
222
+ }
223
+ export {
224
+ registerGeminiImageValidator,
225
+ registerGemini,
226
+ Gemini_ModelSearch,
227
+ GeminiModelSchema,
228
+ GeminiModelRecordSchema,
229
+ GeminiModelConfigSchema,
230
+ GOOGLE_GEMINI
231
+ };
232
+
233
+ //# debugId=F83391C5BA2C724F64756E2164756E21
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ai-provider/common/Gemini_Constants.ts", "../src/ai-provider/common/Gemini_ImageValidation.ts", "../src/ai-provider/common/Gemini_ModelSchema.ts", "../src/ai-provider/common/Gemini_ModelSearch.ts", "../src/ai-provider/registerGemini.ts", "../src/ai-provider/GoogleGeminiQueuedProvider.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const GOOGLE_GEMINI = \"GOOGLE_GEMINI\";\n",
6
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiImageOutputTask, ProviderUnsupportedFeatureError } from \"@workglow/ai\";\nimport type { ModelConfig } from \"@workglow/ai\";\n\nimport { GOOGLE_GEMINI } from \"./Gemini_Constants\";\n\n/**\n * Registers the Gemini per-provider image validator. Called at provider registration time\n * (both inline and worker-backed paths) so it runs on the main thread before any dispatch.\n *\n * Currently validates:\n * - ImageEditTask + non-null mask → throws (Gemini does not support mask-based inpainting).\n */\nexport function registerGeminiImageValidator(): void {\n AiImageOutputTask.registerProviderImageValidator(\n GOOGLE_GEMINI,\n (taskType, input, model: ModelConfig) => {\n if (taskType !== \"ImageEditTask\") return;\n if (input[\"mask\"] !== undefined && input[\"mask\"] !== null) {\n throw new ProviderUnsupportedFeatureError(\n \"mask\",\n model.model_id ?? \"gemini\",\n \"Gemini does not support mask-based inpainting; remove the mask or use OpenAI gpt-image-2\"\n );\n }\n }\n );\n}\n",
7
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai/worker\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util/worker\";\nimport { GOOGLE_GEMINI } from \"./Gemini_Constants\";\n\nexport const GeminiModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: GOOGLE_GEMINI,\n description: \"Discriminator: Google Gemini cloud provider.\",\n },\n provider_config: {\n type: \"object\",\n description: \"Google Gemini-specific configuration.\",\n properties: {\n model_name: {\n type: \"string\",\n description:\n \"The Gemini model identifier (e.g., 'gemini-2.0-flash', 'text-embedding-004').\",\n },\n credential_key: {\n type: \"string\",\n format: \"credential\",\n description: \"Key to look up in the credential store for the API key.\",\n \"x-ui-hidden\": true,\n },\n embedding_task_type: {\n oneOf: [\n { type: \"null\" },\n {\n type: \"string\",\n enum: [\n \"RETRIEVAL_QUERY\",\n \"RETRIEVAL_DOCUMENT\",\n \"SEMANTIC_SIMILARITY\",\n \"CLASSIFICATION\",\n \"CLUSTERING\",\n ],\n },\n ],\n description: \"Task type hint for embedding models.\",\n default: null,\n },\n },\n required: [\"model_name\"],\n additionalProperties: false,\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const GeminiModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...GeminiModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...GeminiModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type GeminiModelRecord = FromSchema<typeof GeminiModelRecordSchema>;\n\nexport const GeminiModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...GeminiModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...GeminiModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type GeminiModelConfig = FromSchema<typeof GeminiModelConfigSchema>;\n",
8
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelSearchResultItem,\n ModelSearchTaskInput,\n ModelSearchTaskOutput,\n} from \"@workglow/ai\";\nimport { normalizedModelSearchQuery } from \"@workglow/ai-provider/common\";\nimport { GOOGLE_GEMINI } from \"./Gemini_Constants\";\n\ninterface GeminiModelEntry {\n readonly label: string;\n readonly value: string;\n readonly tasks?: readonly string[];\n}\n\nconst GEMINI_MODELS: readonly GeminiModelEntry[] = [\n { label: \"gemini-3.1-pro-preview\", value: \"gemini-3.1-pro-preview\" },\n { label: \"gemini-3-flash-preview\", value: \"gemini-3-flash-preview\" },\n { label: \"gemini-3.1-flash-lite-preview\", value: \"gemini-3.1-flash-lite-preview\" },\n { label: \"gemini-2.5-flash\", value: \"gemini-2.5-flash\" },\n { label: \"gemini-2.5-pro\", value: \"gemini-2.5-pro\" },\n // Embedding models\n {\n label: \"gemini-embedding-2\",\n value: \"gemini-embedding-2\",\n tasks: [\"TextEmbeddingTask\"],\n },\n {\n label: \"gemini-embedding-001\",\n value: \"gemini-embedding-001\",\n tasks: [\"TextEmbeddingTask\"],\n },\n // Image-output models\n {\n label: \"gemini-3.1-flash-image-preview\",\n value: \"gemini-3.1-flash-image-preview\",\n tasks: [\"ImageGenerateTask\", \"ImageEditTask\"],\n },\n {\n label: \"gemini-3-pro-image-preview\",\n value: \"gemini-3-pro-image-preview\",\n tasks: [\"ImageGenerateTask\", \"ImageEditTask\"],\n },\n {\n label: \"imagen-4.0-generate-001\",\n value: \"imagen-4.0-generate-001\",\n tasks: [\"ImageGenerateTask\"],\n },\n];\n\ninterface GeminiApiModel {\n readonly name: string;\n readonly displayName?: string;\n readonly description?: string;\n readonly supportedGenerationMethods?: readonly string[];\n}\n\nfunction tasksForGeminiApiModel(model: GeminiApiModel, id: string): string[] {\n const staticEntry = GEMINI_MODELS.find((m) => m.value === id);\n if (staticEntry?.tasks) return [...staticEntry.tasks];\n\n const methods = model.supportedGenerationMethods ?? [];\n if (methods.some((method) => method.toLowerCase().includes(\"embed\"))) {\n return [\"TextEmbeddingTask\"];\n }\n return [];\n}\n\nfunction mapGeminiModel(model: GeminiApiModel): ModelSearchResultItem {\n const id = model.name.startsWith(\"models/\") ? model.name.slice(\"models/\".length) : model.name;\n const title = model.displayName || id;\n return {\n id,\n label: model.displayName ? `${id} ${model.displayName}` : id,\n description: model.description ?? \"\",\n record: {\n model_id: id,\n provider: GOOGLE_GEMINI,\n title,\n description: model.description ?? \"\",\n tasks: tasksForGeminiApiModel(model, id),\n provider_config: { model_name: id },\n metadata: {},\n },\n raw: model,\n };\n}\n\nasync function listGeminiModels(\n credentialKey: string,\n signal?: AbortSignal\n): Promise<ModelSearchResultItem[]> {\n const params = new URLSearchParams({ key: credentialKey });\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?${params}`,\n {\n signal,\n }\n );\n if (!response.ok) throw new Error(`Gemini API returned ${response.status}`);\n const body = (await response.json()) as { models?: GeminiApiModel[] };\n return (body.models ?? []).map(mapGeminiModel);\n}\n\nexport const Gemini_ModelSearch: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _onProgress, signal) => {\n const q = normalizedModelSearchQuery(input.query);\n if (input.credential_key) {\n const models = await listGeminiModels(input.credential_key, signal);\n const results = q\n ? models.filter((m) => m.id.toLowerCase().includes(q) || m.label.toLowerCase().includes(q))\n : models;\n return { results };\n }\n\n const filtered = q\n ? GEMINI_MODELS.filter(\n (m) => m.value.toLowerCase().includes(q) || m.label.toLowerCase().includes(q)\n )\n : GEMINI_MODELS;\n const results: ModelSearchResultItem[] = filtered.map((m) => ({\n id: m.value,\n label: m.label,\n description: \"\",\n record: {\n model_id: m.value,\n provider: GOOGLE_GEMINI,\n title: m.value,\n description: \"\",\n tasks: m.tasks ? [...m.tasks] : [],\n provider_config: { model_name: m.value },\n metadata: {},\n },\n raw: m,\n }));\n return { results };\n};\n",
9
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderWithWorker } from \"@workglow/ai-provider/common\";\nimport { GoogleGeminiQueuedProvider } from \"./GoogleGeminiQueuedProvider\";\nimport { registerGeminiImageValidator } from \"./common/Gemini_ImageValidation\";\n\nexport async function registerGemini(\n options: AiProviderRegisterOptions & {\n worker: Worker | (() => Worker);\n }\n): Promise<void> {\n registerGeminiImageValidator();\n await registerProviderWithWorker(new GoogleGeminiQueuedProvider(), \"Google Gemini\", options);\n}\n",
10
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai\";\nimport type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport { GOOGLE_GEMINI } from \"./common/Gemini_Constants\";\nimport type { GeminiModelConfig } from \"./common/Gemini_ModelSchema\";\n\n/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */\nexport class GoogleGeminiQueuedProvider extends AiProvider<GeminiModelConfig> {\n readonly name = GOOGLE_GEMINI;\n readonly displayName = \"Google Gemini\";\n readonly isLocal = false;\n readonly supportsBrowser = true;\n\n readonly taskTypes = [\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n \"ImageGenerateTask\",\n \"ImageEditTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, GeminiModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, GeminiModelConfig>>,\n previewTasks?: Record<string, AiProviderPreviewRunFn<any, any, GeminiModelConfig>>\n ) {\n super(tasks, streamTasks, previewTasks);\n }\n}\n"
11
+ ],
12
+ "mappings": "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",
13
+ "debugId": "F83391C5BA2C724F64756E2164756E21",
14
+ "names": []
15
+ }
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@workglow/google-gemini",
3
+ "type": "module",
4
+ "sideEffects": false,
5
+ "version": "0.2.28",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/workglow-dev/workglow.git",
9
+ "directory": "packages/google-gemini"
10
+ },
11
+ "description": "Google Gemini provider for @workglow/ai-provider.",
12
+ "scripts": {
13
+ "watch": "concurrently -c 'auto' 'bun:watch-*'",
14
+ "watch-code": "bun build --watch --no-clear-screen --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/ai-provider.ts ./src/ai-provider-runtime.ts",
15
+ "watch-types": "tsc --watch --preserveWatchOutput",
16
+ "build-package": "concurrently -c 'auto' -n 'code,types' 'bun run build-code' 'bun run build-types'",
17
+ "build-js": "bun run build-code",
18
+ "build-clean": "rm -fr dist/* tsconfig.tsbuildinfo",
19
+ "build-code": "bun build --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/ai-provider.ts ./src/ai-provider-runtime.ts",
20
+ "build-types": "rm -f tsconfig.tsbuildinfo && tsgo",
21
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
22
+ "test": "bun test"
23
+ },
24
+ "exports": {
25
+ "./ai-provider": {
26
+ "types": "./dist/ai-provider.d.ts",
27
+ "import": "./dist/ai-provider.js"
28
+ },
29
+ "./ai-provider-runtime": {
30
+ "types": "./dist/ai-provider-runtime.d.ts",
31
+ "import": "./dist/ai-provider-runtime.js"
32
+ }
33
+ },
34
+ "dependencies": {
35
+ "@google/generative-ai": "^0.24.1"
36
+ },
37
+ "peerDependencies": {
38
+ "@workglow/ai": "0.2.28",
39
+ "@workglow/ai-provider": "0.2.28",
40
+ "@workglow/job-queue": "0.2.28",
41
+ "@workglow/storage": "0.2.28",
42
+ "@workglow/task-graph": "0.2.28",
43
+ "@workglow/util": "0.2.28"
44
+ },
45
+ "devDependencies": {
46
+ "@workglow/ai": "0.2.28",
47
+ "@workglow/ai-provider": "0.2.28",
48
+ "@workglow/job-queue": "0.2.28",
49
+ "@workglow/storage": "0.2.28",
50
+ "@workglow/task-graph": "0.2.28",
51
+ "@workglow/util": "0.2.28"
52
+ },
53
+ "files": [
54
+ "dist",
55
+ "src/**/*.md"
56
+ ],
57
+ "publishConfig": {
58
+ "access": "public"
59
+ }
60
+ }