@tanstack/ai 0.2.1 → 0.3.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/README.md +1 -0
- package/dist/esm/activities/chat/index.js +206 -172
- package/dist/esm/activities/chat/index.js.map +1 -1
- package/dist/esm/activities/chat/stream/index.d.ts +1 -1
- package/dist/esm/activities/chat/stream/processor.d.ts +22 -43
- package/dist/esm/activities/chat/stream/processor.js +90 -157
- package/dist/esm/activities/chat/stream/processor.js.map +1 -1
- package/dist/esm/activities/chat/tools/tool-calls.d.ts +22 -21
- package/dist/esm/activities/chat/tools/tool-calls.js +40 -27
- package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
- package/dist/esm/activities/generateImage/index.js +41 -1
- package/dist/esm/activities/generateImage/index.js.map +1 -1
- package/dist/esm/activities/generateSpeech/index.js +33 -1
- package/dist/esm/activities/generateSpeech/index.js.map +1 -1
- package/dist/esm/activities/generateTranscription/index.js +29 -1
- package/dist/esm/activities/generateTranscription/index.js.map +1 -1
- package/dist/esm/activities/generateVideo/index.js +50 -0
- package/dist/esm/activities/generateVideo/index.js.map +1 -1
- package/dist/esm/activities/summarize/index.js +9 -8
- package/dist/esm/activities/summarize/index.js.map +1 -1
- package/dist/esm/event-client.d.ts +378 -254
- package/dist/esm/event-client.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/stream-to-response.d.ts +1 -1
- package/dist/esm/stream-to-response.js +5 -3
- package/dist/esm/stream-to-response.js.map +1 -1
- package/dist/esm/types.d.ts +162 -46
- package/package.json +1 -1
- package/src/activities/chat/index.ts +267 -191
- package/src/activities/chat/stream/index.ts +1 -5
- package/src/activities/chat/stream/processor.ts +129 -270
- package/src/activities/chat/tools/tool-calls.ts +55 -49
- package/src/activities/generateImage/index.ts +47 -2
- package/src/activities/generateSpeech/index.ts +37 -1
- package/src/activities/generateTranscription/index.ts +33 -1
- package/src/activities/generateVideo/index.ts +54 -0
- package/src/activities/summarize/index.ts +10 -9
- package/src/event-client.ts +460 -256
- package/src/index.ts +2 -3
- package/src/stream-to-response.ts +8 -6
- package/src/types.ts +209 -65
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-client.js","sources":["../../src/event-client.ts"],"sourcesContent":["import { EventClient } from '@tanstack/devtools-event-client'\n\n/**\n * Tool call states - track the lifecycle of a tool call\n * Must match @tanstack/ai-client ToolCallState\n */\ntype ToolCallState =\n | 'awaiting-input' // Received start but no arguments yet\n | 'input-streaming' // Partial arguments received\n | 'input-complete' // All arguments received\n | 'approval-requested' // Waiting for user approval\n | 'approval-responded' // User has approved/denied\n\n/**\n * Tool result states - track the lifecycle of a tool result\n * Must match @tanstack/ai-client ToolResultState\n */\ntype ToolResultState =\n | 'streaming' // Placeholder for future streamed output\n | 'complete' // Result is complete\n | 'error' // Error occurred\n\nexport interface AIDevtoolsEventMap {\n // AI Stream events - from @tanstack/ai package\n 'tanstack-ai-devtools:stream:started': {\n streamId: string\n model: string\n provider: string\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:stream:chunk:content': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-call': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n index: number\n arguments: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:tool-result': {\n streamId: string\n messageId?: string\n toolCallId: string\n result: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:done': {\n streamId: string\n messageId?: string\n finishReason: string | null\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:error': {\n streamId: string\n messageId?: string\n error: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:chunk:thinking': {\n streamId: string\n messageId?: string\n content: string\n delta?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:approval-requested': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:tool-input-available': {\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: any\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:call-completed': {\n requestId: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n result: any\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:stream:ended': {\n requestId: string\n streamId: string\n totalChunks: number\n duration: number\n timestamp: number\n }\n 'tanstack-ai-devtools:text:started': {\n requestId: string\n streamId: string\n provider: string\n model: string\n messageCount: number\n hasTools: boolean\n streaming: boolean\n timestamp: number\n clientId?: string\n toolNames?: Array<string>\n options?: Record<string, unknown>\n modelOptions?: Record<string, unknown>\n }\n 'tanstack-ai-devtools:text:completed': {\n requestId: string\n streamId: string\n model: string\n content: string\n messageId?: string\n finishReason?: string\n usage?: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n 'tanstack-ai-devtools:text:iteration': {\n requestId: string\n streamId: string\n iterationNumber: number\n messageCount: number\n toolCallCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:usage:tokens': {\n requestId: string\n streamId: string\n model: string\n messageId?: string\n usage: {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n }\n timestamp: number\n }\n\n // Summarize events\n 'tanstack-ai-devtools:summarize:started': {\n requestId: string\n model: string\n inputLength: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:summarize:completed': {\n requestId: string\n model: string\n inputLength: number\n outputLength: number\n duration: number\n timestamp: number\n }\n\n // Text Client events - from @tanstack/ai-client package\n 'tanstack-ai-devtools:client:created': {\n clientId: string\n initialMessageCount: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-appended': {\n clientId: string\n messageId: string\n role: 'user' | 'assistant' | 'system' | 'tool'\n contentPreview: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:message-sent': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:loading-changed': {\n clientId: string\n isLoading: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:client:error-changed': {\n clientId: string\n error: string | null\n timestamp: number\n }\n 'tanstack-ai-devtools:client:messages-cleared': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:reloaded': {\n clientId: string\n fromMessageIndex: number\n timestamp: number\n }\n 'tanstack-ai-devtools:client:stopped': {\n clientId: string\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:result-added': {\n clientId: string\n toolCallId: string\n toolName: string\n output: any\n state: 'output-available' | 'output-error'\n timestamp: number\n }\n 'tanstack-ai-devtools:tool:approval-responded': {\n clientId: string\n approvalId: string\n toolCallId: string\n approved: boolean\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:text-updated': {\n streamId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-call-state-changed': {\n streamId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:processor:tool-result-state-changed': {\n streamId: string\n toolCallId: string\n content: any\n state: ToolResultState\n error?: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:assistant-message-updated': {\n clientId: string\n messageId: string\n content: string\n timestamp: number\n }\n 'tanstack-ai-devtools:client:tool-call-updated': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: any\n timestamp: number\n }\n 'tanstack-ai-devtools:client:approval-requested': {\n clientId: string\n messageId: string\n toolCallId: string\n toolName: string\n input: any\n approvalId: string\n timestamp: number\n }\n}\n\nclass AiEventClient extends EventClient<AIDevtoolsEventMap> {\n constructor() {\n super({\n pluginId: 'tanstack-ai-devtools',\n })\n }\n}\n\nconst aiEventClient = new AiEventClient()\n\nexport { aiEventClient }\n"],"names":[],"mappings":";AA0RA,MAAM,sBAAsB,YAAgC;AAAA,EAC1D,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;AAEA,MAAM,gBAAgB,IAAI,cAAA;"}
|
|
1
|
+
{"version":3,"file":"event-client.js","sources":["../../src/event-client.ts"],"sourcesContent":["import { EventClient } from '@tanstack/devtools-event-client'\nimport type { MessagePart, ToolCall } from './types'\n\n/**\n * Tool call states - track the lifecycle of a tool call\n * Must match @tanstack/ai-client ToolCallState\n */\nexport type ToolCallState =\n | 'awaiting-input' // Received start but no arguments yet\n | 'input-streaming' // Partial arguments received\n | 'input-complete' // All arguments received\n | 'approval-requested' // Waiting for user approval\n | 'approval-responded' // User has approved/denied\n\n/**\n * Tool result states - track the lifecycle of a tool result\n * Must match @tanstack/ai-client ToolResultState\n */\nexport type ToolResultState =\n | 'streaming' // Placeholder for future streamed output\n | 'complete' // Result is complete\n | 'error' // Error occurred\n\nexport interface TokenUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n}\n\nexport interface ImageUsage {\n inputTokens?: number\n outputTokens?: number\n totalTokens?: number\n}\n\ninterface BaseEventContext {\n timestamp: number\n requestId?: string\n streamId?: string\n messageId?: string\n clientId?: string\n source?: 'client' | 'server'\n provider?: string\n model?: string\n systemPrompts?: Array<string>\n options?: Record<string, unknown>\n modelOptions?: Record<string, unknown>\n toolNames?: Array<string>\n messageCount?: number\n hasTools?: boolean\n streaming?: boolean\n}\n\n// ===========================\n// Text Events\n// ===========================\n\n/** Emitted when a text request starts execution. */\nexport interface TextRequestStartedEvent extends BaseEventContext {\n requestId: string\n streamId: string\n provider: string\n model: string\n messageCount: number\n hasTools: boolean\n streaming: boolean\n}\n\n/** Emitted when a text request completes with final output. */\nexport interface TextRequestCompletedEvent extends BaseEventContext {\n requestId: string\n streamId: string\n provider: string\n model: string\n content: string\n finishReason?: string\n usage?: TokenUsage\n duration?: number\n streaming: boolean\n messageCount: number\n hasTools: boolean\n}\n\n/** Emitted when a message is created (user/assistant/system/tool). */\nexport interface TextMessageCreatedEvent extends BaseEventContext {\n requestId?: string\n streamId?: string\n messageId: string\n role: 'user' | 'assistant' | 'system' | 'tool'\n content: string\n parts?: Array<MessagePart>\n toolCalls?: Array<ToolCall>\n messageIndex?: number\n}\n\n/** Emitted when a user message is created (full content). */\nexport interface TextMessageUserEvent extends TextMessageCreatedEvent {\n role: 'user'\n}\n\n/** Emitted for streaming text content chunks. */\nexport interface TextChunkContentEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n content: string\n delta?: string\n}\n\n/** Emitted for streaming tool call chunks. */\nexport interface TextChunkToolCallEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n index: number\n arguments: string\n}\n\n/** Emitted for streaming tool result chunks. */\nexport interface TextChunkToolResultEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n toolCallId: string\n result: string\n}\n\n/** Emitted for streaming thinking chunks. */\nexport interface TextChunkThinkingEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n content: string\n delta?: string\n}\n\n/** Emitted when a stream finishes. */\nexport interface TextChunkDoneEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n finishReason: string | null\n usage?: TokenUsage\n}\n\n/** Emitted on stream errors. */\nexport interface TextChunkErrorEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n error: string\n}\n\n/** Emitted when usage metrics are available for text. */\nexport interface TextUsageEvent extends BaseEventContext {\n requestId: string\n streamId: string\n messageId?: string\n model: string\n usage: TokenUsage\n}\n\n// ===========================\n// Tool Events\n// ===========================\n\n/** Emitted when tool approval is required. */\nexport interface ToolsApprovalRequestedEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: unknown\n approvalId: string\n}\n\n/** Emitted when user responds to an approval request. */\nexport interface ToolsApprovalRespondedEvent extends BaseEventContext {\n toolCallId: string\n approvalId: string\n approved: boolean\n}\n\n/** Emitted when tool input is available for client execution. */\nexport interface ToolsInputAvailableEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n input: unknown\n}\n\n/** Emitted when a tool call completes with a result. */\nexport interface ToolsCallCompletedEvent extends BaseEventContext {\n requestId?: string\n streamId: string\n messageId?: string\n toolCallId: string\n toolName: string\n result: unknown\n duration: number\n}\n\n/** Emitted when a client tool result is added. */\nexport interface ToolsResultAddedEvent extends BaseEventContext {\n toolCallId: string\n toolName: string\n output: unknown\n state: 'output-available' | 'output-error'\n}\n\n/** Emitted when tool call state changes on the client. */\nexport interface ToolsCallUpdatedEvent extends BaseEventContext {\n streamId: string\n messageId: string\n toolCallId: string\n toolName: string\n state: ToolCallState\n arguments: string\n}\n\n// ===========================\n// Summarize Events\n// ===========================\n\n/** Emitted when summarize starts. */\nexport interface SummarizeRequestStartedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n inputLength: number\n}\n\n/** Emitted when summarize completes. */\nexport interface SummarizeRequestCompletedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n inputLength: number\n outputLength: number\n duration: number\n}\n\n/** Emitted when summarize usage metrics are available. */\nexport interface SummarizeUsageEvent extends BaseEventContext {\n requestId: string\n model: string\n usage: TokenUsage\n}\n\n// ===========================\n// Image Events\n// ===========================\n\n/** Emitted when an image request starts. */\nexport interface ImageRequestStartedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n prompt: string\n numberOfImages?: number\n size?: string\n}\n\n/** Emitted when an image request completes. */\nexport interface ImageRequestCompletedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n images: Array<{ url?: string; b64Json?: string }>\n duration: number\n}\n\n/** Emitted when image usage metrics are available. */\nexport interface ImageUsageEvent extends BaseEventContext {\n requestId: string\n model: string\n usage: ImageUsage\n}\n\n// ===========================\n// Speech Events\n// ===========================\n\n/** Emitted when a speech request starts. */\nexport interface SpeechRequestStartedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n text: string\n voice?: string\n format?: string\n speed?: number\n}\n\n/** Emitted when a speech request completes. */\nexport interface SpeechRequestCompletedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n audio: string\n format: string\n duration: number\n audioDuration?: number\n contentType?: string\n}\n\n/** Emitted when speech usage metrics are available. */\nexport interface SpeechUsageEvent extends BaseEventContext {\n requestId: string\n model: string\n usage: TokenUsage\n}\n\n// ===========================\n// Transcription Events\n// ===========================\n\n/** Emitted when a transcription request starts. */\nexport interface TranscriptionRequestStartedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n language?: string\n prompt?: string\n responseFormat?: string\n}\n\n/** Emitted when a transcription request completes. */\nexport interface TranscriptionRequestCompletedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n text: string\n language?: string\n duration: number\n}\n\n/** Emitted when transcription usage metrics are available. */\nexport interface TranscriptionUsageEvent extends BaseEventContext {\n requestId: string\n model: string\n usage: TokenUsage\n}\n\n// ===========================\n// Video Events\n// ===========================\n\n/** Emitted when a video request starts. */\nexport interface VideoRequestStartedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n requestType: 'create' | 'status' | 'url'\n jobId?: string\n prompt?: string\n size?: string\n duration?: number\n}\n\n/** Emitted when a video request completes. */\nexport interface VideoRequestCompletedEvent extends BaseEventContext {\n requestId: string\n provider: string\n model: string\n requestType: 'create' | 'status' | 'url'\n jobId?: string\n status?: 'pending' | 'processing' | 'completed' | 'failed'\n progress?: number\n url?: string\n error?: string\n duration: number\n}\n\n/** Emitted when video usage metrics are available. */\nexport interface VideoUsageEvent extends BaseEventContext {\n requestId: string\n model: string\n usage: TokenUsage\n}\n\n// ===========================\n// Client Events\n// ===========================\n\n/** Emitted when a client is created. */\nexport interface ClientCreatedEvent {\n clientId: string\n initialMessageCount: number\n timestamp: number\n}\n\n/** Emitted when client loading state changes. */\nexport interface ClientLoadingChangedEvent {\n clientId: string\n isLoading: boolean\n timestamp: number\n}\n\n/** Emitted when client error state changes. */\nexport interface ClientErrorChangedEvent {\n clientId: string\n error: string | null\n timestamp: number\n}\n\n/** Emitted when client messages are cleared. */\nexport interface ClientMessagesClearedEvent {\n clientId: string\n timestamp: number\n}\n\n/** Emitted when client is reloaded. */\nexport interface ClientReloadedEvent {\n clientId: string\n fromMessageIndex: number\n timestamp: number\n}\n\n/** Emitted when client stops. */\nexport interface ClientStoppedEvent {\n clientId: string\n timestamp: number\n}\n\nexport interface AIDevtoolsEventMap {\n // Text events\n 'tanstack-ai-devtools:text:request:started': TextRequestStartedEvent\n 'tanstack-ai-devtools:text:request:completed': TextRequestCompletedEvent\n 'tanstack-ai-devtools:text:message:created': TextMessageCreatedEvent\n 'tanstack-ai-devtools:text:message:user': TextMessageUserEvent\n 'tanstack-ai-devtools:text:chunk:content': TextChunkContentEvent\n 'tanstack-ai-devtools:text:chunk:tool-call': TextChunkToolCallEvent\n 'tanstack-ai-devtools:text:chunk:tool-result': TextChunkToolResultEvent\n 'tanstack-ai-devtools:text:chunk:thinking': TextChunkThinkingEvent\n 'tanstack-ai-devtools:text:chunk:done': TextChunkDoneEvent\n 'tanstack-ai-devtools:text:chunk:error': TextChunkErrorEvent\n 'tanstack-ai-devtools:text:usage': TextUsageEvent\n\n // Tool events\n 'tanstack-ai-devtools:tools:approval:requested': ToolsApprovalRequestedEvent\n 'tanstack-ai-devtools:tools:approval:responded': ToolsApprovalRespondedEvent\n 'tanstack-ai-devtools:tools:input:available': ToolsInputAvailableEvent\n 'tanstack-ai-devtools:tools:call:completed': ToolsCallCompletedEvent\n 'tanstack-ai-devtools:tools:result:added': ToolsResultAddedEvent\n 'tanstack-ai-devtools:tools:call:updated': ToolsCallUpdatedEvent\n\n // Summarize events\n 'tanstack-ai-devtools:summarize:request:started': SummarizeRequestStartedEvent\n 'tanstack-ai-devtools:summarize:request:completed': SummarizeRequestCompletedEvent\n 'tanstack-ai-devtools:summarize:usage': SummarizeUsageEvent\n\n // Image events\n 'tanstack-ai-devtools:image:request:started': ImageRequestStartedEvent\n 'tanstack-ai-devtools:image:request:completed': ImageRequestCompletedEvent\n 'tanstack-ai-devtools:image:usage': ImageUsageEvent\n\n // Speech events\n 'tanstack-ai-devtools:speech:request:started': SpeechRequestStartedEvent\n 'tanstack-ai-devtools:speech:request:completed': SpeechRequestCompletedEvent\n 'tanstack-ai-devtools:speech:usage': SpeechUsageEvent\n\n // Transcription events\n 'tanstack-ai-devtools:transcription:request:started': TranscriptionRequestStartedEvent\n 'tanstack-ai-devtools:transcription:request:completed': TranscriptionRequestCompletedEvent\n 'tanstack-ai-devtools:transcription:usage': TranscriptionUsageEvent\n\n // Video events\n 'tanstack-ai-devtools:video:request:started': VideoRequestStartedEvent\n 'tanstack-ai-devtools:video:request:completed': VideoRequestCompletedEvent\n 'tanstack-ai-devtools:video:usage': VideoUsageEvent\n\n // Client events\n 'tanstack-ai-devtools:client:created': ClientCreatedEvent\n 'tanstack-ai-devtools:client:loading:changed': ClientLoadingChangedEvent\n 'tanstack-ai-devtools:client:error:changed': ClientErrorChangedEvent\n 'tanstack-ai-devtools:client:messages:cleared': ClientMessagesClearedEvent\n 'tanstack-ai-devtools:client:reloaded': ClientReloadedEvent\n 'tanstack-ai-devtools:client:stopped': ClientStoppedEvent\n}\n\nclass AiEventClient extends EventClient<AIDevtoolsEventMap> {\n constructor() {\n super({\n pluginId: 'tanstack-ai-devtools',\n })\n }\n}\n\nconst aiEventClient = new AiEventClient()\n\nexport { aiEventClient }\n"],"names":[],"mappings":";AAseA,MAAM,sBAAsB,YAAgC;AAAA,EAC1D,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;AAEA,MAAM,gBAAgB,IAAI,cAAA;"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { streamToText, toServerSentEventsStream, toServerSentEventsResponse, toH
|
|
|
12
12
|
export { ToolCallManager } from './activities/chat/tools/tool-calls.js';
|
|
13
13
|
export { maxIterations, untilFinishReason, combineStrategies, } from './activities/chat/agent-loop-strategies.js';
|
|
14
14
|
export * from './types.js';
|
|
15
|
-
export
|
|
15
|
+
export * from './event-client.js';
|
|
16
16
|
export { convertMessagesToModelMessages, generateMessageId, uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, } from './activities/chat/messages.js';
|
|
17
17
|
export { StreamProcessor, createReplayStream, ImmediateStrategy, PunctuationStrategy, BatchStrategy, WordBoundaryStrategy, CompositeStrategy, PartialJSONParser, defaultJSONParser, parsePartialJSON, } from './activities/chat/stream/index.js';
|
|
18
|
-
export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents,
|
|
18
|
+
export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorOptions, ToolCallState, ToolResultState, JSONParser, } from './activities/chat/stream/index.js';
|
|
@@ -2,7 +2,7 @@ import { StreamChunk } from './types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Collect all text content from a StreamChunk async iterable and return as a string.
|
|
4
4
|
*
|
|
5
|
-
* This function consumes the entire stream, accumulating content from
|
|
5
|
+
* This function consumes the entire stream, accumulating content from TEXT_MESSAGE_CONTENT events,
|
|
6
6
|
* and returns the final concatenated text.
|
|
7
7
|
*
|
|
8
8
|
* @param stream - AsyncIterable of StreamChunks from chat()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
async function streamToText(stream) {
|
|
2
2
|
let accumulatedContent = "";
|
|
3
3
|
for await (const chunk of stream) {
|
|
4
|
-
if (chunk.type === "
|
|
4
|
+
if (chunk.type === "TEXT_MESSAGE_CONTENT" && chunk.delta) {
|
|
5
5
|
accumulatedContent += chunk.delta;
|
|
6
6
|
}
|
|
7
7
|
}
|
|
@@ -32,7 +32,8 @@ function toServerSentEventsStream(stream, abortController) {
|
|
|
32
32
|
controller.enqueue(
|
|
33
33
|
encoder.encode(
|
|
34
34
|
`data: ${JSON.stringify({
|
|
35
|
-
type: "
|
|
35
|
+
type: "RUN_ERROR",
|
|
36
|
+
timestamp: Date.now(),
|
|
36
37
|
error: {
|
|
37
38
|
message: error.message || "Unknown error occurred",
|
|
38
39
|
code: error.code
|
|
@@ -91,7 +92,8 @@ function toHttpStream(stream, abortController) {
|
|
|
91
92
|
controller.enqueue(
|
|
92
93
|
encoder.encode(
|
|
93
94
|
`${JSON.stringify({
|
|
94
|
-
type: "
|
|
95
|
+
type: "RUN_ERROR",
|
|
96
|
+
timestamp: Date.now(),
|
|
95
97
|
error: {
|
|
96
98
|
message: error.message || "Unknown error occurred",
|
|
97
99
|
code: error.code
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-to-response.js","sources":["../../src/stream-to-response.ts"],"sourcesContent":["import type { StreamChunk } from './types'\n\n/**\n * Collect all text content from a StreamChunk async iterable and return as a string.\n *\n * This function consumes the entire stream, accumulating content from 'content' type chunks,\n * and returns the final concatenated text.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @returns Promise<string> - The accumulated text content\n *\n * @example\n * ```typescript\n * const stream = chat({\n * adapter: openaiText(),\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * const text = await streamToText(stream);\n * console.log(text); // \"Hello! How can I help you today?\"\n * ```\n */\nexport async function streamToText(\n stream: AsyncIterable<StreamChunk>,\n): Promise<string> {\n let accumulatedContent = ''\n\n for await (const chunk of stream) {\n if (chunk.type === 'content' && chunk.delta) {\n accumulatedContent += chunk.delta\n }\n }\n\n return accumulatedContent\n}\n\n/**\n * Convert a StreamChunk async iterable to a ReadableStream in Server-Sent Events format\n *\n * This creates a ReadableStream that emits chunks in SSE format:\n * - Each chunk is prefixed with \"data: \"\n * - Each chunk is followed by \"\\n\\n\"\n * - Stream ends with \"data: [DONE]\\n\\n\"\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param abortController - Optional AbortController to abort when stream is cancelled\n * @returns ReadableStream in Server-Sent Events format\n */\nexport function toServerSentEventsStream(\n stream: AsyncIterable<StreamChunk>,\n abortController?: AbortController,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n // Check if stream was cancelled/aborted\n if (abortController?.signal.aborted) {\n break\n }\n\n // Send each chunk as Server-Sent Events format\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`),\n )\n }\n\n // Send completion marker\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'))\n controller.close()\n } catch (error: any) {\n // Don't send error if aborted\n if (abortController?.signal.aborted) {\n controller.close()\n return\n }\n\n // Send error chunk\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: 'error',\n error: {\n message: error.message || 'Unknown error occurred',\n code: error.code,\n },\n })}\\n\\n`,\n ),\n )\n controller.close()\n }\n },\n cancel() {\n // When the ReadableStream is cancelled (e.g., client disconnects),\n // abort the underlying stream\n if (abortController) {\n abortController.abort()\n }\n },\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a Response in Server-Sent Events format\n *\n * This creates a Response that emits chunks in SSE format:\n * - Each chunk is prefixed with \"data: \"\n * - Each chunk is followed by \"\\n\\n\"\n * - Stream ends with \"data: [DONE]\\n\\n\"\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param init - Optional Response initialization options (including `abortController`)\n * @returns Response in Server-Sent Events format\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * return toServerSentEventsResponse(stream, { abortController });\n * ```\n */\nexport function toServerSentEventsResponse(\n stream: AsyncIterable<StreamChunk>,\n init?: ResponseInit & { abortController?: AbortController },\n): Response {\n const { headers, abortController, ...responseInit } = init ?? {}\n\n // Start with default SSE headers\n const mergedHeaders = new Headers({\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n })\n\n // Override with user headers if provided, handling all HeadersInit forms:\n // Headers instance, string[][], or plain object\n if (headers) {\n const userHeaders = new Headers(headers)\n userHeaders.forEach((value, key) => {\n mergedHeaders.set(key, value)\n })\n }\n\n return new Response(toServerSentEventsStream(stream, abortController), {\n ...responseInit,\n headers: mergedHeaders,\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a ReadableStream in HTTP stream format (newline-delimited JSON)\n *\n * This creates a ReadableStream that emits chunks as newline-delimited JSON:\n * - Each chunk is JSON.stringify'd and followed by \"\\n\"\n * - No SSE formatting (no \"data: \" prefix)\n *\n * This format is compatible with `fetchHttpStream` connection adapter.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param abortController - Optional AbortController to abort when stream is cancelled\n * @returns ReadableStream in HTTP stream format (newline-delimited JSON)\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * const readableStream = toHttpStream(stream);\n * // Use with Response for HTTP streaming (not SSE)\n * return new Response(readableStream, {\n * headers: { 'Content-Type': 'application/x-ndjson' }\n * });\n * ```\n */\nexport function toHttpStream(\n stream: AsyncIterable<StreamChunk>,\n abortController?: AbortController,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n // Check if stream was cancelled/aborted\n if (abortController?.signal.aborted) {\n break\n }\n\n // Send each chunk as newline-delimited JSON\n controller.enqueue(encoder.encode(`${JSON.stringify(chunk)}\\n`))\n }\n\n controller.close()\n } catch (error: any) {\n // Don't send error if aborted\n if (abortController?.signal.aborted) {\n controller.close()\n return\n }\n\n // Send error chunk\n controller.enqueue(\n encoder.encode(\n `${JSON.stringify({\n type: 'error',\n error: {\n message: error.message || 'Unknown error occurred',\n code: error.code,\n },\n })}\\n`,\n ),\n )\n controller.close()\n }\n },\n cancel() {\n // When the ReadableStream is cancelled (e.g., client disconnects),\n // abort the underlying stream\n if (abortController) {\n abortController.abort()\n }\n },\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a Response in HTTP stream format (newline-delimited JSON)\n *\n * This creates a Response that emits chunks in HTTP stream format:\n * - Each chunk is JSON.stringify'd and followed by \"\\n\"\n * - No SSE formatting (no \"data: \" prefix)\n *\n * This format is compatible with `fetchHttpStream` connection adapter.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param init - Optional Response initialization options (including `abortController`)\n * @returns Response in HTTP stream format (newline-delimited JSON)\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * return toHttpResponse(stream, { abortController });\n * ```\n */\nexport function toHttpResponse(\n stream: AsyncIterable<StreamChunk>,\n init?: ResponseInit & { abortController?: AbortController },\n): Response {\n return new Response(toHttpStream(stream, init?.abortController), {\n ...init,\n })\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream-to-response.js","sources":["../../src/stream-to-response.ts"],"sourcesContent":["import type { StreamChunk } from './types'\n\n/**\n * Collect all text content from a StreamChunk async iterable and return as a string.\n *\n * This function consumes the entire stream, accumulating content from TEXT_MESSAGE_CONTENT events,\n * and returns the final concatenated text.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @returns Promise<string> - The accumulated text content\n *\n * @example\n * ```typescript\n * const stream = chat({\n * adapter: openaiText(),\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n * const text = await streamToText(stream);\n * console.log(text); // \"Hello! How can I help you today?\"\n * ```\n */\nexport async function streamToText(\n stream: AsyncIterable<StreamChunk>,\n): Promise<string> {\n let accumulatedContent = ''\n\n for await (const chunk of stream) {\n if (chunk.type === 'TEXT_MESSAGE_CONTENT' && chunk.delta) {\n accumulatedContent += chunk.delta\n }\n }\n\n return accumulatedContent\n}\n\n/**\n * Convert a StreamChunk async iterable to a ReadableStream in Server-Sent Events format\n *\n * This creates a ReadableStream that emits chunks in SSE format:\n * - Each chunk is prefixed with \"data: \"\n * - Each chunk is followed by \"\\n\\n\"\n * - Stream ends with \"data: [DONE]\\n\\n\"\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param abortController - Optional AbortController to abort when stream is cancelled\n * @returns ReadableStream in Server-Sent Events format\n */\nexport function toServerSentEventsStream(\n stream: AsyncIterable<StreamChunk>,\n abortController?: AbortController,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n // Check if stream was cancelled/aborted\n if (abortController?.signal.aborted) {\n break\n }\n\n // Send each chunk as Server-Sent Events format\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`),\n )\n }\n\n // Send completion marker\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'))\n controller.close()\n } catch (error: any) {\n // Don't send error if aborted\n if (abortController?.signal.aborted) {\n controller.close()\n return\n }\n\n // Send error event (AG-UI RUN_ERROR)\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: 'RUN_ERROR',\n timestamp: Date.now(),\n error: {\n message: error.message || 'Unknown error occurred',\n code: error.code,\n },\n })}\\n\\n`,\n ),\n )\n controller.close()\n }\n },\n cancel() {\n // When the ReadableStream is cancelled (e.g., client disconnects),\n // abort the underlying stream\n if (abortController) {\n abortController.abort()\n }\n },\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a Response in Server-Sent Events format\n *\n * This creates a Response that emits chunks in SSE format:\n * - Each chunk is prefixed with \"data: \"\n * - Each chunk is followed by \"\\n\\n\"\n * - Stream ends with \"data: [DONE]\\n\\n\"\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param init - Optional Response initialization options (including `abortController`)\n * @returns Response in Server-Sent Events format\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * return toServerSentEventsResponse(stream, { abortController });\n * ```\n */\nexport function toServerSentEventsResponse(\n stream: AsyncIterable<StreamChunk>,\n init?: ResponseInit & { abortController?: AbortController },\n): Response {\n const { headers, abortController, ...responseInit } = init ?? {}\n\n // Start with default SSE headers\n const mergedHeaders = new Headers({\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n })\n\n // Override with user headers if provided, handling all HeadersInit forms:\n // Headers instance, string[][], or plain object\n if (headers) {\n const userHeaders = new Headers(headers)\n userHeaders.forEach((value, key) => {\n mergedHeaders.set(key, value)\n })\n }\n\n return new Response(toServerSentEventsStream(stream, abortController), {\n ...responseInit,\n headers: mergedHeaders,\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a ReadableStream in HTTP stream format (newline-delimited JSON)\n *\n * This creates a ReadableStream that emits chunks as newline-delimited JSON:\n * - Each chunk is JSON.stringify'd and followed by \"\\n\"\n * - No SSE formatting (no \"data: \" prefix)\n *\n * This format is compatible with `fetchHttpStream` connection adapter.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param abortController - Optional AbortController to abort when stream is cancelled\n * @returns ReadableStream in HTTP stream format (newline-delimited JSON)\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * const readableStream = toHttpStream(stream);\n * // Use with Response for HTTP streaming (not SSE)\n * return new Response(readableStream, {\n * headers: { 'Content-Type': 'application/x-ndjson' }\n * });\n * ```\n */\nexport function toHttpStream(\n stream: AsyncIterable<StreamChunk>,\n abortController?: AbortController,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n // Check if stream was cancelled/aborted\n if (abortController?.signal.aborted) {\n break\n }\n\n // Send each chunk as newline-delimited JSON\n controller.enqueue(encoder.encode(`${JSON.stringify(chunk)}\\n`))\n }\n\n controller.close()\n } catch (error: any) {\n // Don't send error if aborted\n if (abortController?.signal.aborted) {\n controller.close()\n return\n }\n\n // Send error event (AG-UI RUN_ERROR)\n controller.enqueue(\n encoder.encode(\n `${JSON.stringify({\n type: 'RUN_ERROR',\n timestamp: Date.now(),\n error: {\n message: error.message || 'Unknown error occurred',\n code: error.code,\n },\n })}\\n`,\n ),\n )\n controller.close()\n }\n },\n cancel() {\n // When the ReadableStream is cancelled (e.g., client disconnects),\n // abort the underlying stream\n if (abortController) {\n abortController.abort()\n }\n },\n })\n}\n\n/**\n * Convert a StreamChunk async iterable to a Response in HTTP stream format (newline-delimited JSON)\n *\n * This creates a Response that emits chunks in HTTP stream format:\n * - Each chunk is JSON.stringify'd and followed by \"\\n\"\n * - No SSE formatting (no \"data: \" prefix)\n *\n * This format is compatible with `fetchHttpStream` connection adapter.\n *\n * @param stream - AsyncIterable of StreamChunks from chat()\n * @param init - Optional Response initialization options (including `abortController`)\n * @returns Response in HTTP stream format (newline-delimited JSON)\n *\n * @example\n * ```typescript\n * const stream = chat({ adapter: openaiText(), model: \"gpt-4o\", messages: [...] });\n * return toHttpResponse(stream, { abortController });\n * ```\n */\nexport function toHttpResponse(\n stream: AsyncIterable<StreamChunk>,\n init?: ResponseInit & { abortController?: AbortController },\n): Response {\n return new Response(toHttpStream(stream, init?.abortController), {\n ...init,\n })\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -547,77 +547,193 @@ export interface TextOptions<TProviderOptionsSuperset extends Record<string, any
|
|
|
547
547
|
*/
|
|
548
548
|
abortController?: AbortController;
|
|
549
549
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
550
|
+
/**
|
|
551
|
+
* AG-UI Protocol event types.
|
|
552
|
+
* Based on the AG-UI specification for agent-user interaction.
|
|
553
|
+
* @see https://docs.ag-ui.com/concepts/events
|
|
554
|
+
*/
|
|
555
|
+
export type AGUIEventType = 'RUN_STARTED' | 'RUN_FINISHED' | 'RUN_ERROR' | 'TEXT_MESSAGE_START' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END' | 'TOOL_CALL_START' | 'TOOL_CALL_ARGS' | 'TOOL_CALL_END' | 'STEP_STARTED' | 'STEP_FINISHED' | 'STATE_SNAPSHOT' | 'STATE_DELTA' | 'CUSTOM';
|
|
556
|
+
/**
|
|
557
|
+
* Stream chunk/event types (AG-UI protocol).
|
|
558
|
+
*/
|
|
559
|
+
export type StreamChunkType = AGUIEventType;
|
|
560
|
+
/**
|
|
561
|
+
* Base structure for AG-UI events.
|
|
562
|
+
* Extends AG-UI spec with TanStack AI additions (model field).
|
|
563
|
+
*/
|
|
564
|
+
export interface BaseAGUIEvent {
|
|
565
|
+
type: AGUIEventType;
|
|
555
566
|
timestamp: number;
|
|
567
|
+
/** Model identifier for multi-model support */
|
|
568
|
+
model?: string;
|
|
569
|
+
/** Original provider event for debugging/advanced use cases */
|
|
570
|
+
rawEvent?: unknown;
|
|
556
571
|
}
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
type: 'function';
|
|
568
|
-
function: {
|
|
569
|
-
name: string;
|
|
570
|
-
arguments: string;
|
|
571
|
-
};
|
|
572
|
-
};
|
|
573
|
-
index: number;
|
|
574
|
-
}
|
|
575
|
-
export interface ToolResultStreamChunk extends BaseStreamChunk {
|
|
576
|
-
type: 'tool_result';
|
|
577
|
-
toolCallId: string;
|
|
578
|
-
content: string;
|
|
572
|
+
/**
|
|
573
|
+
* Emitted when a run starts.
|
|
574
|
+
* This is the first event in any streaming response.
|
|
575
|
+
*/
|
|
576
|
+
export interface RunStartedEvent extends BaseAGUIEvent {
|
|
577
|
+
type: 'RUN_STARTED';
|
|
578
|
+
/** Unique identifier for this run */
|
|
579
|
+
runId: string;
|
|
580
|
+
/** Optional thread/conversation ID */
|
|
581
|
+
threadId?: string;
|
|
579
582
|
}
|
|
580
|
-
|
|
581
|
-
|
|
583
|
+
/**
|
|
584
|
+
* Emitted when a run completes successfully.
|
|
585
|
+
*/
|
|
586
|
+
export interface RunFinishedEvent extends BaseAGUIEvent {
|
|
587
|
+
type: 'RUN_FINISHED';
|
|
588
|
+
/** Run identifier */
|
|
589
|
+
runId: string;
|
|
590
|
+
/** Why the generation stopped */
|
|
582
591
|
finishReason: 'stop' | 'length' | 'content_filter' | 'tool_calls' | null;
|
|
592
|
+
/** Token usage statistics */
|
|
583
593
|
usage?: {
|
|
584
594
|
promptTokens: number;
|
|
585
595
|
completionTokens: number;
|
|
586
596
|
totalTokens: number;
|
|
587
597
|
};
|
|
588
598
|
}
|
|
589
|
-
|
|
590
|
-
|
|
599
|
+
/**
|
|
600
|
+
* Emitted when an error occurs during a run.
|
|
601
|
+
*/
|
|
602
|
+
export interface RunErrorEvent extends BaseAGUIEvent {
|
|
603
|
+
type: 'RUN_ERROR';
|
|
604
|
+
/** Run identifier (if available) */
|
|
605
|
+
runId?: string;
|
|
606
|
+
/** Error details */
|
|
591
607
|
error: {
|
|
592
608
|
message: string;
|
|
593
609
|
code?: string;
|
|
594
610
|
};
|
|
595
611
|
}
|
|
596
|
-
|
|
597
|
-
|
|
612
|
+
/**
|
|
613
|
+
* Emitted when a text message starts.
|
|
614
|
+
*/
|
|
615
|
+
export interface TextMessageStartEvent extends BaseAGUIEvent {
|
|
616
|
+
type: 'TEXT_MESSAGE_START';
|
|
617
|
+
/** Unique identifier for this message */
|
|
618
|
+
messageId: string;
|
|
619
|
+
/** Role is always assistant for generated messages */
|
|
620
|
+
role: 'assistant';
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Emitted when text content is generated (streaming tokens).
|
|
624
|
+
*/
|
|
625
|
+
export interface TextMessageContentEvent extends BaseAGUIEvent {
|
|
626
|
+
type: 'TEXT_MESSAGE_CONTENT';
|
|
627
|
+
/** Message identifier */
|
|
628
|
+
messageId: string;
|
|
629
|
+
/** The incremental content token */
|
|
630
|
+
delta: string;
|
|
631
|
+
/** Full accumulated content so far */
|
|
632
|
+
content?: string;
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Emitted when a text message completes.
|
|
636
|
+
*/
|
|
637
|
+
export interface TextMessageEndEvent extends BaseAGUIEvent {
|
|
638
|
+
type: 'TEXT_MESSAGE_END';
|
|
639
|
+
/** Message identifier */
|
|
640
|
+
messageId: string;
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Emitted when a tool call starts.
|
|
644
|
+
*/
|
|
645
|
+
export interface ToolCallStartEvent extends BaseAGUIEvent {
|
|
646
|
+
type: 'TOOL_CALL_START';
|
|
647
|
+
/** Unique identifier for this tool call */
|
|
598
648
|
toolCallId: string;
|
|
649
|
+
/** Name of the tool being called */
|
|
599
650
|
toolName: string;
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
651
|
+
/** Index for parallel tool calls */
|
|
652
|
+
index?: number;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* Emitted when tool call arguments are streaming.
|
|
656
|
+
*/
|
|
657
|
+
export interface ToolCallArgsEvent extends BaseAGUIEvent {
|
|
658
|
+
type: 'TOOL_CALL_ARGS';
|
|
659
|
+
/** Tool call identifier */
|
|
660
|
+
toolCallId: string;
|
|
661
|
+
/** Incremental JSON arguments delta */
|
|
662
|
+
delta: string;
|
|
663
|
+
/** Full accumulated arguments so far */
|
|
664
|
+
args?: string;
|
|
605
665
|
}
|
|
606
|
-
|
|
607
|
-
|
|
666
|
+
/**
|
|
667
|
+
* Emitted when a tool call completes.
|
|
668
|
+
*/
|
|
669
|
+
export interface ToolCallEndEvent extends BaseAGUIEvent {
|
|
670
|
+
type: 'TOOL_CALL_END';
|
|
671
|
+
/** Tool call identifier */
|
|
608
672
|
toolCallId: string;
|
|
673
|
+
/** Name of the tool */
|
|
609
674
|
toolName: string;
|
|
610
|
-
input
|
|
675
|
+
/** Final parsed input arguments */
|
|
676
|
+
input?: unknown;
|
|
677
|
+
/** Tool execution result (if executed) */
|
|
678
|
+
result?: string;
|
|
611
679
|
}
|
|
612
|
-
|
|
613
|
-
|
|
680
|
+
/**
|
|
681
|
+
* Emitted when a thinking/reasoning step starts.
|
|
682
|
+
*/
|
|
683
|
+
export interface StepStartedEvent extends BaseAGUIEvent {
|
|
684
|
+
type: 'STEP_STARTED';
|
|
685
|
+
/** Unique identifier for this step */
|
|
686
|
+
stepId: string;
|
|
687
|
+
/** Type of step (e.g., 'thinking', 'planning') */
|
|
688
|
+
stepType?: string;
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Emitted when a thinking/reasoning step finishes.
|
|
692
|
+
*/
|
|
693
|
+
export interface StepFinishedEvent extends BaseAGUIEvent {
|
|
694
|
+
type: 'STEP_FINISHED';
|
|
695
|
+
/** Step identifier */
|
|
696
|
+
stepId: string;
|
|
697
|
+
/** Incremental thinking content */
|
|
614
698
|
delta?: string;
|
|
615
|
-
content
|
|
699
|
+
/** Full accumulated thinking content */
|
|
700
|
+
content?: string;
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Emitted to provide a full state snapshot.
|
|
704
|
+
*/
|
|
705
|
+
export interface StateSnapshotEvent extends BaseAGUIEvent {
|
|
706
|
+
type: 'STATE_SNAPSHOT';
|
|
707
|
+
/** The complete state object */
|
|
708
|
+
state: Record<string, unknown>;
|
|
616
709
|
}
|
|
617
710
|
/**
|
|
618
|
-
*
|
|
711
|
+
* Emitted to provide an incremental state update.
|
|
712
|
+
*/
|
|
713
|
+
export interface StateDeltaEvent extends BaseAGUIEvent {
|
|
714
|
+
type: 'STATE_DELTA';
|
|
715
|
+
/** The state changes to apply */
|
|
716
|
+
delta: Record<string, unknown>;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Custom event for extensibility.
|
|
720
|
+
*/
|
|
721
|
+
export interface CustomEvent extends BaseAGUIEvent {
|
|
722
|
+
type: 'CUSTOM';
|
|
723
|
+
/** Custom event name */
|
|
724
|
+
name: string;
|
|
725
|
+
/** Custom event data */
|
|
726
|
+
data?: unknown;
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Union of all AG-UI events.
|
|
730
|
+
*/
|
|
731
|
+
export type AGUIEvent = RunStartedEvent | RunFinishedEvent | RunErrorEvent | TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | StepStartedEvent | StepFinishedEvent | StateSnapshotEvent | StateDeltaEvent | CustomEvent;
|
|
732
|
+
/**
|
|
733
|
+
* Chunk returned by the SDK during streaming chat completions.
|
|
734
|
+
* Uses the AG-UI protocol event format.
|
|
619
735
|
*/
|
|
620
|
-
export type StreamChunk =
|
|
736
|
+
export type StreamChunk = AGUIEvent;
|
|
621
737
|
export interface TextCompletionChunk {
|
|
622
738
|
id: string;
|
|
623
739
|
model: string;
|