@ainetwork/adk-provider-model-gemini 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +12 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/index.ts +16 -1
- package/package.json +5 -3
package/dist/index.cjs
CHANGED
|
@@ -72,11 +72,15 @@ var GeminiModel = class extends import_modules.BaseModel {
|
|
|
72
72
|
}
|
|
73
73
|
async fetchWithContextMessage(messages, functions, options) {
|
|
74
74
|
if (functions.length > 0) {
|
|
75
|
+
const toolChoiceMode = options?.toolChoice === "required" ? import_genai.FunctionCallingConfigMode.ANY : import_genai.FunctionCallingConfigMode.AUTO;
|
|
75
76
|
const response = await this.client.models.generateContent({
|
|
76
77
|
model: this.modelName,
|
|
77
78
|
contents: messages,
|
|
78
79
|
config: {
|
|
79
|
-
tools: [{ functionDeclarations: functions }]
|
|
80
|
+
tools: [{ functionDeclarations: functions }],
|
|
81
|
+
toolConfig: {
|
|
82
|
+
functionCallingConfig: { mode: toolChoiceMode }
|
|
83
|
+
}
|
|
80
84
|
}
|
|
81
85
|
});
|
|
82
86
|
const { text, functionCalls } = response;
|
|
@@ -97,10 +101,16 @@ var GeminiModel = class extends import_modules.BaseModel {
|
|
|
97
101
|
return await this.fetch(messages);
|
|
98
102
|
}
|
|
99
103
|
async fetchStreamWithContextMessage(messages, functions, options) {
|
|
104
|
+
const toolChoiceMode = options?.toolChoice === "required" ? import_genai.FunctionCallingConfigMode.ANY : import_genai.FunctionCallingConfigMode.AUTO;
|
|
100
105
|
const stream = await this.client.models.generateContentStream({
|
|
101
106
|
model: this.modelName,
|
|
102
107
|
contents: messages,
|
|
103
|
-
config: {
|
|
108
|
+
config: {
|
|
109
|
+
tools: [{ functionDeclarations: functions }],
|
|
110
|
+
toolConfig: {
|
|
111
|
+
functionCallingConfig: { mode: toolChoiceMode }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
104
114
|
});
|
|
105
115
|
return this.createGeminiStreamAdapter(stream);
|
|
106
116
|
}
|
package/dist/index.cjs.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\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 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},\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 stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: { tools: [{ functionDeclarations: functions }] },\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] }],\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
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { BaseModel } from "@ainetwork/adk/modules";
|
|
3
3
|
import { MessageRole } from "@ainetwork/adk/types/memory";
|
|
4
4
|
import {
|
|
5
|
+
FunctionCallingConfigMode,
|
|
5
6
|
GoogleGenAI
|
|
6
7
|
} from "@google/genai";
|
|
7
8
|
var GeminiModel = class extends BaseModel {
|
|
@@ -50,11 +51,15 @@ var GeminiModel = class extends BaseModel {
|
|
|
50
51
|
}
|
|
51
52
|
async fetchWithContextMessage(messages, functions, options) {
|
|
52
53
|
if (functions.length > 0) {
|
|
54
|
+
const toolChoiceMode = options?.toolChoice === "required" ? FunctionCallingConfigMode.ANY : FunctionCallingConfigMode.AUTO;
|
|
53
55
|
const response = await this.client.models.generateContent({
|
|
54
56
|
model: this.modelName,
|
|
55
57
|
contents: messages,
|
|
56
58
|
config: {
|
|
57
|
-
tools: [{ functionDeclarations: functions }]
|
|
59
|
+
tools: [{ functionDeclarations: functions }],
|
|
60
|
+
toolConfig: {
|
|
61
|
+
functionCallingConfig: { mode: toolChoiceMode }
|
|
62
|
+
}
|
|
58
63
|
}
|
|
59
64
|
});
|
|
60
65
|
const { text, functionCalls } = response;
|
|
@@ -75,10 +80,16 @@ var GeminiModel = class extends BaseModel {
|
|
|
75
80
|
return await this.fetch(messages);
|
|
76
81
|
}
|
|
77
82
|
async fetchStreamWithContextMessage(messages, functions, options) {
|
|
83
|
+
const toolChoiceMode = options?.toolChoice === "required" ? FunctionCallingConfigMode.ANY : FunctionCallingConfigMode.AUTO;
|
|
78
84
|
const stream = await this.client.models.generateContentStream({
|
|
79
85
|
model: this.modelName,
|
|
80
86
|
contents: messages,
|
|
81
|
-
config: {
|
|
87
|
+
config: {
|
|
88
|
+
tools: [{ functionDeclarations: functions }],
|
|
89
|
+
toolConfig: {
|
|
90
|
+
functionCallingConfig: { mode: toolChoiceMode }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
82
93
|
});
|
|
83
94
|
return this.createGeminiStreamAdapter(stream);
|
|
84
95
|
}
|
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\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 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},\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 stream = await this.client.models.generateContentStream({\n\t\t\tmodel: this.modelName,\n\t\t\tcontents: messages,\n\t\t\tconfig: { tools: [{ functionDeclarations: functions }] },\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] }],\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
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
type Content,
|
|
15
15
|
type FunctionCall,
|
|
16
16
|
type FunctionDeclaration,
|
|
17
|
+
FunctionCallingConfigMode,
|
|
17
18
|
type GenerateContentResponse,
|
|
18
19
|
GoogleGenAI,
|
|
19
20
|
Model,
|
|
@@ -85,11 +86,17 @@ export class GeminiModel extends BaseModel<Content, FunctionDeclaration> {
|
|
|
85
86
|
options?: ModelFetchOptions,
|
|
86
87
|
): Promise<FetchResponse> {
|
|
87
88
|
if (functions.length > 0) {
|
|
89
|
+
const toolChoiceMode = options?.toolChoice === "required"
|
|
90
|
+
? FunctionCallingConfigMode.ANY
|
|
91
|
+
: FunctionCallingConfigMode.AUTO;
|
|
88
92
|
const response = await this.client.models.generateContent({
|
|
89
93
|
model: this.modelName,
|
|
90
94
|
contents: messages,
|
|
91
95
|
config: {
|
|
92
96
|
tools: [{ functionDeclarations: functions }],
|
|
97
|
+
toolConfig: {
|
|
98
|
+
functionCallingConfig: { mode: toolChoiceMode },
|
|
99
|
+
},
|
|
93
100
|
},
|
|
94
101
|
});
|
|
95
102
|
|
|
@@ -121,10 +128,18 @@ export class GeminiModel extends BaseModel<Content, FunctionDeclaration> {
|
|
|
121
128
|
functions: FunctionDeclaration[],
|
|
122
129
|
options?: ModelFetchOptions,
|
|
123
130
|
): Promise<LLMStream> {
|
|
131
|
+
const toolChoiceMode = options?.toolChoice === "required"
|
|
132
|
+
? FunctionCallingConfigMode.ANY
|
|
133
|
+
: FunctionCallingConfigMode.AUTO;
|
|
124
134
|
const stream = await this.client.models.generateContentStream({
|
|
125
135
|
model: this.modelName,
|
|
126
136
|
contents: messages,
|
|
127
|
-
config: {
|
|
137
|
+
config: {
|
|
138
|
+
tools: [{ functionDeclarations: functions }],
|
|
139
|
+
toolConfig: {
|
|
140
|
+
functionCallingConfig: { mode: toolChoiceMode },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
128
143
|
});
|
|
129
144
|
|
|
130
145
|
return this.createGeminiStreamAdapter(stream);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainetwork/adk-provider-model-gemini",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"author": "AI Network (https://ainetwork.ai)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -21,9 +21,11 @@
|
|
|
21
21
|
"clean": "rm -rf dist"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@ainetwork/adk": "^0.5.0",
|
|
25
24
|
"@google/genai": "^1.11.0"
|
|
26
25
|
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@ainetwork/adk": "^0.5.0"
|
|
28
|
+
},
|
|
27
29
|
"devDependencies": {
|
|
28
30
|
"typescript": "^5.0.0"
|
|
29
31
|
},
|
|
@@ -31,5 +33,5 @@
|
|
|
31
33
|
"publishConfig": {
|
|
32
34
|
"access": "public"
|
|
33
35
|
},
|
|
34
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "195536a123f1471afc0974adf1671eb63296f469"
|
|
35
37
|
}
|