@ainetwork/adk-provider-model-gemini 0.7.1 → 0.7.2

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 CHANGED
@@ -49,9 +49,10 @@ var GeminiModel = class extends import_modules.BaseModel {
49
49
  const { query, thread, systemPrompt } = params;
50
50
  const messages = !systemPrompt ? [] : [{ role: "model", parts: [{ text: systemPrompt.trim() }] }];
51
51
  const sessionContent = !thread ? [] : thread.messages.map((message) => {
52
+ const text = typeof message.metadata?.query === "string" ? message.metadata.query : message.content.parts[0];
52
53
  return {
53
54
  role: this.getMessageRole(message.role),
54
- parts: [{ text: message.content.parts[0] }]
55
+ parts: [{ text }]
55
56
  };
56
57
  });
57
58
  const userContent = { role: "user", parts: [{ text: query }] };
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import {\n\ttype AssistantToolCallTurn,\n\tBaseModel,\n\ttype ModelFetchOptions,\n\ttype ToolResultMessage,\n} from \"@ainetwork/adk/modules\";\nimport type {\n\tConnectorTool,\n\tFetchResponse,\n\tToolCall,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n} from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\tFunctionCallingConfigMode,\n\ttype FunctionDeclaration,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\ttype Part,\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\tappendAssistantToolCallTurn(\n\t\tmessages: Content[],\n\t\tturn: AssistantToolCallTurn,\n\t): void {\n\t\tconst parts: Part[] = [];\n\t\tif (turn.content) {\n\t\t\tparts.push({ text: turn.content });\n\t\t}\n\t\tfor (const tc of turn.toolCalls) {\n\t\t\tlet args: Record<string, unknown> = {};\n\t\t\ttry {\n\t\t\t\targs = JSON.parse(tc.function.arguments || \"{}\");\n\t\t\t} catch {\n\t\t\t\t// Forward the raw argument string so the model can self-correct.\n\t\t\t\targs = { __raw: tc.function.arguments };\n\t\t\t}\n\t\t\tparts.push({\n\t\t\t\tfunctionCall: {\n\t\t\t\t\tid: tc.id,\n\t\t\t\t\tname: tc.function.name,\n\t\t\t\t\targs,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tmessages.push({ role: \"model\", parts });\n\t}\n\n\tappendToolResult(messages: Content[], result: ToolResultMessage): void {\n\t\tconst response: Record<string, unknown> = result.isError\n\t\t\t? { error: result.content }\n\t\t\t: { output: result.content };\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [\n\t\t\t\t{\n\t\t\t\t\tfunctionResponse: {\n\t\t\t\t\t\tid: result.toolCallId,\n\t\t\t\t\t\tname: result.toolName,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tasync fetch(\n\t\tmessages: Content[],\n\t\toptions?: ModelFetchOptions,\n\t): 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 =\n\t\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 =\n\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 {\n\ttype AssistantToolCallTurn,\n\tBaseModel,\n\ttype ModelFetchOptions,\n\ttype ToolResultMessage,\n} from \"@ainetwork/adk/modules\";\nimport type {\n\tConnectorTool,\n\tFetchResponse,\n\tToolCall,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n} from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\tFunctionCallingConfigMode,\n\ttype FunctionDeclaration,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\ttype Part,\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\t// Prefer the real query stashed in metadata when a display text was\n\t\t\t\t\t// shown in its place (displayQuery), so multi-turn history carries\n\t\t\t\t\t// the actual query the model saw on the first turn — not the short\n\t\t\t\t\t// label. Falls back to the stored content otherwise.\n\t\t\t\t\tconst text =\n\t\t\t\t\t\ttypeof message.metadata?.query === \"string\"\n\t\t\t\t\t\t\t? message.metadata.query\n\t\t\t\t\t\t\t: (message.content.parts[0] as string);\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 }],\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\tappendAssistantToolCallTurn(\n\t\tmessages: Content[],\n\t\tturn: AssistantToolCallTurn,\n\t): void {\n\t\tconst parts: Part[] = [];\n\t\tif (turn.content) {\n\t\t\tparts.push({ text: turn.content });\n\t\t}\n\t\tfor (const tc of turn.toolCalls) {\n\t\t\tlet args: Record<string, unknown> = {};\n\t\t\ttry {\n\t\t\t\targs = JSON.parse(tc.function.arguments || \"{}\");\n\t\t\t} catch {\n\t\t\t\t// Forward the raw argument string so the model can self-correct.\n\t\t\t\targs = { __raw: tc.function.arguments };\n\t\t\t}\n\t\t\tparts.push({\n\t\t\t\tfunctionCall: {\n\t\t\t\t\tid: tc.id,\n\t\t\t\t\tname: tc.function.name,\n\t\t\t\t\targs,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tmessages.push({ role: \"model\", parts });\n\t}\n\n\tappendToolResult(messages: Content[], result: ToolResultMessage): void {\n\t\tconst response: Record<string, unknown> = result.isError\n\t\t\t? { error: result.content }\n\t\t\t: { output: result.content };\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [\n\t\t\t\t{\n\t\t\t\t\tfunctionResponse: {\n\t\t\t\t\t\tid: result.toolCallId,\n\t\t\t\t\t\tname: result.toolName,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tasync fetch(\n\t\tmessages: Content[],\n\t\toptions?: ModelFetchOptions,\n\t): 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 =\n\t\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 =\n\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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
@@ -32,9 +32,10 @@ var GeminiModel = class extends BaseModel {
32
32
  const { query, thread, systemPrompt } = params;
33
33
  const messages = !systemPrompt ? [] : [{ role: "model", parts: [{ text: systemPrompt.trim() }] }];
34
34
  const sessionContent = !thread ? [] : thread.messages.map((message) => {
35
+ const text = typeof message.metadata?.query === "string" ? message.metadata.query : message.content.parts[0];
35
36
  return {
36
37
  role: this.getMessageRole(message.role),
37
- parts: [{ text: message.content.parts[0] }]
38
+ parts: [{ text }]
38
39
  };
39
40
  });
40
41
  const userContent = { role: "user", parts: [{ text: query }] };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import {\n\ttype AssistantToolCallTurn,\n\tBaseModel,\n\ttype ModelFetchOptions,\n\ttype ToolResultMessage,\n} from \"@ainetwork/adk/modules\";\nimport type {\n\tConnectorTool,\n\tFetchResponse,\n\tToolCall,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n} from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\tFunctionCallingConfigMode,\n\ttype FunctionDeclaration,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\ttype Part,\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\tappendAssistantToolCallTurn(\n\t\tmessages: Content[],\n\t\tturn: AssistantToolCallTurn,\n\t): void {\n\t\tconst parts: Part[] = [];\n\t\tif (turn.content) {\n\t\t\tparts.push({ text: turn.content });\n\t\t}\n\t\tfor (const tc of turn.toolCalls) {\n\t\t\tlet args: Record<string, unknown> = {};\n\t\t\ttry {\n\t\t\t\targs = JSON.parse(tc.function.arguments || \"{}\");\n\t\t\t} catch {\n\t\t\t\t// Forward the raw argument string so the model can self-correct.\n\t\t\t\targs = { __raw: tc.function.arguments };\n\t\t\t}\n\t\t\tparts.push({\n\t\t\t\tfunctionCall: {\n\t\t\t\t\tid: tc.id,\n\t\t\t\t\tname: tc.function.name,\n\t\t\t\t\targs,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tmessages.push({ role: \"model\", parts });\n\t}\n\n\tappendToolResult(messages: Content[], result: ToolResultMessage): void {\n\t\tconst response: Record<string, unknown> = result.isError\n\t\t\t? { error: result.content }\n\t\t\t: { output: result.content };\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [\n\t\t\t\t{\n\t\t\t\t\tfunctionResponse: {\n\t\t\t\t\t\tid: result.toolCallId,\n\t\t\t\t\t\tname: result.toolName,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tasync fetch(\n\t\tmessages: Content[],\n\t\toptions?: ModelFetchOptions,\n\t): 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 =\n\t\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 =\n\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 {\n\ttype AssistantToolCallTurn,\n\tBaseModel,\n\ttype ModelFetchOptions,\n\ttype ToolResultMessage,\n} from \"@ainetwork/adk/modules\";\nimport type {\n\tConnectorTool,\n\tFetchResponse,\n\tToolCall,\n} from \"@ainetwork/adk/types/connector\";\nimport {\n\ttype MessageObject,\n\tMessageRole,\n\ttype ThreadObject,\n} from \"@ainetwork/adk/types/memory\";\nimport type {\n\tLLMStream,\n\tStreamChunk,\n\tToolCallDelta,\n} from \"@ainetwork/adk/types/stream\";\nimport {\n\ttype Content,\n\ttype FunctionCall,\n\tFunctionCallingConfigMode,\n\ttype FunctionDeclaration,\n\ttype GenerateContentResponse,\n\tGoogleGenAI,\n\ttype Part,\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\t// Prefer the real query stashed in metadata when a display text was\n\t\t\t\t\t// shown in its place (displayQuery), so multi-turn history carries\n\t\t\t\t\t// the actual query the model saw on the first turn — not the short\n\t\t\t\t\t// label. Falls back to the stored content otherwise.\n\t\t\t\t\tconst text =\n\t\t\t\t\t\ttypeof message.metadata?.query === \"string\"\n\t\t\t\t\t\t\t? message.metadata.query\n\t\t\t\t\t\t\t: (message.content.parts[0] as string);\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 }],\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\tappendAssistantToolCallTurn(\n\t\tmessages: Content[],\n\t\tturn: AssistantToolCallTurn,\n\t): void {\n\t\tconst parts: Part[] = [];\n\t\tif (turn.content) {\n\t\t\tparts.push({ text: turn.content });\n\t\t}\n\t\tfor (const tc of turn.toolCalls) {\n\t\t\tlet args: Record<string, unknown> = {};\n\t\t\ttry {\n\t\t\t\targs = JSON.parse(tc.function.arguments || \"{}\");\n\t\t\t} catch {\n\t\t\t\t// Forward the raw argument string so the model can self-correct.\n\t\t\t\targs = { __raw: tc.function.arguments };\n\t\t\t}\n\t\t\tparts.push({\n\t\t\t\tfunctionCall: {\n\t\t\t\t\tid: tc.id,\n\t\t\t\t\tname: tc.function.name,\n\t\t\t\t\targs,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tmessages.push({ role: \"model\", parts });\n\t}\n\n\tappendToolResult(messages: Content[], result: ToolResultMessage): void {\n\t\tconst response: Record<string, unknown> = result.isError\n\t\t\t? { error: result.content }\n\t\t\t: { output: result.content };\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tparts: [\n\t\t\t\t{\n\t\t\t\t\tfunctionResponse: {\n\t\t\t\t\t\tid: result.toolCallId,\n\t\t\t\t\t\tname: result.toolName,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tasync fetch(\n\t\tmessages: Content[],\n\t\toptions?: ModelFetchOptions,\n\t): 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 =\n\t\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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 =\n\t\t\toptions?.toolChoice === \"required\"\n\t\t\t\t? FunctionCallingConfigMode.ANY\n\t\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
@@ -64,9 +64,17 @@ export class GeminiModel extends BaseModel<Content, FunctionDeclaration> {
64
64
  ? []
65
65
  : thread.messages.map((message: MessageObject) => {
66
66
  // TODO: check message.content.type
67
+ // Prefer the real query stashed in metadata when a display text was
68
+ // shown in its place (displayQuery), so multi-turn history carries
69
+ // the actual query the model saw on the first turn — not the short
70
+ // label. Falls back to the stored content otherwise.
71
+ const text =
72
+ typeof message.metadata?.query === "string"
73
+ ? message.metadata.query
74
+ : (message.content.parts[0] as string);
67
75
  return {
68
76
  role: this.getMessageRole(message.role),
69
- parts: [{ text: message.content.parts[0] as string }],
77
+ parts: [{ text }],
70
78
  };
71
79
  });
72
80
  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.7.1",
3
+ "version": "0.7.2",
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.7.1"
27
+ "@ainetwork/adk": "^0.7.2"
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": "b5988a3d1333127538f41a55cee36fc96632b69c"
36
+ "gitHead": "86a3b76c8d83193988b70a11abcae1f0c05aa1e9"
37
37
  }