@directive-run/ai 1.4.0 → 1.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.
- package/dist/anthropic.cjs +1 -1
- package/dist/anthropic.cjs.map +1 -1
- package/dist/anthropic.js +1 -1
- package/dist/anthropic.js.map +1 -1
- package/dist/{chunk-265ZKXYE.js → chunk-3PGRBK4E.js} +2 -2
- package/dist/chunk-3PGRBK4E.js.map +1 -0
- package/dist/{chunk-QXMXSHYS.cjs → chunk-KP3G32S7.cjs} +2 -2
- package/dist/chunk-KP3G32S7.cjs.map +1 -0
- package/dist/{chunk-5ERCL33C.js → chunk-Q3PQLWBR.js} +3 -3
- package/dist/chunk-Q3PQLWBR.js.map +1 -0
- package/dist/{chunk-K2LZMRLN.js → chunk-RW4R3O5P.js} +3 -3
- package/dist/{chunk-K2LZMRLN.js.map → chunk-RW4R3O5P.js.map} +1 -1
- package/dist/{chunk-KALRDVN5.cjs → chunk-X3VQ5F7D.cjs} +3 -3
- package/dist/{chunk-KALRDVN5.cjs.map → chunk-X3VQ5F7D.cjs.map} +1 -1
- package/dist/{chunk-L35IQAWD.cjs → chunk-XV2QSBBE.cjs} +7 -7
- package/dist/chunk-XV2QSBBE.cjs.map +1 -0
- package/dist/gemini.cjs +1 -1
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.js +1 -1
- package/dist/gemini.js.map +1 -1
- package/dist/index.cjs +18 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -6
- package/dist/index.d.ts +50 -6
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/{multi-agent-orchestrator-675FR2HF.js → multi-agent-orchestrator-4PXNYRHB.js} +2 -2
- package/dist/{multi-agent-orchestrator-675FR2HF.js.map → multi-agent-orchestrator-4PXNYRHB.js.map} +1 -1
- package/dist/multi-agent-orchestrator-KFGTEGE5.cjs +2 -0
- package/dist/{multi-agent-orchestrator-SH5TRRS3.cjs.map → multi-agent-orchestrator-KFGTEGE5.cjs.map} +1 -1
- package/dist/ollama.cjs +2 -2
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.js +1 -1
- package/dist/ollama.js.map +1 -1
- package/dist/openai.cjs +1 -1
- package/dist/openai.cjs.map +1 -1
- package/dist/openai.js +1 -1
- package/dist/openai.js.map +1 -1
- package/dist/{orchestrator-types-BmvoZgfO.d.cts → orchestrator-types-Bh8r3_Sq.d.cts} +1 -1
- package/dist/{orchestrator-types-D6gzobwg.d.ts → orchestrator-types-CTfIKk0W.d.ts} +1 -1
- package/dist/testing.cjs +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-265ZKXYE.js.map +0 -1
- package/dist/chunk-5ERCL33C.js.map +0 -1
- package/dist/chunk-L35IQAWD.cjs.map +0 -1
- package/dist/chunk-QXMXSHYS.cjs.map +0 -1
- package/dist/multi-agent-orchestrator-SH5TRRS3.cjs +0 -2
package/dist/gemini.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/gemini.ts"],"names":["GEMINI_PRICING","createGeminiRunner","options","apiKey","model","maxOutputTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","genConfig","hasGenConfig","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createGeminiStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","textVal","meta","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"gemini.js","sourcesContent":["/**\n * @directive-run/ai/gemini\n *\n * Google Gemini adapter for Directive AI. Provides runners for the\n * Gemini generateContent API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createGeminiRunner, createGeminiStreamingRunner } from '@directive-run/ai/gemini';\n *\n * const runner = createGeminiRunner({ apiKey: process.env.GEMINI_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type {\n AdapterHooks,\n AgentRunner,\n} from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Gemini model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { GEMINI_PRICING } from '@directive-run/ai/gemini';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, GEMINI_PRICING[\"gemini-2.0-flash\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, GEMINI_PRICING[\"gemini-2.0-flash\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://ai.google.dev/pricing\n */\nexport const GEMINI_PRICING: Record<string, { input: number; output: number }> =\n {\n \"gemini-2.5-pro\": { input: 1.25, output: 10 },\n \"gemini-2.5-flash\": { input: 0.15, output: 0.6 },\n \"gemini-2.0-flash\": { input: 0.1, output: 0.4 },\n \"gemini-2.0-flash-lite\": { input: 0.025, output: 0.1 },\n };\n\n// ============================================================================\n// Gemini Runner\n// ============================================================================\n\n/** Options for createGeminiRunner */\nexport interface GeminiRunnerOptions {\n apiKey: string;\n model?: string;\n maxOutputTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature. Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Google Gemini generateContent API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createGeminiRunner({\n * apiKey: process.env.GEMINI_API_KEY!,\n * model: 'gemini-2.0-flash',\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createGeminiRunner(options: GeminiRunnerOptions): AgentRunner {\n const {\n apiKey,\n model = \"gemini-2.0-flash\",\n maxOutputTokens,\n baseURL = \"https://generativelanguage.googleapis.com/v1beta\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createGeminiRunner\");\n\n const genConfig: Record<string, unknown> = {};\n if (maxOutputTokens != null) {\n genConfig.maxOutputTokens = maxOutputTokens;\n }\n if (temperature != null) {\n genConfig.temperature = temperature;\n }\n if (topP != null) {\n genConfig.topP = topP;\n }\n if (stopSequences != null) {\n genConfig.stopSequences = stopSequences;\n }\n const hasGenConfig = Object.keys(genConfig).length > 0;\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/models/${agent.model ?? model}:generateContent`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n ...(agent.instructions\n ? { systemInstruction: { parts: [{ text: agent.instructions }] } }\n : {}),\n contents: messages.map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: [{ text: m.content }],\n })),\n ...(hasGenConfig ? { generationConfig: genConfig } : {}),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n const inputTokens = data.usageMetadata?.promptTokenCount ?? 0;\n const outputTokens = data.usageMetadata?.candidatesTokenCount ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Gemini Streaming Runner\n// ============================================================================\n\n/** Options for createGeminiStreamingRunner */\nexport interface GeminiStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n maxOutputTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature. Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Gemini streamGenerateContent API\n * with server-sent events. Can be used standalone or paired with `createGeminiRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createGeminiStreamingRunner({\n * apiKey: process.env.GEMINI_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createGeminiStreamingRunner(\n options: GeminiStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"gemini-2.0-flash\",\n maxOutputTokens,\n baseURL = \"https://generativelanguage.googleapis.com/v1beta\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createGeminiStreamingRunner\");\n\n const genConfig: Record<string, unknown> = {};\n if (maxOutputTokens != null) {\n genConfig.maxOutputTokens = maxOutputTokens;\n }\n if (temperature != null) {\n genConfig.temperature = temperature;\n }\n if (topP != null) {\n genConfig.topP = topP;\n }\n if (stopSequences != null) {\n genConfig.stopSequences = stopSequences;\n }\n const hasGenConfig = Object.keys(genConfig).length > 0;\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(\n `${baseURL}/models/${agent.model ?? model}:streamGenerateContent?alt=sse`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n ...(agent.instructions\n ? { systemInstruction: { parts: [{ text: agent.instructions }] } }\n : {}),\n contents: [{ role: \"user\", parts: [{ text: input }] }],\n ...(hasGenConfig ? { generationConfig: genConfig } : {}),\n }),\n signal: callbacks.signal,\n },\n );\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Gemini\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n const result: { text?: string; inputTokens?: number; outputTokens?: number } = {};\n\n const text = (\n (event.candidates as Array<Record<string, unknown>>)?.[0]\n ?.content as Record<string, unknown>\n )?.parts as Array<Record<string, unknown>> | undefined;\n const textVal = text?.[0]?.text;\n if (textVal) {\n result.text = textVal as string;\n }\n\n if (event.usageMetadata) {\n const meta = event.usageMetadata as Record<string, unknown>;\n if (meta.promptTokenCount !== undefined) {\n result.inputTokens = meta.promptTokenCount as number;\n }\n if (meta.candidatesTokenCount !== undefined) {\n result.outputTokens = meta.candidatesTokenCount as number;\n }\n }\n\n return result;\n },\n \"Gemini\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(hooks, agent, input, fullText, totalTokens, tokenUsage, startTime);\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/gemini.ts"],"names":["GEMINI_PRICING","createGeminiRunner","options","apiKey","model","maxOutputTokens","baseURL","fetchFn","timeoutMs","hooks","temperature","topP","stopSequences","validateBaseURL","warnIfMissingApiKey","genConfig","hasGenConfig","createRunner","agent","_input","messages","m","res","data","text","inputTokens","outputTokens","createGeminiStreamingRunner","input","callbacks","startTime","fireBeforeCallHook","response","throwStreamingHTTPError","reader","getSSEReader","fullText","parseSSEStream","event","result","textVal","meta","tokenUsage","totalTokens","fireAfterCallHook","buildStreamingResult","err","fireErrorHook"],"mappings":"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","file":"gemini.js","sourcesContent":["/**\n * @directive-run/ai/gemini\n *\n * Google Gemini adapter for Directive AI. Provides runners for the\n * Gemini generateContent API, including streaming support.\n *\n * @example\n * ```typescript\n * import { createGeminiRunner, createGeminiStreamingRunner } from '@directive-run/ai/gemini';\n *\n * const runner = createGeminiRunner({ apiKey: process.env.GEMINI_API_KEY! });\n * ```\n */\n\nimport { createRunner, validateBaseURL } from \"../agent-utils.js\";\nimport type { AdapterHooks, AgentRunner } from \"../types.js\";\nimport type { StreamingCallbackRunner } from \"../types.js\";\nimport {\n buildStreamingResult,\n fireAfterCallHook,\n fireBeforeCallHook,\n fireErrorHook,\n getSSEReader,\n parseSSEStream,\n throwStreamingHTTPError,\n warnIfMissingApiKey,\n} from \"./shared.js\";\n\n// ============================================================================\n// Pricing Constants\n// ============================================================================\n\n/**\n * Gemini model pricing (USD per million tokens).\n *\n * Use with `estimateCost()` for per-call cost tracking:\n * ```typescript\n * import { estimateCost } from '@directive-run/ai';\n * import { GEMINI_PRICING } from '@directive-run/ai/gemini';\n *\n * const cost =\n * estimateCost(result.tokenUsage!.inputTokens, GEMINI_PRICING[\"gemini-2.0-flash\"].input) +\n * estimateCost(result.tokenUsage!.outputTokens, GEMINI_PRICING[\"gemini-2.0-flash\"].output);\n * ```\n *\n * **Note:** Pricing changes over time. These values are provided as a convenience\n * and may not reflect the latest rates. Always verify at https://ai.google.dev/pricing\n */\nexport const GEMINI_PRICING: Record<string, { input: number; output: number }> =\n {\n \"gemini-2.5-pro\": { input: 1.25, output: 10 },\n \"gemini-2.5-flash\": { input: 0.15, output: 0.6 },\n \"gemini-2.0-flash\": { input: 0.1, output: 0.4 },\n \"gemini-2.0-flash-lite\": { input: 0.025, output: 0.1 },\n };\n\n// ============================================================================\n// Gemini Runner\n// ============================================================================\n\n/** Options for createGeminiRunner */\nexport interface GeminiRunnerOptions {\n apiKey: string;\n model?: string;\n maxOutputTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** @default undefined */\n timeoutMs?: number;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature. Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create an AgentRunner for the Google Gemini generateContent API.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const runner = createGeminiRunner({\n * apiKey: process.env.GEMINI_API_KEY!,\n * model: 'gemini-2.0-flash',\n * });\n * const orchestrator = createAgentOrchestrator({ runner });\n * const result = await orchestrator.run(agent, input);\n * ```\n */\nexport function createGeminiRunner(options: GeminiRunnerOptions): AgentRunner {\n const {\n apiKey,\n model = \"gemini-2.0-flash\",\n maxOutputTokens,\n baseURL = \"https://generativelanguage.googleapis.com/v1beta\",\n fetch: fetchFn = globalThis.fetch,\n timeoutMs,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createGeminiRunner\");\n\n const genConfig: Record<string, unknown> = {};\n if (maxOutputTokens != null) {\n genConfig.maxOutputTokens = maxOutputTokens;\n }\n if (temperature != null) {\n genConfig.temperature = temperature;\n }\n if (topP != null) {\n genConfig.topP = topP;\n }\n if (stopSequences != null) {\n genConfig.stopSequences = stopSequences;\n }\n const hasGenConfig = Object.keys(genConfig).length > 0;\n\n return createRunner({\n fetch: fetchFn,\n hooks,\n buildRequest: (agent, _input, messages) => ({\n url: `${baseURL}/models/${agent.model ?? model}:generateContent`,\n init: {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n ...(agent.instructions\n ? { systemInstruction: { parts: [{ text: agent.instructions }] } }\n : {}),\n contents: messages.map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: [{ text: m.content }],\n })),\n ...(hasGenConfig ? { generationConfig: genConfig } : {}),\n }),\n ...(timeoutMs != null\n ? { signal: AbortSignal.timeout(timeoutMs) }\n : {}),\n },\n }),\n parseResponse: async (res) => {\n const data = await res.json();\n const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n const inputTokens = data.usageMetadata?.promptTokenCount ?? 0;\n const outputTokens = data.usageMetadata?.candidatesTokenCount ?? 0;\n\n return {\n text,\n totalTokens: inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n };\n },\n });\n}\n\n// ============================================================================\n// Gemini Streaming Runner\n// ============================================================================\n\n/** Options for createGeminiStreamingRunner */\nexport interface GeminiStreamingRunnerOptions {\n apiKey: string;\n model?: string;\n maxOutputTokens?: number;\n baseURL?: string;\n fetch?: typeof globalThis.fetch;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n /** Sampling temperature. Higher = more random. */\n temperature?: number;\n /** Nucleus sampling: top-P probability mass (0–1). */\n topP?: number;\n /** Stop sequences. The model will stop generating when it encounters one. */\n stopSequences?: string[];\n}\n\n/**\n * Create a StreamingCallbackRunner for the Gemini streamGenerateContent API\n * with server-sent events. Can be used standalone or paired with `createGeminiRunner`.\n *\n * Returns `tokenUsage` with input/output breakdown for cost tracking.\n *\n * @example\n * ```typescript\n * const streamingRunner = createGeminiStreamingRunner({\n * apiKey: process.env.GEMINI_API_KEY!,\n * });\n * const streamRunner = createStreamingRunner(streamingRunner);\n * const { stream, result } = streamRunner(agent, input);\n * ```\n */\nexport function createGeminiStreamingRunner(\n options: GeminiStreamingRunnerOptions,\n): StreamingCallbackRunner {\n const {\n apiKey,\n model = \"gemini-2.0-flash\",\n maxOutputTokens,\n baseURL = \"https://generativelanguage.googleapis.com/v1beta\",\n fetch: fetchFn = globalThis.fetch,\n hooks,\n temperature,\n topP,\n stopSequences,\n } = options;\n\n validateBaseURL(baseURL);\n warnIfMissingApiKey(apiKey, \"createGeminiStreamingRunner\");\n\n const genConfig: Record<string, unknown> = {};\n if (maxOutputTokens != null) {\n genConfig.maxOutputTokens = maxOutputTokens;\n }\n if (temperature != null) {\n genConfig.temperature = temperature;\n }\n if (topP != null) {\n genConfig.topP = topP;\n }\n if (stopSequences != null) {\n genConfig.stopSequences = stopSequences;\n }\n const hasGenConfig = Object.keys(genConfig).length > 0;\n\n return async (agent, input, callbacks) => {\n const startTime = fireBeforeCallHook(hooks, agent, input);\n\n try {\n const response = await fetchFn(\n `${baseURL}/models/${agent.model ?? model}:streamGenerateContent?alt=sse`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify({\n ...(agent.instructions\n ? { systemInstruction: { parts: [{ text: agent.instructions }] } }\n : {}),\n contents: [{ role: \"user\", parts: [{ text: input }] }],\n ...(hasGenConfig ? { generationConfig: genConfig } : {}),\n }),\n signal: callbacks.signal,\n },\n );\n\n if (!response.ok) {\n await throwStreamingHTTPError(response, \"Gemini\");\n }\n\n const reader = getSSEReader(response);\n\n const { fullText, inputTokens, outputTokens } = await parseSSEStream(\n reader,\n callbacks.onToken,\n (event) => {\n const result: {\n text?: string;\n inputTokens?: number;\n outputTokens?: number;\n } = {};\n\n const text = (\n (event.candidates as Array<Record<string, unknown>>)?.[0]\n ?.content as Record<string, unknown>\n )?.parts as Array<Record<string, unknown>> | undefined;\n const textVal = text?.[0]?.text;\n if (textVal) {\n result.text = textVal as string;\n }\n\n if (event.usageMetadata) {\n const meta = event.usageMetadata as Record<string, unknown>;\n if (meta.promptTokenCount !== undefined) {\n result.inputTokens = meta.promptTokenCount as number;\n }\n if (meta.candidatesTokenCount !== undefined) {\n result.outputTokens = meta.candidatesTokenCount as number;\n }\n }\n\n return result;\n },\n \"Gemini\",\n );\n\n const tokenUsage = { inputTokens, outputTokens };\n const totalTokens = inputTokens + outputTokens;\n\n callbacks.onMessage?.({ role: \"assistant\", content: fullText });\n fireAfterCallHook(\n hooks,\n agent,\n input,\n fullText,\n totalTokens,\n tokenUsage,\n startTime,\n );\n\n return buildStreamingResult(input, fullText, totalTokens, tokenUsage);\n } catch (err) {\n fireErrorHook(hooks, agent, input, err, startTime);\n\n throw err;\n }\n };\n}\n"]}
|