import type { ChatCompletionsCallOptions } from "./chat-completions.js"; import type { ToolContext, ToolManager } from "../types/tool.js"; export type NativeStreamEvent = { type: "start"; } | { type: "start-step"; request: Record; warnings: unknown[]; } | { type: "reasoning-start"; id: string; providerMetadata?: Record; } | { type: "reasoning-delta"; id: string; text: string; providerMetadata?: Record; } | { type: "reasoning-end"; id: string; providerMetadata?: Record; } | { type: "text-start"; id: string; providerMetadata?: Record; } | { type: "text-delta"; id: string; text: string; providerMetadata?: Record; } | { type: "text-end"; id: string; providerMetadata?: Record; } | { type: "tool-input-start"; id: string; toolName: string; providerMetadata?: Record; } | { type: "tool-input-delta"; id: string; toolName: string; args: string; providerMetadata?: Record; } | { type: "tool-input-end"; id: string; toolName: string; args: string; providerMetadata?: Record; } | { type: "tool-call"; toolCallId: string; toolName: string; input: Record; providerMetadata?: Record; } | { type: "tool-result"; toolCallId: string; output: { title: string; metadata: Record; output: string; }; } | { type: "tool-error"; toolCallId: string; toolName: string; input: Record; error: Error; metadata?: Record; } | { type: "finish-step"; finishReason: string; usage: { inputTokens: number; outputTokens: number; totalTokens: number; }; providerMetadata?: Record; } | { type: "finish"; } | { type: "error"; error: Error; }; /** onToolCall 入参 */ export interface ToolCallContext { toolName: string; args: unknown; } /** onToolCall 返回值 */ export type ToolCallResult = void | { allow: false; reason?: string; } | { modifiedArgs: unknown; }; /** onToolResult 入参 */ export interface ToolResultContext { toolName: string; args: unknown; result?: unknown; error?: Error; durationMs: number; startedAt: number; } export interface NativeStreamOptions extends ChatCompletionsCallOptions { toolExecutors?: Record, signal?: AbortSignal) => Promise<{ title: string; metadata: Record; output: string; }>>; toolManager?: ToolManager; toolContext?: ToolContext; beforeToolUse?: (event: { toolCallId: string; toolName: string; input: Record; }) => Promise<{ args?: Record; cancel?: boolean; cancelReason?: string; } | void>; /** * 工具调用前拦截钩子(可干预)。 * - 返回 void → 正常执行 * - 返回 { allow: false, reason? } → 阻止执行,reason 作为 tool-result 返回给 LLM * - 返回 { modifiedArgs } → 改写参数后执行 * 钩子自身抛错 → SDK catch + log warning,不阻断工具执行。 */ onToolCall?: (ctx: ToolCallContext) => ToolCallResult | Promise; /** * 工具调用后观察钩子(只读)。 * result 是成功时的返回值,error 是失败时的错误,二者互斥。 * 钩子自身抛错 → SDK catch + log warning,不影响流程。 */ onToolResult?: (ctx: ToolResultContext) => void | Promise; /** * Tool 分批调度(10.1.5,wave-agent 分批 + claudecode sibling-abort)。 * 未启用(默认)→ 保持原串行执行;启用后按 `isConcurrencySafe` 分批: * - safe batch 内并发(Promise.allSettled) * - unsafe batch 单调用串行 * - `alwaysUnsafe`(默认 `{bash}`)强制 unsafe,即便工具标了 safe * - safe batch 内 `abortOnErrorTools`(默认 `{bash}`)报错触发同批次 abort */ toolBatchOptions?: { enabled: boolean; alwaysUnsafe?: Set; abortOnErrorTools?: Set; /** * 并发调度模式(12.3.6)。 * - `partition`(默认):10.1.5 静态分批,连续 safe 合并并发/unsafe 串行/批间串行。 * - `rwlock`:全部并发 spawn + 写偏好 RwLock 读写门动态调度(对齐 codex parallel.rs)。 * bash 全局写锁独占一切;read/edit 全局读+per-file 锁;grep/glob 全局读。 * 跨文件 read/edit 并发,同文件读写隔离。注意:grep/glob 与 edit 同文件并发可能读中间态(只读快照,可接受)。 * 不做 sibling-abort(各调用独立)。 */ mode?: "partition" | "rwlock"; }; /** * Prompt cache blocks(对齐 Claude Code buildSystemPromptBlocks)。 * 传入后 system prompt 的静态部分打 cache_control: { type: "ephemeral" }。 */ promptCacheBlocks?: Array<{ type: "text"; text: string; cache_control?: { type: "ephemeral"; }; }>; /** * Stream idle timer ms(对齐 Claude Code stream idle timer)。 * 流式响应超过此时间无新数据则超时。默认 60000(60s)。 */ streamIdleTimeoutMs?: number; /** * VCR 录制模式(对齐 Claude Code VCR)。 * 传入后请求/响应被录制到此目录,可用于回放测试。 */ vcrRecordDir?: string; } export declare function nativeStream(options: NativeStreamOptions): AsyncGenerator;