@ainetwork/adk-provider-model-gemini 0.5.1 → 0.6.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import { BaseModel, ModelFetchOptions } from \"@ainetwork/adk/modules\";\nimport { MessageObject, MessageRole, type ThreadObject } from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport type {\n\tFetchResponse,\n\tToolCall,\n\tConnectorTool,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\ttype FunctionDeclaration,\n\tFunctionCallingConfigMode,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\tModel,\n} from \"@google/genai\";\n\nexport class GeminiModel extends BaseModel<Content, FunctionDeclaration> {\n\tprivate client: GoogleGenAI;\n\tprivate modelName: string;\n\n\tconstructor(apiKey: string, modelName: string) {\n\t\tsuper();\n\t\tthis.client = new GoogleGenAI({ apiKey });\n\t\tthis.modelName = modelName;\n\t}\n\n\tprivate getMessageRole(role: MessageRole) {\n\t\tswitch (role) {\n\t\t\tcase MessageRole.USER:\n\t\t\t\treturn \"user\";\n\t\t\tcase MessageRole.MODEL:\n\t\t\tcase MessageRole.SYSTEM:\n\t\t\t\treturn \"model\";\n\t\t\tdefault:\n\t\t\t\treturn \"model\"; /*FIXME*/\n\t\t}\n\t}\n\n\tgenerateMessages(params: {\n\t\tquery: string;\n\t\tthread?: ThreadObject;\n\t\tsystemPrompt?: string;\n\t}): Content[] {\n\t\tconst { query, thread, systemPrompt } = params;\n\t\tconst messages: Content[] = !systemPrompt\n\t\t\t? []\n\t\t\t: [{ role: \"model\", parts: [{ text: systemPrompt.trim() }] }];\n\t\tconst sessionContent: Content[] = !thread\n\t\t\t? []\n\t\t\t: thread.messages.map((message: MessageObject) => {\n\t\t\t\t\t// TODO: check message.content.type\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: this.getMessageRole(message.role),\n\t\t\t\t\t\tparts: [{ text: message.content.parts[0] }],\n\t\t\t\t\t};\n\t\t\t\t});\n\t\tconst userContent: Content = { role: \"user\", parts: [{ text: query }] };\n\t\treturn messages.concat(sessionContent).concat(userContent);\n\t}\n\n\tappendMessages(messages: Content[], message: string): void {\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [{ text: message }],\n\t\t});\n\t}\n\n\tasync fetch(messages: Content[], options?: ModelFetchOptions): Promise<FetchResponse> {\n\t\tconst response = await this.client.models.generateContent({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t});\n\n\t\treturn { content: response.text };\n\t}\n\n\tasync fetchWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<FetchResponse> {\n\t\tif (functions.length > 0) {\n\t\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\t\tconst response = await this.client.models.generateContent({\n\t\t\t\tmodel: this.modelName,\n\t\t\t\tcontents: messages,\n\t\t\t\tconfig: {\n\t\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\t\ttoolConfig: {\n\t\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst { text, functionCalls } = response;\n\t\t\tconst hasName = (\n\t\t\t\tvalue: FunctionCall,\n\t\t\t): value is FunctionCall & { name: string } => {\n\t\t\t\treturn value.name !== undefined;\n\t\t\t};\n\t\t\tconst toolCalls: ToolCall[] | undefined = functionCalls\n\t\t\t\t?.filter(hasName)\n\t\t\t\t.map((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targuments: value.args,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\ttoolCalls,\n\t\t\t};\n\t\t}\n\t\treturn await this.fetch(messages);\n\t}\n\n\tasync fetchStreamWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<LLMStream> {\n\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\tconst stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: {\n\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\ttoolConfig: {\n\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn this.createGeminiStreamAdapter(stream);\n\t}\n\n\t// NOTE(yoojin): Need to switch API Stream type to LLMStream.\n\tprivate createGeminiStreamAdapter(\n\t\tgeminiStream: AsyncIterable<GenerateContentResponse>,\n\t): LLMStream {\n\t\tconst hasName = (\n\t\t\tvalue: FunctionCall,\n\t\t): value is FunctionCall & { name: string } => {\n\t\t\treturn value.name !== undefined;\n\t\t};\n\n\t\treturn {\n\t\t\tasync *[Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n\t\t\t\tlet toolCallIndex = 0;\n\t\t\t\tfor await (const geminiChunk of geminiStream) {\n\t\t\t\t\tconst content = geminiChunk.candidates?.[0]?.content;\n\t\t\t\t\tif (!content) continue;\n\n\t\t\t\t\tconst tool_calls: ToolCallDelta[] = [];\n\t\t\t\t\tlet textContent = \"\";\n\n\t\t\t\t\t// Process all parts in the array\n\t\t\t\t\tfor (const part of content.parts || []) {\n\t\t\t\t\t\tif (part.text) {\n\t\t\t\t\t\t\ttextContent += part.text;\n\t\t\t\t\t\t} else if (part.functionCall && hasName(part.functionCall)) {\n\t\t\t\t\t\t\ttool_calls.push({\n\t\t\t\t\t\t\t\tindex: toolCallIndex++,\n\t\t\t\t\t\t\t\tid: part.functionCall.id || `call_${toolCallIndex}`,\n\t\t\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t\t\tname: part.functionCall.name,\n\t\t\t\t\t\t\t\t\targuments: JSON.stringify(part.functionCall.args),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as unknown as ToolCallDelta);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there's text content\n\t\t\t\t\tif (textContent) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\ttool_calls: undefined,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there are tool calls\n\t\t\t\t\tif (tool_calls.length > 0) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: undefined,\n\t\t\t\t\t\t\t\ttool_calls,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tconvertToolsToFunctions(tools: ConnectorTool[]): FunctionDeclaration[] {\n\t\tconst functions: FunctionDeclaration[] = [];\n\t\tfor (const tool of tools) {\n\t\t\tfunctions.push({\n\t\t\t\tname: tool.toolName,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparametersJsonSchema: tool.inputSchema,\n\t\t\t});\n\t\t}\n\t\treturn functions;\n\t}\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import { BaseModel, ModelFetchOptions } from \"@ainetwork/adk/modules\";\nimport { MessageObject, MessageRole, type ThreadObject } from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport type {\n\tFetchResponse,\n\tToolCall,\n\tConnectorTool,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\ttype FunctionDeclaration,\n\tFunctionCallingConfigMode,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\tModel,\n} from \"@google/genai\";\n\nexport class GeminiModel extends BaseModel<Content, FunctionDeclaration> {\n\tprivate client: GoogleGenAI;\n\tprivate modelName: string;\n\n\tconstructor(apiKey: string, modelName: string) {\n\t\tsuper();\n\t\tthis.client = new GoogleGenAI({ apiKey });\n\t\tthis.modelName = modelName;\n\t}\n\n\tprivate getMessageRole(role: MessageRole) {\n\t\tswitch (role) {\n\t\t\tcase MessageRole.USER:\n\t\t\t\treturn \"user\";\n\t\t\tcase MessageRole.MODEL:\n\t\t\tcase MessageRole.SYSTEM:\n\t\t\t\treturn \"model\";\n\t\t\tdefault:\n\t\t\t\treturn \"model\"; /*FIXME*/\n\t\t}\n\t}\n\n\tgenerateMessages(params: {\n\t\tquery: string;\n\t\tthread?: ThreadObject;\n\t\tsystemPrompt?: string;\n\t}): Content[] {\n\t\tconst { query, thread, systemPrompt } = params;\n\t\tconst messages: Content[] = !systemPrompt\n\t\t\t? []\n\t\t\t: [{ role: \"model\", parts: [{ text: systemPrompt.trim() }] }];\n\t\tconst sessionContent: Content[] = !thread\n\t\t\t? []\n\t\t\t: thread.messages.map((message: MessageObject) => {\n\t\t\t\t\t// TODO: check message.content.type\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: this.getMessageRole(message.role),\n\t\t\t\t\t\tparts: [{ text: message.content.parts[0] as string }],\n\t\t\t\t\t};\n\t\t\t\t});\n\t\tconst userContent: Content = { role: \"user\", parts: [{ text: query }] };\n\t\treturn messages.concat(sessionContent).concat(userContent);\n\t}\n\n\tappendMessages(messages: Content[], message: string): void {\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [{ text: message }],\n\t\t});\n\t}\n\n\tasync fetch(messages: Content[], options?: ModelFetchOptions): Promise<FetchResponse> {\n\t\tconst response = await this.client.models.generateContent({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t});\n\n\t\treturn { content: response.text };\n\t}\n\n\tasync fetchWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<FetchResponse> {\n\t\tif (functions.length > 0) {\n\t\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\t\tconst response = await this.client.models.generateContent({\n\t\t\t\tmodel: this.modelName,\n\t\t\t\tcontents: messages,\n\t\t\t\tconfig: {\n\t\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\t\ttoolConfig: {\n\t\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst { text, functionCalls } = response;\n\t\t\tconst hasName = (\n\t\t\t\tvalue: FunctionCall,\n\t\t\t): value is FunctionCall & { name: string } => {\n\t\t\t\treturn value.name !== undefined;\n\t\t\t};\n\t\t\tconst toolCalls: ToolCall[] | undefined = functionCalls\n\t\t\t\t?.filter(hasName)\n\t\t\t\t.map((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targuments: value.args,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\ttoolCalls,\n\t\t\t};\n\t\t}\n\t\treturn await this.fetch(messages);\n\t}\n\n\tasync fetchStreamWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<LLMStream> {\n\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\tconst stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: {\n\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\ttoolConfig: {\n\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn this.createGeminiStreamAdapter(stream);\n\t}\n\n\t// NOTE(yoojin): Need to switch API Stream type to LLMStream.\n\tprivate createGeminiStreamAdapter(\n\t\tgeminiStream: AsyncIterable<GenerateContentResponse>,\n\t): LLMStream {\n\t\tconst hasName = (\n\t\t\tvalue: FunctionCall,\n\t\t): value is FunctionCall & { name: string } => {\n\t\t\treturn value.name !== undefined;\n\t\t};\n\n\t\treturn {\n\t\t\tasync *[Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n\t\t\t\tlet toolCallIndex = 0;\n\t\t\t\tfor await (const geminiChunk of geminiStream) {\n\t\t\t\t\tconst content = geminiChunk.candidates?.[0]?.content;\n\t\t\t\t\tif (!content) continue;\n\n\t\t\t\t\tconst tool_calls: ToolCallDelta[] = [];\n\t\t\t\t\tlet textContent = \"\";\n\n\t\t\t\t\t// Process all parts in the array\n\t\t\t\t\tfor (const part of content.parts || []) {\n\t\t\t\t\t\tif (part.text) {\n\t\t\t\t\t\t\ttextContent += part.text;\n\t\t\t\t\t\t} else if (part.functionCall && hasName(part.functionCall)) {\n\t\t\t\t\t\t\ttool_calls.push({\n\t\t\t\t\t\t\t\tindex: toolCallIndex++,\n\t\t\t\t\t\t\t\tid: part.functionCall.id || `call_${toolCallIndex}`,\n\t\t\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t\t\tname: part.functionCall.name,\n\t\t\t\t\t\t\t\t\targuments: JSON.stringify(part.functionCall.args),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as unknown as ToolCallDelta);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there's text content\n\t\t\t\t\tif (textContent) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\ttool_calls: undefined,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there are tool calls\n\t\t\t\t\tif (tool_calls.length > 0) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: undefined,\n\t\t\t\t\t\t\t\ttool_calls,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tconvertToolsToFunctions(tools: ConnectorTool[]): FunctionDeclaration[] {\n\t\tconst functions: FunctionDeclaration[] = [];\n\t\tfor (const tool of tools) {\n\t\t\tfunctions.push({\n\t\t\t\tname: tool.toolName,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparametersJsonSchema: tool.inputSchema,\n\t\t\t});\n\t\t}\n\t\treturn functions;\n\t}\n}\n"],"mappings":"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","names":[]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import { BaseModel, ModelFetchOptions } from \"@ainetwork/adk/modules\";\nimport { MessageObject, MessageRole, type ThreadObject } from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport type {\n\tFetchResponse,\n\tToolCall,\n\tConnectorTool,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\ttype FunctionDeclaration,\n\tFunctionCallingConfigMode,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\tModel,\n} from \"@google/genai\";\n\nexport class GeminiModel extends BaseModel<Content, FunctionDeclaration> {\n\tprivate client: GoogleGenAI;\n\tprivate modelName: string;\n\n\tconstructor(apiKey: string, modelName: string) {\n\t\tsuper();\n\t\tthis.client = new GoogleGenAI({ apiKey });\n\t\tthis.modelName = modelName;\n\t}\n\n\tprivate getMessageRole(role: MessageRole) {\n\t\tswitch (role) {\n\t\t\tcase MessageRole.USER:\n\t\t\t\treturn \"user\";\n\t\t\tcase MessageRole.MODEL:\n\t\t\tcase MessageRole.SYSTEM:\n\t\t\t\treturn \"model\";\n\t\t\tdefault:\n\t\t\t\treturn \"model\"; /*FIXME*/\n\t\t}\n\t}\n\n\tgenerateMessages(params: {\n\t\tquery: string;\n\t\tthread?: ThreadObject;\n\t\tsystemPrompt?: string;\n\t}): Content[] {\n\t\tconst { query, thread, systemPrompt } = params;\n\t\tconst messages: Content[] = !systemPrompt\n\t\t\t? []\n\t\t\t: [{ role: \"model\", parts: [{ text: systemPrompt.trim() }] }];\n\t\tconst sessionContent: Content[] = !thread\n\t\t\t? []\n\t\t\t: thread.messages.map((message: MessageObject) => {\n\t\t\t\t\t// TODO: check message.content.type\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: this.getMessageRole(message.role),\n\t\t\t\t\t\tparts: [{ text: message.content.parts[0] }],\n\t\t\t\t\t};\n\t\t\t\t});\n\t\tconst userContent: Content = { role: \"user\", parts: [{ text: query }] };\n\t\treturn messages.concat(sessionContent).concat(userContent);\n\t}\n\n\tappendMessages(messages: Content[], message: string): void {\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [{ text: message }],\n\t\t});\n\t}\n\n\tasync fetch(messages: Content[], options?: ModelFetchOptions): Promise<FetchResponse> {\n\t\tconst response = await this.client.models.generateContent({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t});\n\n\t\treturn { content: response.text };\n\t}\n\n\tasync fetchWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<FetchResponse> {\n\t\tif (functions.length > 0) {\n\t\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\t\tconst response = await this.client.models.generateContent({\n\t\t\t\tmodel: this.modelName,\n\t\t\t\tcontents: messages,\n\t\t\t\tconfig: {\n\t\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\t\ttoolConfig: {\n\t\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst { text, functionCalls } = response;\n\t\t\tconst hasName = (\n\t\t\t\tvalue: FunctionCall,\n\t\t\t): value is FunctionCall & { name: string } => {\n\t\t\t\treturn value.name !== undefined;\n\t\t\t};\n\t\t\tconst toolCalls: ToolCall[] | undefined = functionCalls\n\t\t\t\t?.filter(hasName)\n\t\t\t\t.map((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targuments: value.args,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\ttoolCalls,\n\t\t\t};\n\t\t}\n\t\treturn await this.fetch(messages);\n\t}\n\n\tasync fetchStreamWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<LLMStream> {\n\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\tconst stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: {\n\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\ttoolConfig: {\n\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn this.createGeminiStreamAdapter(stream);\n\t}\n\n\t// NOTE(yoojin): Need to switch API Stream type to LLMStream.\n\tprivate createGeminiStreamAdapter(\n\t\tgeminiStream: AsyncIterable<GenerateContentResponse>,\n\t): LLMStream {\n\t\tconst hasName = (\n\t\t\tvalue: FunctionCall,\n\t\t): value is FunctionCall & { name: string } => {\n\t\t\treturn value.name !== undefined;\n\t\t};\n\n\t\treturn {\n\t\t\tasync *[Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n\t\t\t\tlet toolCallIndex = 0;\n\t\t\t\tfor await (const geminiChunk of geminiStream) {\n\t\t\t\t\tconst content = geminiChunk.candidates?.[0]?.content;\n\t\t\t\t\tif (!content) continue;\n\n\t\t\t\t\tconst tool_calls: ToolCallDelta[] = [];\n\t\t\t\t\tlet textContent = \"\";\n\n\t\t\t\t\t// Process all parts in the array\n\t\t\t\t\tfor (const part of content.parts || []) {\n\t\t\t\t\t\tif (part.text) {\n\t\t\t\t\t\t\ttextContent += part.text;\n\t\t\t\t\t\t} else if (part.functionCall && hasName(part.functionCall)) {\n\t\t\t\t\t\t\ttool_calls.push({\n\t\t\t\t\t\t\t\tindex: toolCallIndex++,\n\t\t\t\t\t\t\t\tid: part.functionCall.id || `call_${toolCallIndex}`,\n\t\t\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t\t\tname: part.functionCall.name,\n\t\t\t\t\t\t\t\t\targuments: JSON.stringify(part.functionCall.args),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as unknown as ToolCallDelta);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there's text content\n\t\t\t\t\tif (textContent) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\ttool_calls: undefined,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there are tool calls\n\t\t\t\t\tif (tool_calls.length > 0) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: undefined,\n\t\t\t\t\t\t\t\ttool_calls,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tconvertToolsToFunctions(tools: ConnectorTool[]): FunctionDeclaration[] {\n\t\tconst functions: FunctionDeclaration[] = [];\n\t\tfor (const tool of tools) {\n\t\t\tfunctions.push({\n\t\t\t\tname: tool.toolName,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparametersJsonSchema: tool.inputSchema,\n\t\t\t});\n\t\t}\n\t\treturn functions;\n\t}\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import { BaseModel, ModelFetchOptions } from \"@ainetwork/adk/modules\";\nimport { MessageObject, MessageRole, type ThreadObject } from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport type {\n\tFetchResponse,\n\tToolCall,\n\tConnectorTool,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\ttype FunctionDeclaration,\n\tFunctionCallingConfigMode,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\tModel,\n} from \"@google/genai\";\n\nexport class GeminiModel extends BaseModel<Content, FunctionDeclaration> {\n\tprivate client: GoogleGenAI;\n\tprivate modelName: string;\n\n\tconstructor(apiKey: string, modelName: string) {\n\t\tsuper();\n\t\tthis.client = new GoogleGenAI({ apiKey });\n\t\tthis.modelName = modelName;\n\t}\n\n\tprivate getMessageRole(role: MessageRole) {\n\t\tswitch (role) {\n\t\t\tcase MessageRole.USER:\n\t\t\t\treturn \"user\";\n\t\t\tcase MessageRole.MODEL:\n\t\t\tcase MessageRole.SYSTEM:\n\t\t\t\treturn \"model\";\n\t\t\tdefault:\n\t\t\t\treturn \"model\"; /*FIXME*/\n\t\t}\n\t}\n\n\tgenerateMessages(params: {\n\t\tquery: string;\n\t\tthread?: ThreadObject;\n\t\tsystemPrompt?: string;\n\t}): Content[] {\n\t\tconst { query, thread, systemPrompt } = params;\n\t\tconst messages: Content[] = !systemPrompt\n\t\t\t? []\n\t\t\t: [{ role: \"model\", parts: [{ text: systemPrompt.trim() }] }];\n\t\tconst sessionContent: Content[] = !thread\n\t\t\t? []\n\t\t\t: thread.messages.map((message: MessageObject) => {\n\t\t\t\t\t// TODO: check message.content.type\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: this.getMessageRole(message.role),\n\t\t\t\t\t\tparts: [{ text: message.content.parts[0] as string }],\n\t\t\t\t\t};\n\t\t\t\t});\n\t\tconst userContent: Content = { role: \"user\", parts: [{ text: query }] };\n\t\treturn messages.concat(sessionContent).concat(userContent);\n\t}\n\n\tappendMessages(messages: Content[], message: string): void {\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [{ text: message }],\n\t\t});\n\t}\n\n\tasync fetch(messages: Content[], options?: ModelFetchOptions): Promise<FetchResponse> {\n\t\tconst response = await this.client.models.generateContent({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t});\n\n\t\treturn { content: response.text };\n\t}\n\n\tasync fetchWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<FetchResponse> {\n\t\tif (functions.length > 0) {\n\t\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\t\tconst response = await this.client.models.generateContent({\n\t\t\t\tmodel: this.modelName,\n\t\t\t\tcontents: messages,\n\t\t\t\tconfig: {\n\t\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\t\ttoolConfig: {\n\t\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst { text, functionCalls } = response;\n\t\t\tconst hasName = (\n\t\t\t\tvalue: FunctionCall,\n\t\t\t): value is FunctionCall & { name: string } => {\n\t\t\t\treturn value.name !== undefined;\n\t\t\t};\n\t\t\tconst toolCalls: ToolCall[] | undefined = functionCalls\n\t\t\t\t?.filter(hasName)\n\t\t\t\t.map((value) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targuments: value.args,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\ttoolCalls,\n\t\t\t};\n\t\t}\n\t\treturn await this.fetch(messages);\n\t}\n\n\tasync fetchStreamWithContextMessage(\n\t\tmessages: Content[],\n\t\tfunctions: FunctionDeclaration[],\n\t\toptions?: ModelFetchOptions,\n\t): Promise<LLMStream> {\n\t\tconst toolChoiceMode = options?.toolChoice === \"required\"\n\t\t\t? FunctionCallingConfigMode.ANY\n\t\t\t: FunctionCallingConfigMode.AUTO;\n\t\tconst stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: {\n\t\t\t\ttools: [{ functionDeclarations: functions }],\n\t\t\t\ttoolConfig: {\n\t\t\t\t\tfunctionCallingConfig: { mode: toolChoiceMode },\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn this.createGeminiStreamAdapter(stream);\n\t}\n\n\t// NOTE(yoojin): Need to switch API Stream type to LLMStream.\n\tprivate createGeminiStreamAdapter(\n\t\tgeminiStream: AsyncIterable<GenerateContentResponse>,\n\t): LLMStream {\n\t\tconst hasName = (\n\t\t\tvalue: FunctionCall,\n\t\t): value is FunctionCall & { name: string } => {\n\t\t\treturn value.name !== undefined;\n\t\t};\n\n\t\treturn {\n\t\t\tasync *[Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n\t\t\t\tlet toolCallIndex = 0;\n\t\t\t\tfor await (const geminiChunk of geminiStream) {\n\t\t\t\t\tconst content = geminiChunk.candidates?.[0]?.content;\n\t\t\t\t\tif (!content) continue;\n\n\t\t\t\t\tconst tool_calls: ToolCallDelta[] = [];\n\t\t\t\t\tlet textContent = \"\";\n\n\t\t\t\t\t// Process all parts in the array\n\t\t\t\t\tfor (const part of content.parts || []) {\n\t\t\t\t\t\tif (part.text) {\n\t\t\t\t\t\t\ttextContent += part.text;\n\t\t\t\t\t\t} else if (part.functionCall && hasName(part.functionCall)) {\n\t\t\t\t\t\t\ttool_calls.push({\n\t\t\t\t\t\t\t\tindex: toolCallIndex++,\n\t\t\t\t\t\t\t\tid: part.functionCall.id || `call_${toolCallIndex}`,\n\t\t\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t\t\tname: part.functionCall.name,\n\t\t\t\t\t\t\t\t\targuments: JSON.stringify(part.functionCall.args),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as unknown as ToolCallDelta);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there's text content\n\t\t\t\t\tif (textContent) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\ttool_calls: undefined,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only yield when there are tool calls\n\t\t\t\t\tif (tool_calls.length > 0) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\trole: content.role,\n\t\t\t\t\t\t\t\tcontent: undefined,\n\t\t\t\t\t\t\t\ttool_calls,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfinish_reason: geminiChunk.candidates?.[0]?.finishReason as any,\n\t\t\t\t\t\t\tmetadata: { provider: \"gemini\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tconvertToolsToFunctions(tools: ConnectorTool[]): FunctionDeclaration[] {\n\t\tconst functions: FunctionDeclaration[] = [];\n\t\tfor (const tool of tools) {\n\t\t\tfunctions.push({\n\t\t\t\tname: tool.toolName,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tparametersJsonSchema: tool.inputSchema,\n\t\t\t});\n\t\t}\n\t\treturn functions;\n\t}\n}\n"],"mappings":"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","names":[]}
package/index.ts CHANGED
@@ -57,7 +57,7 @@ export class GeminiModel extends BaseModel<Content, FunctionDeclaration> {
57
57
  // TODO: check message.content.type
58
58
  return {
59
59
  role: this.getMessageRole(message.role),
60
- parts: [{ text: message.content.parts[0] }],
60
+ parts: [{ text: message.content.parts[0] as string }],
61
61
  };
62
62
  });
63
63
  const userContent: Content = { role: "user", parts: [{ text: query }] };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ainetwork/adk-provider-model-gemini",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "author": "AI Network (https://ainetwork.ai)",
5
5
  "type": "module",
6
6
  "engines": {
@@ -24,7 +24,7 @@
24
24
  "@google/genai": "^1.11.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "@ainetwork/adk": "^0.5.0"
27
+ "@ainetwork/adk": "^0.6.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "typescript": "^5.0.0"
@@ -33,5 +33,5 @@
33
33
  "publishConfig": {
34
34
  "access": "public"
35
35
  },
36
- "gitHead": "195536a123f1471afc0974adf1671eb63296f469"
36
+ "gitHead": "e3e922e5b932ce07902d0ad5b3460a22aae23960"
37
37
  }