mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-15 08:31:14 -07:00
feat(sdk): implement runtime hooks support in GeminiCliAgent
- Introduced a new Hook type and hook() helper for strongly-typed SDK hooks. - Integrated runtime hooks into GeminiCliSession lifecycle (startup, close, and tool execution). - Added hooks option to GeminiCliAgentOptions. - Exported executeToolWithHooks from core to facilitate SDK integration. - Updated SDK_DESIGN.md to reflect implemented features and remaining tasks. - Added and re-recorded SDK integration tests for hooks.
This commit is contained in:
@@ -40,6 +40,7 @@ export * from './core/tokenLimits.js';
|
||||
export * from './core/turn.js';
|
||||
export * from './core/geminiRequest.js';
|
||||
export * from './core/coreToolScheduler.js';
|
||||
export * from './core/coreToolHookTriggers.js';
|
||||
export * from './scheduler/scheduler.js';
|
||||
export * from './scheduler/types.js';
|
||||
export * from './scheduler/tool-executor.js';
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# `Gemini CLI SDK`
|
||||
|
||||
> **Implementation Status:** Core agent loop, tool execution, and session
|
||||
> context are implemented. Advanced features like hooks, skills, subagents, and
|
||||
> ACP are currently missing.
|
||||
> **Implementation Status:** Core agent loop, tool execution, session context,
|
||||
> skills, and hooks are implemented. Advanced features like subagents and ACP
|
||||
> are currently missing.
|
||||
|
||||
# `Examples`
|
||||
|
||||
@@ -91,7 +91,8 @@ Validation:
|
||||
|
||||
## `Custom Hooks`
|
||||
|
||||
> **Status:** Not Implemented.
|
||||
> **Status:** Implemented. `hook()` helper and `GeminiCliAgent` support custom
|
||||
> hook definitions and execution.
|
||||
|
||||
SDK users can provide programmatic custom hooks
|
||||
|
||||
@@ -125,6 +126,9 @@ const myHook = hook(
|
||||
);
|
||||
```
|
||||
|
||||
> **Note:** The `runAsCommand` functionality for standalone script execution is
|
||||
> currently **Not Implemented**.
|
||||
|
||||
SDK Hooks can also run as standalone scripts to implement userland "command"
|
||||
style hooks:
|
||||
|
||||
@@ -295,7 +299,8 @@ export interface AgentShell {
|
||||
stdout: string;
|
||||
stderr: string;
|
||||
}>;
|
||||
start(cmd: string, options?: AgentShellOptions): AgentShellProcess;
|
||||
// TODO: start method is not yet implemented
|
||||
// start(cmd: string, options?: AgentShellOptions): AgentShellProcess;
|
||||
}
|
||||
|
||||
export interface AgentShellOptions {
|
||||
@@ -325,16 +330,14 @@ export interface AgentShellProcess {
|
||||
|
||||
Based on the current implementation status, we can proceed with:
|
||||
|
||||
## Feature 3: Custom Hooks Support
|
||||
## Feature 4: Subagents Support
|
||||
|
||||
Implement support for loading and registering custom hooks. This involves adding
|
||||
a `hooks` option to `GeminiCliAgentOptions`.
|
||||
Implement support for subagents, allowing an agent to delegate tasks to other
|
||||
specialized agents.
|
||||
|
||||
**Tasks:**
|
||||
|
||||
1. Define `Hook` interface and helper functions.
|
||||
2. Add `hooks` option to `GeminiCliAgentOptions`.
|
||||
3. Implement hook registration logic in `GeminiCliAgent`.
|
||||
|
||||
IMPORTANT: Hook signatures should be strongly typed all the way through. You'll
|
||||
need to create a mapping of the string event name to the request/response types.
|
||||
1. Define `Subagent` interface.
|
||||
2. Implement subagent registration and routing in `GeminiCliAgent`.
|
||||
3. Support both simple prompt-based subagents and full `GeminiCliAgent`
|
||||
instances as subagents.
|
||||
|
||||
322
packages/sdk/src/hook.integration.test.ts
Normal file
322
packages/sdk/src/hook.integration.test.ts
Normal file
@@ -0,0 +1,322 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2026 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect, vi } from 'vitest';
|
||||
import { GeminiCliAgent } from './agent.js';
|
||||
import { hook, type EventInputMap, type EventOutputMap } from './hook.js';
|
||||
import { HookEventName, SessionEndReason } from '@google/gemini-cli-core';
|
||||
import { tool } from './tool.js';
|
||||
import type { SessionContext } from './types.js';
|
||||
import { z } from 'zod';
|
||||
import * as path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname } from 'node:path';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
const getGoldenPath = (name: string) =>
|
||||
path.resolve(__dirname, '../test-data', `${name}.json`);
|
||||
|
||||
// Set this to true locally when you need to update snapshots
|
||||
const RECORD_MODE = process.env['RECORD_NEW_RESPONSES'] === 'true';
|
||||
|
||||
describe('GeminiCliAgent Hook Integration', () => {
|
||||
it('executes BeforeTool and AfterTool hooks', async () => {
|
||||
const goldenFile = getGoldenPath('hook-tool-test');
|
||||
|
||||
const beforeAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.BeforeTool],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.BeforeTool] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const afterAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.AfterTool],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.AfterTool] | void>
|
||||
>()
|
||||
.mockResolvedValue({
|
||||
hookSpecificOutput: {
|
||||
hookEventName: 'AfterTool',
|
||||
additionalContext: 'Hook added this context',
|
||||
},
|
||||
});
|
||||
|
||||
const agent = new GeminiCliAgent({
|
||||
instructions: 'You are a helpful assistant.',
|
||||
model: RECORD_MODE ? 'gemini-3-flash-preview' : undefined,
|
||||
recordResponses: RECORD_MODE ? goldenFile : undefined,
|
||||
fakeResponses: RECORD_MODE ? undefined : goldenFile,
|
||||
tools: [
|
||||
tool(
|
||||
{
|
||||
name: 'add',
|
||||
description: 'Adds two numbers',
|
||||
inputSchema: z.object({ a: z.number(), b: z.number() }),
|
||||
},
|
||||
async ({ a, b }) => a + b,
|
||||
),
|
||||
],
|
||||
hooks: [
|
||||
hook(
|
||||
{ event: HookEventName.BeforeTool, name: 'before', matcher: 'add' },
|
||||
beforeAction,
|
||||
),
|
||||
hook(
|
||||
{ event: HookEventName.AfterTool, name: 'after', matcher: 'add' },
|
||||
afterAction,
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
const stream = agent.session().sendStream('What is 5 + 3?');
|
||||
for await (const _ of stream) {
|
||||
// consume stream
|
||||
}
|
||||
|
||||
expect(beforeAction).toHaveBeenCalled();
|
||||
expect(afterAction).toHaveBeenCalled();
|
||||
|
||||
const beforeInput = beforeAction.mock.calls[0][0];
|
||||
expect(beforeInput.tool_name).toBe('add');
|
||||
expect(beforeInput.tool_input).toEqual({ a: 5, b: 3 });
|
||||
|
||||
const afterInput = afterAction.mock.calls[0][0];
|
||||
expect(afterInput.tool_name).toBe('add');
|
||||
expect(afterInput.tool_response).toEqual({
|
||||
llmContent: '8',
|
||||
returnDisplay: '8',
|
||||
error: undefined,
|
||||
});
|
||||
|
||||
const context = afterAction.mock.calls[0][1];
|
||||
expect(context.sessionId).toBeDefined();
|
||||
expect(context.fs).toBeDefined();
|
||||
expect(context.shell).toBeDefined();
|
||||
}, 10000);
|
||||
|
||||
it('executes BeforeAgent and AfterAgent hooks', async () => {
|
||||
const goldenFile = getGoldenPath('hook-agent-test');
|
||||
|
||||
const beforeAgentAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.BeforeAgent],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.BeforeAgent] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const afterAgentAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.AfterAgent],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.AfterAgent] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const agent = new GeminiCliAgent({
|
||||
instructions: 'You are a helpful assistant.',
|
||||
model: RECORD_MODE ? 'gemini-3-flash-preview' : undefined,
|
||||
recordResponses: RECORD_MODE ? goldenFile : undefined,
|
||||
fakeResponses: RECORD_MODE ? undefined : goldenFile,
|
||||
hooks: [
|
||||
hook(
|
||||
{ event: HookEventName.BeforeAgent, name: 'beforeAgent' },
|
||||
beforeAgentAction,
|
||||
),
|
||||
hook(
|
||||
{ event: HookEventName.AfterAgent, name: 'afterAgent' },
|
||||
afterAgentAction,
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
const stream = agent.session().sendStream('hi');
|
||||
for await (const _ of stream) {
|
||||
/* consume */
|
||||
}
|
||||
|
||||
expect(beforeAgentAction).toHaveBeenCalled();
|
||||
expect(afterAgentAction).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('executes BeforeModel, AfterModel, and BeforeToolSelection hooks', async () => {
|
||||
const goldenFile = getGoldenPath('hook-model-test');
|
||||
|
||||
const beforeModelAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.BeforeModel],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.BeforeModel] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const afterModelAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.AfterModel],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.AfterModel] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const beforeToolSelectionAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.BeforeToolSelection],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.BeforeToolSelection] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const agent = new GeminiCliAgent({
|
||||
instructions: 'You are a helpful assistant.',
|
||||
model: RECORD_MODE ? 'gemini-3-flash-preview' : undefined,
|
||||
recordResponses: RECORD_MODE ? goldenFile : undefined,
|
||||
fakeResponses: RECORD_MODE ? undefined : goldenFile,
|
||||
tools: [
|
||||
tool(
|
||||
{
|
||||
name: 'add',
|
||||
description: 'Adds two numbers',
|
||||
inputSchema: z.object({ a: z.number(), b: z.number() }),
|
||||
},
|
||||
async ({ a, b }) => a + b,
|
||||
),
|
||||
],
|
||||
hooks: [
|
||||
hook(
|
||||
{ event: HookEventName.BeforeModel, name: 'beforeModel' },
|
||||
beforeModelAction,
|
||||
),
|
||||
hook(
|
||||
{ event: HookEventName.AfterModel, name: 'afterModel' },
|
||||
afterModelAction,
|
||||
),
|
||||
hook(
|
||||
{
|
||||
event: HookEventName.BeforeToolSelection,
|
||||
name: 'beforeToolSelection',
|
||||
},
|
||||
beforeToolSelectionAction,
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
const stream = agent.session().sendStream('What is 5 + 3?');
|
||||
for await (const _ of stream) {
|
||||
/* consume */
|
||||
}
|
||||
|
||||
expect(beforeModelAction).toHaveBeenCalled();
|
||||
expect(afterModelAction).toHaveBeenCalled();
|
||||
expect(beforeToolSelectionAction).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('executes SessionStart and SessionEnd hooks', async () => {
|
||||
const goldenFile = getGoldenPath('hook-agent-test');
|
||||
const sessionStartAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.SessionStart],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.SessionStart] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
const sessionEndAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.SessionEnd],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.SessionEnd] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const agent = new GeminiCliAgent({
|
||||
instructions: 'You are a helpful assistant.',
|
||||
fakeResponses: goldenFile,
|
||||
hooks: [
|
||||
hook(
|
||||
{ event: HookEventName.SessionStart, name: 'sessionStart' },
|
||||
sessionStartAction,
|
||||
),
|
||||
hook(
|
||||
{ event: HookEventName.SessionEnd, name: 'sessionEnd' },
|
||||
sessionEndAction,
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
const session = agent.session();
|
||||
await session.initialize();
|
||||
|
||||
expect(sessionStartAction).toHaveBeenCalled();
|
||||
|
||||
await session.close(SessionEndReason.Exit);
|
||||
expect(sessionEndAction).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('executes Notification and PreCompress hooks when triggered', async () => {
|
||||
const goldenFile = getGoldenPath('hook-agent-test');
|
||||
const notificationAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.Notification],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.Notification] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
const preCompressAction = vi
|
||||
.fn<
|
||||
(
|
||||
input: EventInputMap[HookEventName.PreCompress],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[HookEventName.PreCompress] | void>
|
||||
>()
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const agent = new GeminiCliAgent({
|
||||
instructions: 'You are a helpful assistant.',
|
||||
fakeResponses: goldenFile,
|
||||
hooks: [
|
||||
hook(
|
||||
{ event: HookEventName.Notification, name: 'notification' },
|
||||
notificationAction,
|
||||
),
|
||||
hook(
|
||||
{ event: HookEventName.PreCompress, name: 'preCompress' },
|
||||
preCompressAction,
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
const session = agent.session();
|
||||
await session.initialize();
|
||||
|
||||
// Reaching into private state for testing purposes to trigger events that are hard to hit naturally
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const hookSystem = (session as any).config.getHookSystem();
|
||||
|
||||
// Trigger notification via fireToolNotificationEvent
|
||||
await hookSystem.fireToolNotificationEvent({
|
||||
title: 'Permission',
|
||||
message: 'Allow tool?',
|
||||
});
|
||||
expect(notificationAction).toHaveBeenCalled();
|
||||
|
||||
await hookSystem.firePreCompressEvent('Manual');
|
||||
expect(preCompressAction).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
109
packages/sdk/src/hook.ts
Normal file
109
packages/sdk/src/hook.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2026 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import type {
|
||||
HookEventName,
|
||||
HookOutput,
|
||||
BeforeToolInput,
|
||||
AfterToolInput,
|
||||
BeforeAgentInput,
|
||||
AfterAgentInput,
|
||||
BeforeModelInput,
|
||||
BeforeModelOutput,
|
||||
AfterModelInput,
|
||||
AfterModelOutput,
|
||||
BeforeToolSelectionInput,
|
||||
BeforeToolSelectionOutput,
|
||||
NotificationInput,
|
||||
SessionStartInput,
|
||||
SessionEndInput,
|
||||
PreCompressInput,
|
||||
BeforeToolOutput,
|
||||
AfterToolOutput,
|
||||
BeforeAgentOutput,
|
||||
AfterAgentOutput,
|
||||
NotificationOutput,
|
||||
SessionStartOutput,
|
||||
PreCompressOutput,
|
||||
} from '@google/gemini-cli-core';
|
||||
import type { SessionContext } from './types.js';
|
||||
|
||||
/**
|
||||
* Map of hook event names to their corresponding input types.
|
||||
*/
|
||||
export interface EventInputMap {
|
||||
[HookEventName.BeforeTool]: BeforeToolInput;
|
||||
[HookEventName.AfterTool]: AfterToolInput;
|
||||
[HookEventName.BeforeAgent]: BeforeAgentInput;
|
||||
[HookEventName.AfterAgent]: AfterAgentInput;
|
||||
[HookEventName.BeforeModel]: BeforeModelInput;
|
||||
[HookEventName.AfterModel]: AfterModelInput;
|
||||
[HookEventName.BeforeToolSelection]: BeforeToolSelectionInput;
|
||||
[HookEventName.Notification]: NotificationInput;
|
||||
[HookEventName.SessionStart]: SessionStartInput;
|
||||
[HookEventName.SessionEnd]: SessionEndInput;
|
||||
[HookEventName.PreCompress]: PreCompressInput;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map of hook event names to their corresponding output types.
|
||||
*/
|
||||
export interface EventOutputMap {
|
||||
[HookEventName.BeforeTool]: BeforeToolOutput;
|
||||
[HookEventName.AfterTool]: AfterToolOutput;
|
||||
[HookEventName.BeforeAgent]: BeforeAgentOutput;
|
||||
[HookEventName.AfterAgent]: AfterAgentOutput;
|
||||
[HookEventName.BeforeModel]: BeforeModelOutput;
|
||||
[HookEventName.AfterModel]: AfterModelOutput;
|
||||
[HookEventName.BeforeToolSelection]: BeforeToolSelectionOutput;
|
||||
[HookEventName.Notification]: NotificationOutput;
|
||||
[HookEventName.SessionStart]: SessionStartOutput;
|
||||
[HookEventName.SessionEnd]: HookOutput;
|
||||
[HookEventName.PreCompress]: PreCompressOutput;
|
||||
}
|
||||
|
||||
/**
|
||||
* Definition of an SDK hook.
|
||||
* Uses a mapped type to create a discriminated union of all possible hooks.
|
||||
*/
|
||||
export type Hook = {
|
||||
[K in HookEventName]: {
|
||||
event: K;
|
||||
name: string;
|
||||
matcher?: string;
|
||||
sequential?: boolean;
|
||||
action: (
|
||||
input: EventInputMap[K],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[K] | void | null>;
|
||||
};
|
||||
}[HookEventName];
|
||||
|
||||
/**
|
||||
* Helper function to create a strongly-typed SDK hook.
|
||||
*
|
||||
* @param config Hook configuration including event name and optional matcher.
|
||||
* @param action The function to execute when the hook event occurs.
|
||||
* @returns A Hook object that can be passed to GeminiCliAgent.
|
||||
*/
|
||||
export function hook<T extends HookEventName>(
|
||||
config: {
|
||||
event: T;
|
||||
name: string;
|
||||
matcher?: string;
|
||||
sequential?: boolean;
|
||||
},
|
||||
action: (
|
||||
input: EventInputMap[T],
|
||||
context: SessionContext,
|
||||
) => Promise<EventOutputMap[T] | void | null>,
|
||||
): Hook {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
||||
return {
|
||||
...config,
|
||||
action,
|
||||
} as unknown as Hook;
|
||||
}
|
||||
@@ -7,5 +7,6 @@
|
||||
export * from './agent.js';
|
||||
export * from './session.js';
|
||||
export * from './tool.js';
|
||||
export * from './hook.js';
|
||||
export * from './skills.js';
|
||||
export * from './types.js';
|
||||
|
||||
@@ -21,6 +21,9 @@ import {
|
||||
ActivateSkillTool,
|
||||
type ResumedSessionData,
|
||||
PolicyDecision,
|
||||
HookType,
|
||||
SessionStartSource,
|
||||
SessionEndReason,
|
||||
} from '@google/gemini-cli-core';
|
||||
|
||||
import { type Tool, SdkTool } from './tool.js';
|
||||
@@ -32,12 +35,14 @@ import type {
|
||||
SystemInstructions,
|
||||
} from './types.js';
|
||||
import type { SkillReference } from './skills.js';
|
||||
import type { Hook } from './hook.js';
|
||||
import type { GeminiCliAgent } from './agent.js';
|
||||
|
||||
export class GeminiCliSession {
|
||||
private readonly config: Config;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
private readonly tools: Array<Tool<any>>;
|
||||
private readonly hooks: Hook[];
|
||||
private readonly skillRefs: SkillReference[];
|
||||
private readonly instructions: SystemInstructions | undefined;
|
||||
private client: GeminiClient | undefined;
|
||||
@@ -52,6 +57,7 @@ export class GeminiCliSession {
|
||||
this.instructions = options.instructions;
|
||||
const cwd = options.cwd || process.cwd();
|
||||
this.tools = options.tools || [];
|
||||
this.hooks = options.hooks || [];
|
||||
this.skillRefs = options.skills || [];
|
||||
|
||||
let initialMemory = '';
|
||||
@@ -69,7 +75,7 @@ export class GeminiCliSession {
|
||||
model: options.model || PREVIEW_GEMINI_MODEL_AUTO,
|
||||
userMemory: initialMemory,
|
||||
// Minimal config
|
||||
enableHooks: false,
|
||||
enableHooks: this.hooks.length > 0,
|
||||
mcpEnabled: false,
|
||||
extensionsEnabled: false,
|
||||
recordResponses: options.recordResponses,
|
||||
@@ -89,6 +95,22 @@ export class GeminiCliSession {
|
||||
return this.sessionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the session context.
|
||||
*/
|
||||
getContext(): SessionContext {
|
||||
return {
|
||||
sessionId: this.sessionId,
|
||||
transcript: this.client?.getHistory() || [],
|
||||
cwd: this.config.getWorkingDir(),
|
||||
timestamp: new Date().toISOString(),
|
||||
fs: new SdkAgentFilesystem(this.config),
|
||||
shell: new SdkAgentShell(this.config),
|
||||
agent: this.agent,
|
||||
session: this,
|
||||
};
|
||||
}
|
||||
|
||||
async initialize(): Promise<void> {
|
||||
if (this.initialized) return;
|
||||
|
||||
@@ -143,8 +165,40 @@ export class GeminiCliSession {
|
||||
registry.registerTool(sdkTool);
|
||||
}
|
||||
|
||||
// Register hooks
|
||||
if (this.hooks.length > 0) {
|
||||
const hookSystem = this.config.getHookSystem();
|
||||
if (hookSystem) {
|
||||
for (const sdkHook of this.hooks) {
|
||||
hookSystem.registerHook(
|
||||
{
|
||||
type: HookType.Runtime,
|
||||
name: sdkHook.name,
|
||||
action: async (input) =>
|
||||
// Cast the generic HookInput to the specific EventInputMap type required by this hook.
|
||||
// This is safe because the hook system guarantees the input matches the event name.
|
||||
// We use 'any' for the argument to satisfy the intersection requirement of the union function type.
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion, @typescript-eslint/no-explicit-any
|
||||
sdkHook.action(input as any, this.getContext()),
|
||||
},
|
||||
sdkHook.event,
|
||||
{
|
||||
matcher: sdkHook.matcher,
|
||||
sequential: sdkHook.sequential,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.client = this.config.getGeminiClient();
|
||||
|
||||
// Fire SessionStart event
|
||||
const hookSystem = this.config.getHookSystem();
|
||||
if (hookSystem) {
|
||||
await hookSystem.fireSessionStartEvent(SessionStartSource.Startup);
|
||||
}
|
||||
|
||||
if (this.resumedData) {
|
||||
const history: Content[] = this.resumedData.conversation.messages.map(
|
||||
(m) => {
|
||||
@@ -165,6 +219,17 @@ export class GeminiCliSession {
|
||||
this.initialized = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the session and fires the SessionEnd event.
|
||||
*/
|
||||
async close(reason: SessionEndReason = SessionEndReason.Exit): Promise<void> {
|
||||
const hookSystem = this.config.getHookSystem();
|
||||
if (hookSystem) {
|
||||
await hookSystem.fireSessionEndEvent(reason);
|
||||
}
|
||||
this.initialized = false;
|
||||
}
|
||||
|
||||
async *sendStream(
|
||||
prompt: string,
|
||||
signal?: AbortSignal,
|
||||
@@ -176,25 +241,13 @@ export class GeminiCliSession {
|
||||
const abortSignal = signal ?? new AbortController().signal;
|
||||
const sessionId = this.config.getSessionId();
|
||||
|
||||
const fs = new SdkAgentFilesystem(this.config);
|
||||
const shell = new SdkAgentShell(this.config);
|
||||
|
||||
let request: Parameters<GeminiClient['sendMessageStream']>[0] = [
|
||||
{ text: prompt },
|
||||
];
|
||||
|
||||
while (true) {
|
||||
if (typeof this.instructions === 'function') {
|
||||
const context: SessionContext = {
|
||||
sessionId,
|
||||
transcript: client.getHistory(),
|
||||
cwd: this.config.getWorkingDir(),
|
||||
timestamp: new Date().toISOString(),
|
||||
fs,
|
||||
shell,
|
||||
agent: this.agent,
|
||||
session: this,
|
||||
};
|
||||
const context = this.getContext();
|
||||
const newInstructions = await this.instructions(context);
|
||||
this.config.setUserMemory(newInstructions);
|
||||
client.updateSystemInstruction();
|
||||
@@ -226,17 +279,7 @@ export class GeminiCliSession {
|
||||
break;
|
||||
}
|
||||
|
||||
const transcript: Content[] = client.getHistory();
|
||||
const context: SessionContext = {
|
||||
sessionId,
|
||||
transcript,
|
||||
cwd: this.config.getWorkingDir(),
|
||||
timestamp: new Date().toISOString(),
|
||||
fs,
|
||||
shell,
|
||||
agent: this.agent,
|
||||
session: this,
|
||||
};
|
||||
const context = this.getContext();
|
||||
|
||||
const originalRegistry = this.config.getToolRegistry();
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
import type { Content } from '@google/gemini-cli-core';
|
||||
import type { Tool } from './tool.js';
|
||||
import type { Hook } from './hook.js';
|
||||
import type { SkillReference } from './skills.js';
|
||||
import type { GeminiCliAgent } from './agent.js';
|
||||
import type { GeminiCliSession } from './session.js';
|
||||
@@ -18,6 +19,7 @@ export interface GeminiCliAgentOptions {
|
||||
instructions: SystemInstructions;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
tools?: Array<Tool<any>>;
|
||||
hooks?: Hook[];
|
||||
skills?: SkillReference[];
|
||||
model?: string;
|
||||
cwd?: string;
|
||||
|
||||
@@ -16,9 +16,3 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10055,"totalTokenCount":10055,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10055}]}},{"candidates":[{"content":{"parts":[{"text":" 2."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7218,"candidatesTokenCount":7,"totalTokenCount":7225,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7218}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10039,"totalTokenCount":10039,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10039}]}},{"candidates":[{"content":{"parts":[{"text":" secret number is 1."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7204,"candidatesTokenCount":7,"totalTokenCount":7211,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7204}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10055,"totalTokenCount":10055,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10055}]}},{"candidates":[{"content":{"parts":[{"text":" 2."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7218,"candidatesTokenCount":7,"totalTokenCount":7225,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7218}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10123,"totalTokenCount":10123,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10123}]}},{"candidates":[{"content":{"parts":[{"text":" 1.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7188,"candidatesTokenCount":8,"totalTokenCount":7196,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7188}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10140,"totalTokenCount":10140,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10140}]}},{"candidates":[{"content":{"parts":[{"text":" 2.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7203,"candidatesTokenCount":8,"totalTokenCount":7211,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7203}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10123,"totalTokenCount":10123,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10123}]}},{"candidates":[{"content":{"parts":[{"text":" 1.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7188,"candidatesTokenCount":8,"totalTokenCount":7196,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7188}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10140,"totalTokenCount":10140,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10140}]}},{"candidates":[{"content":{"parts":[{"text":" 2.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7203,"candidatesTokenCount":8,"totalTokenCount":7211,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7203}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10112,"totalTokenCount":10112,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10112}]}},{"candidates":[{"content":{"parts":[{"text":" 1."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7177,"candidatesTokenCount":7,"totalTokenCount":7184,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7177}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The secret number is"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10128,"totalTokenCount":10128,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10128}]}},{"candidates":[{"content":{"parts":[{"text":" 2."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7191,"candidatesTokenCount":7,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7191}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
|
||||
@@ -1,2 +1,10 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BAN"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10103,"totalTokenCount":10103,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10103}]}},{"candidates":[{"content":{"parts":[{"text":"ANA\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7168,"candidatesTokenCount":3,"totalTokenCount":7171,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7168}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10124,"totalTokenCount":10124,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10124}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7187,"candidatesTokenCount":3,"totalTokenCount":7190,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7187}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BAN"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10019,"totalTokenCount":10019,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10019}]}},{"candidates":[{"content":{"parts":[{"text":"ANA\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":3,"totalTokenCount":7187,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The word is BAN"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":"ANA.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":7,"totalTokenCount":7202,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"text":" word is BANANA.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7306,"candidatesTokenCount":7,"totalTokenCount":7313,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7306}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":7}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":3,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":3,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BAN"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":"ANA\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":3,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":3,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10040,"totalTokenCount":10040,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10040}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7203,"candidatesTokenCount":3,"totalTokenCount":7206,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7203}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10030,"totalTokenCount":10030,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10030}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7195,"candidatesTokenCount":3,"totalTokenCount":7198,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7195}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"BANANA"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7203,"candidatesTokenCount":2,"totalTokenCount":7205,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7203}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":2}]}}]}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":9828,"totalTokenCount":9828,"promptTokensDetails":[{"modality":"TEXT","tokenCount":9828}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through the code?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7095,"candidatesTokenCount":15,"totalTokenCount":7110,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7095}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":15}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10109,"totalTokenCount":10109,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10109}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to plunder the codebase, are ye?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7174,"candidatesTokenCount":16,"totalTokenCount":7190,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7174}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":16}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10109,"totalTokenCount":10109,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10109}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to shiver some timbers and get to work?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7174,"candidatesTokenCount":18,"totalTokenCount":7192,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7174}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":18}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10098,"totalTokenCount":10098,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10098}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through these here files, are we?\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10098,"totalTokenCount":10098,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10098}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7163,"candidatesTokenCount":20,"totalTokenCount":7183,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7163}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":20}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10014,"totalTokenCount":10014,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10014}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to shiver some timbers, I be.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7179,"candidatesTokenCount":17,"totalTokenCount":7196,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7179}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":17}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through the digital seas?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":16,"totalTokenCount":7206,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":16}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through these digital seas?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":16,"totalTokenCount":7206,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":16}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course and plunder some code, are"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":" we?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":20,"totalTokenCount":7210,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":20}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ahoy,"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":" matey! Ready to chart a course and plunder some code?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":17,"totalTokenCount":7207,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":17}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through the code?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":15,"totalTokenCount":7205,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":15}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ah"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10025,"totalTokenCount":10025,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10025}]}},{"candidates":[{"content":{"parts":[{"text":"oy, matey! Ready to chart a course through the digital seas?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7190,"candidatesTokenCount":16,"totalTokenCount":7206,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7190}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":16}]}}]}
|
||||
|
||||
4
packages/sdk/test-data/hook-agent-test.json
Normal file
4
packages/sdk/test-data/hook-agent-test.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Hi"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10050,"totalTokenCount":10050,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10050}]}},{"candidates":[{"content":{"parts":[{"text":".\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7215,"candidatesTokenCount":3,"totalTokenCount":7218,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7215}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Hi"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10072,"totalTokenCount":10072,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10072}]}},{"candidates":[{"content":{"parts":[{"text":".\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7237,"candidatesTokenCount":3,"totalTokenCount":7240,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7237}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Hi"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10072,"totalTokenCount":10072,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10072}]}},{"candidates":[{"content":{"parts":[{"text":"! How can I help you?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7237,"candidatesTokenCount":9,"totalTokenCount":7246,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7237}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":9}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Hello! I'm Gemini"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8752,"candidatesTokenCount":6,"totalTokenCount":8822,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8752}],"thoughtsTokenCount":64}},{"candidates":[{"content":{"parts":[{"text":" CLI, ready to help you with the development and maintenance of the `@gemini-cli/sdk` package. How can"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8752,"candidatesTokenCount":31,"totalTokenCount":8847,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8752}],"thoughtsTokenCount":64}},{"candidates":[{"content":{"parts":[{"text":" I assist you today?"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8752,"candidatesTokenCount":36,"totalTokenCount":8852,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8752}],"thoughtsTokenCount":64}},{"candidates":[{"content":{"parts":[{"text":"","thoughtSignature":"EokDCoYDAb4+9vsmWB5b8f5PLiYnuOHBOxa4k2lHFIzMk2nW5XWyFcZAb0QwSHU/6oZJVju/63PT83swXG4OHhcQolxS0XbglE6vCxR9vDWVJoDS8YQvoZUSsiq1AwShfkRFjJOum4Gnz0655Z+2ZLpWjVO9IP5EEUPkMBgGq1m2bWhX8t5Bvwaj63Q4YBKj8AZajTlTxcacGJU4bHuHoNqQCoix2t+POQE3KbT6HIkRK2yUeYel32Yemye6itk2uKnezLH0WSu4FcffVOLqgv80Rnk6dpoQrcCB2EETOyET/cv6YUHI98Ic+u+ay35D6GrwwxwXPYZAm/SyL9Dj4W/5rrWbh6h65/DUaCdBc441nmywvS1xeRyJKS6WVrwumuiZRmdgKaGku/M8+EHHyR43t1Fj+Hv0PMNq7c9LoZj6LKC/S5jhP34f4PE9Re1RnjSd02DdKN9efMhGrhTukJ+CYLqg0Ser1TF8AsYveAuuj8NJ1+9VDG3lmfYagib4Q+zGTwiNQf9tJBbh"}],"role":"model"},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":8752,"candidatesTokenCount":36,"totalTokenCount":8852,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8752}],"thoughtsTokenCount":64}}]}
|
||||
11
packages/sdk/test-data/hook-model-test.json
Normal file
11
packages/sdk/test-data/hook-model-test.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7237,"candidatesTokenCount":5,"totalTokenCount":7242,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7237}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"text":" encountered an error while trying to add the numbers. I will try a different approach using"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"text":" the `run_shell_command` tool.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"run_shell_command","args":{"command":"echo $((5+3))","description":"Adding 5 and 3 using bash."}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7259,"candidatesTokenCount":51,"totalTokenCount":7310,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7259}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":51}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10251,"totalTokenCount":10251,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10251}]}},{"candidates":[{"content":{"parts":[{"text":" still unable to perform this calculation. I will ask the user for assistance. I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10251,"totalTokenCount":10251,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10251}]}},{"candidates":[{"content":{"parts":[{"text":" am unable to add these numbers, can you confirm that the `add` tool is functioning"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10251,"totalTokenCount":10251,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10251}]}},{"candidates":[{"content":{"parts":[{"text":" correctly?\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7331,"candidatesTokenCount":39,"totalTokenCount":7370,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7331}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":39}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7248,"candidatesTokenCount":5,"totalTokenCount":7253,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7248}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10168,"totalTokenCount":10168,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10168}]}},{"candidates":[{"content":{"parts":[{"text":" encountered an error when trying to add the numbers. I will try again.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10168,"totalTokenCount":10168,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10168}]}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7270,"candidatesTokenCount":22,"totalTokenCount":7292,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7270}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":22}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am still encountering"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10230,"totalTokenCount":10230,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10230}]}},{"candidates":[{"content":{"parts":[{"text":" an error when trying to add the numbers. I will try a different approach.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10230,"totalTokenCount":10230,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10230}]}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7309,"candidatesTokenCount":26,"totalTokenCount":7335,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7309}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":26}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am still encountering"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10296,"totalTokenCount":10296,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10296}]}},{"candidates":[{"content":{"parts":[{"text":" errors. I am unable to fulfill the request."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7352,"candidatesTokenCount":14,"totalTokenCount":7366,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7352}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":14}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7248,"candidatesTokenCount":5,"totalTokenCount":7253,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7248}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"8"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7256,"candidatesTokenCount":1,"totalTokenCount":7257,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7256}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":1}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I will calculate the sum of 5 and 3"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":11,"totalTokenCount":8874,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":54}},{"candidates":[{"content":{"parts":[{"text":".\n"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":13,"totalTokenCount":8876,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":54}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}},"thoughtSignature":"EpkCCpYCAb4+9vsvFfIrjchIYDs5FsTIofF1pKHBZJF2jQq8kq3MoYofuLF1wuaavEeeuqWueql+d60qSjF5t7TKFpi19BvMezCSa9JoTH+2jjmx/ibz1XytKVy9txIUx9RisXQYpEWXJf6wBtkPQ0dqu0EHlX3083JZBOrF0lFKZPK70wh2FqSlY+AfI4Ha1pTr75UQKbwtoqDbGmU4jlr4zbKMLMYi47sTBzfjzATqNb/s4zIZTIF+JT4LANzunycFLoM2+gwHDNj9bx5zJ0xXs8EvhaliPpXVkbBxtp3b3RwvWMnmWVLn81I1Uy/1TUPGOlpy11z8B0WtLMZhZ0JaqXANV78hltEsaAnuix/gArCpCZBRO8O78wY="}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":29,"totalTokenCount":8892,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":54}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":29,"totalTokenCount":8892,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":54}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"5 + 3 is 8."}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8850,"candidatesTokenCount":8,"totalTokenCount":8874,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8850}],"thoughtsTokenCount":16}},{"candidates":[{"content":{"parts":[{"text":"","thoughtSignature":"EoUBCoIBAb4+9vtGiAeGV6qWtaWuie7UdX/hoOMU0GOrnD1ss0nh01wgo6rD3SXKOCyrh1+uBVe1RV1IGK+4EbmNnOd2A0F6ULVt/+NdXEKA94i88CQuPi00VwWyAcAEstNOKiRdD6SWEi2CK3WUkuG/aUxD0XCyvITwXwQRcWbXZuyq76u0UA=="}],"role":"model"},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":8904,"candidatesTokenCount":8,"totalTokenCount":8928,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8904}],"thoughtsTokenCount":16}}]}
|
||||
10
packages/sdk/test-data/hook-tool-test.json
Normal file
10
packages/sdk/test-data/hook-tool-test.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7237,"candidatesTokenCount":5,"totalTokenCount":7242,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7237}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"text":" encountered an error when trying to add the two numbers. I will try again."}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"text":"\n\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10157,"totalTokenCount":10157,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10157}]}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7259,"candidatesTokenCount":23,"totalTokenCount":7282,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7259}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":23}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am still encountering"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10220,"totalTokenCount":10220,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10220}]}},{"candidates":[{"content":{"parts":[{"text":" an error. I am not sure why the add tool is failing. I will try a"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10220,"totalTokenCount":10220,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10220}]}},{"candidates":[{"finishReason":"MALFORMED_FUNCTION_CALL"}],"usageMetadata":{"promptTokenCount":7299,"candidatesTokenCount":22,"totalTokenCount":7321,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7299}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":22}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am still encountering"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10220,"totalTokenCount":10220,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10220}]}},{"candidates":[{"content":{"parts":[{"text":" an error. I will try a different approach.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10220,"totalTokenCount":10220,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10220}]}},{"candidates":[{"finishReason":"MALFORMED_FUNCTION_CALL"}],"usageMetadata":{"promptTokenCount":7299,"candidatesTokenCount":15,"totalTokenCount":7314,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7299}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":15}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"\nI apologize"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10226,"totalTokenCount":10226,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10226}]}},{"candidates":[{"content":{"parts":[{"text":", it seems I am having trouble with the `add` tool. I will"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10226,"totalTokenCount":10226,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10226}]}},{"candidates":[{"content":{"parts":[{"text":" try a different approach and use a shell command to calculate the sum.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10226,"totalTokenCount":10226,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10226}]}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"run_shell_command","args":{"description":"Calculates the sum of 5 and 3 using bash.","command":"echo $((5+3))"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7304,"candidatesTokenCount":60,"totalTokenCount":7364,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7304}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":60}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am still running"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10329,"totalTokenCount":10329,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10329}]}},{"candidates":[{"content":{"parts":[{"text":" into errors. I apologize, I am unable to calculate the sum at this time.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10329,"totalTokenCount":10329,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10329}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7385,"candidatesTokenCount":22,"totalTokenCount":7407,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7385}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":22}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7248,"candidatesTokenCount":5,"totalTokenCount":7253,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7248}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"8"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7271,"candidatesTokenCount":1,"totalTokenCount":7272,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7271}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":1}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I will calculate 5 + 3 for you."}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":11,"totalTokenCount":8850,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":30}},{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}},"thoughtSignature":"EsEBCr4BAb4+9vuEbJ5fycmT6h3jmNfRvhtePUGfO2mV0ksh8oeV82QsvD1xiF0XEM7VBF2YNX2JJy/nYWOIHbSDjjZ1uR9NHTC4QVwSTTOwB7vGAGpBAt6pgiVEP0HiIom7mh9cCoxKzylLr+IIfhglhhEuEdVeEjJkFYFYZRWfPjUDMD+iVQhQqDcPoHjbPrnJe7vhFvkR7C8/NaY6MiETg2lWPjaABFLl7mTt3j8RL9HDPjdIAAPZ2fPSGDCNCUOLMQ=="}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":27,"totalTokenCount":8866,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":30}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":8809,"candidatesTokenCount":27,"totalTokenCount":8866,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8809}],"thoughtsTokenCount":30}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"5 + 3 is 8."}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":8863,"candidatesTokenCount":8,"totalTokenCount":8892,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8863}],"thoughtsTokenCount":21}},{"candidates":[{"content":{"parts":[{"text":"","thoughtSignature":"EokBCoYBAb4+9vuni05RduVlzmZamZyvbhsm1m43T8/mCWdW4oUVYoJjgjhLDEq4S+JdKeweDj+ZIkSinPKEloDcdFc3RbD2P08vEwaN8Mo459nh4+afuIvm+Rl1BQ8T5i874/ZzwyqwR19H/3SbSpwjZmqbdrmrlywULa/fEwE48XWFlSywn4azrmw="}],"role":"model"},"finishReason":"STOP","index":0}],"usageMetadata":{"promptTokenCount":8893,"candidatesTokenCount":8,"totalTokenCount":8922,"promptTokensDetails":[{"modality":"TEXT","tokenCount":8893}],"thoughtsTokenCount":21}}]}
|
||||
@@ -1,8 +1,2 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7160,"candidatesTokenCount":8,"totalTokenCount":7168,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7160}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Arrr, why"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10048,"totalTokenCount":10048,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10048}]}},{"candidates":[{"content":{"parts":[{"text":" don't pirates play poker? Because they always have a hidden ace up their sleeves"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10048,"totalTokenCount":10048,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10048}]}},{"candidates":[{"content":{"parts":[{"text":"!\\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7284,"candidatesTokenCount":23,"totalTokenCount":7307,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7284}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":23}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7185,"candidatesTokenCount":8,"totalTokenCount":7193,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7185}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10179,"totalTokenCount":10179,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10179}]}},{"candidates":[{"content":{"parts":[{"text":" sorry, I cannot activate the skill at this time because it requires user confirmation."}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10179,"totalTokenCount":10179,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10179}]}},{"candidates":[{"content":{"parts":[{"text":" Would you like me to proceed with telling you a joke without activating the skill?"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10179,"totalTokenCount":10179,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10179}]}},{"candidates":[{"content":{"parts":[{"text":"\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7218,"candidatesTokenCount":35,"totalTokenCount":7253,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7218}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":35}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7185,"candidatesTokenCount":8,"totalTokenCount":7193,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7185}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Arrr, why"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10275,"totalTokenCount":10275,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10275}]}},{"candidates":[{"content":{"parts":[{"text":" don't pirates play cards? Because someone's always standin' on the"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10275,"totalTokenCount":10275,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10275}]}},{"candidates":[{"content":{"parts":[{"text":" deck!\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7309,"candidatesTokenCount":24,"totalTokenCount":7333,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7309}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":24}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7174,"candidatesTokenCount":8,"totalTokenCount":7182,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7174}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ar"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10264,"totalTokenCount":10264,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10264}]}},{"candidates":[{"content":{"parts":[{"text":"rr, why don't pirates play cards? Because someone always be standin' on the"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10264,"totalTokenCount":10264,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10264}]}},{"candidates":[{"content":{"parts":[{"text":" deck!\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7298,"candidatesTokenCount":23,"totalTokenCount":7321,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7298}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":23}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Arrr, why"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10048,"totalTokenCount":10048,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10048}]}},{"candidates":[{"content":{"parts":[{"text":" don't pirates play poker? Because they always have a hidden ace up their sleeves"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10048,"totalTokenCount":10048,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10048}]}},{"candidates":[{"content":{"parts":[{"text":"!\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7284,"candidatesTokenCount":23,"totalTokenCount":7307,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7284}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":23}]}}]}
|
||||
|
||||
@@ -1,8 +1,2 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7170,"candidatesTokenCount":8,"totalTokenCount":7178,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7170}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ar"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10058,"totalTokenCount":10058,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10058}]}},{"candidates":[{"content":{"parts":[{"text":"rr, the pirate skill be active, matey!"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7294,"candidatesTokenCount":12,"totalTokenCount":7306,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7294}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":12}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":8,"totalTokenCount":7192,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10178,"totalTokenCount":10178,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10178}]}},{"candidates":[{"content":{"parts":[{"text":" am unable to activate the skill without user confirmation. I will await further instructions.\n"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10178,"totalTokenCount":10178,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10178}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7217,"candidatesTokenCount":18,"totalTokenCount":7235,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7217}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":18}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":8,"totalTokenCount":7192,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ar"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10274,"totalTokenCount":10274,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10274}]}},{"candidates":[{"content":{"parts":[{"text":"rr, the pirate-skill be active, aye!\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7308,"candidatesTokenCount":13,"totalTokenCount":7321,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7308}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":13}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"activate_skill","args":{"name":"pirate-skill"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7173,"candidatesTokenCount":8,"totalTokenCount":7181,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7173}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":8}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Ar"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10263,"totalTokenCount":10263,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10263}]}},{"candidates":[{"content":{"parts":[{"text":"rr, pirate skill activated, aye!"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7297,"candidatesTokenCount":9,"totalTokenCount":7306,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7297}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":9}]}}]}
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
name: pirate-skill
|
||||
description: Speak like a pirate.
|
||||
---
|
||||
You are a pirate. Respond to everything in pirate speak. Always mention "Arrr".
|
||||
You are a pirate. Respond to everything in pirate speak. Always mention "Arrr".
|
||||
|
||||
@@ -1,8 +1,2 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"checkSystemStatus","args":{}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7070,"candidatesTokenCount":3,"totalTokenCount":7073,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7070}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The system status check"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":9850,"totalTokenCount":9850,"promptTokensDetails":[{"modality":"TEXT","tokenCount":9850}]}},{"candidates":[{"content":{"parts":[{"text":" returned an error. It says `Error: Standard error caught`."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7082,"candidatesTokenCount":17,"totalTokenCount":7099,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7082}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":17}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"checkSystemStatus","args":{}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":3,"totalTokenCount":7187,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I am unable to"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10183,"totalTokenCount":10183,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10183}]}},{"candidates":[{"content":{"parts":[{"text":" check the system status because it requires user confirmation in interactive mode. Is there anything else I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10183,"totalTokenCount":10183,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10183}]}},{"candidates":[{"content":{"parts":[{"text":" can help with?"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7213,"candidatesTokenCount":26,"totalTokenCount":7239,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7213}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":26}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"checkSystemStatus","args":{}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":3,"totalTokenCount":7187,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The system status check"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10164,"totalTokenCount":10164,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10164}]}},{"candidates":[{"content":{"parts":[{"text":" reported an error: \"Standard error caught\".\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7194,"candidatesTokenCount":14,"totalTokenCount":7208,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7194}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":14}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"checkSystemStatus","args":{}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7184,"candidatesTokenCount":3,"totalTokenCount":7187,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7184}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":3}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"There"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10164,"totalTokenCount":10164,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10164}]}},{"candidates":[{"content":{"parts":[{"text":" is an error reported in the system status.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7194,"candidatesTokenCount":11,"totalTokenCount":7205,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7194}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":11}]}}]}
|
||||
|
||||
@@ -1,8 +1,2 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"failVisible","args":{"input":"fail"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7073,"candidatesTokenCount":4,"totalTokenCount":7077,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7073}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":4}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":9867,"totalTokenCount":9867,"promptTokensDetails":[{"modality":"TEXT","tokenCount":9867}]}},{"candidates":[{"content":{"parts":[{"text":" tool failed visibly with the error message: \"Error: Tool failed visibly\"."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7085,"candidatesTokenCount":16,"totalTokenCount":7101,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7085}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":16}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"failVisible","args":{"input":"fail"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7198,"candidatesTokenCount":4,"totalTokenCount":7202,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7198}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":4}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10210,"totalTokenCount":10210,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10210}]}},{"candidates":[{"content":{"parts":[{"text":" tool execution for \"failVisible\" requires user confirmation, which is not supported in non-"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10210,"totalTokenCount":10210,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10210}]}},{"candidates":[{"content":{"parts":[{"text":"interactive mode."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7226,"candidatesTokenCount":22,"totalTokenCount":7248,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7226}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":22}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"failVisible","args":{"input":"fail"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7198,"candidatesTokenCount":4,"totalTokenCount":7202,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7198}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":4}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10192,"totalTokenCount":10192,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10192}]}},{"candidates":[{"content":{"parts":[{"text":" tool failed visibly. The error message is \"Tool failed visibly\"."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7208,"candidatesTokenCount":14,"totalTokenCount":7222,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7208}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":14}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"failVisible","args":{"input":"fail"}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7187,"candidatesTokenCount":4,"totalTokenCount":7191,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7187}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":4}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"The tool failed with"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10181,"totalTokenCount":10181,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10181}]}},{"candidates":[{"content":{"parts":[{"text":" the error message \"Tool failed visibly\"."}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7197,"candidatesTokenCount":12,"totalTokenCount":7209,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7197}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":12}]}}]}
|
||||
|
||||
@@ -1,8 +1,2 @@
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7045,"candidatesTokenCount":5,"totalTokenCount":7050,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7045}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"8"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":9849,"totalTokenCount":9849,"promptTokensDetails":[{"modality":"TEXT","tokenCount":9849}]}},{"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7053,"candidatesTokenCount":1,"totalTokenCount":7054,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7053}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":1}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"b":3,"a":5}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7179,"candidatesTokenCount":5,"totalTokenCount":7184,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7179}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"I"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10204,"totalTokenCount":10204,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10204}]}},{"candidates":[{"content":{"parts":[{"text":" am unable to execute the add tool in non-interactive mode.\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7206,"candidatesTokenCount":15,"totalTokenCount":7221,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7206}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":15}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7179,"candidatesTokenCount":5,"totalTokenCount":7184,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7179}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"8"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7187,"candidatesTokenCount":1,"totalTokenCount":7188,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7187}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":1}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"functionCall":{"name":"add","args":{"a":5,"b":3}}}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7168,"candidatesTokenCount":5,"totalTokenCount":7173,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7168}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":5}]}}]}
|
||||
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"8"}],"role":"model"}}],"usageMetadata":{"promptTokenCount":10174,"totalTokenCount":10174,"promptTokensDetails":[{"modality":"TEXT","tokenCount":10174}]}},{"candidates":[{"content":{"parts":[{"text":"\n"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{"promptTokenCount":7176,"candidatesTokenCount":2,"totalTokenCount":7178,"promptTokensDetails":[{"modality":"TEXT","tokenCount":7176}],"candidatesTokensDetails":[{"modality":"TEXT","tokenCount":2}]}}]}
|
||||
|
||||
Reference in New Issue
Block a user