@tanstack/ai 0.0.1 → 0.0.3
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 -1
- package/dist/esm/base-adapter.d.ts +1 -0
- package/dist/esm/base-adapter.js.map +1 -1
- package/dist/esm/event-client.d.ts +0 -27
- package/dist/esm/event-client.js +0 -49
- package/dist/esm/event-client.js.map +1 -1
- package/dist/esm/types.d.ts +13 -8
- package/package.json +2 -2
- package/src/base-adapter.ts +1 -0
- package/src/event-client.ts +0 -80
- package/src/types.ts +20 -7
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ We're looking for TanStack AI Partners to join our mission! Partner with us to p
|
|
|
115
115
|
|
|
116
116
|
- <a href="https://github.com/tanstack/config"><b>TanStack Config</b></a> – Tooling for JS/TS packages
|
|
117
117
|
- <a href="https://github.com/tanstack/db"><b>TanStack DB</b></a> – Reactive sync client store
|
|
118
|
-
- <a href="https://github.com/tanstack/devtools">TanStack Devtools</a> – Unified devtools panel
|
|
118
|
+
- <a href="https://github.com/tanstack/devtools"><b>TanStack Devtools</b></a> – Unified devtools panel
|
|
119
119
|
- <a href="https://github.com/tanstack/form"><b>TanStack Form</b></a> – Type‑safe form state
|
|
120
120
|
- <a href="https://github.com/tanstack/pacer"><b>TanStack Pacer</b></a> – Debouncing, throttling, batching
|
|
121
121
|
- <a href="https://github.com/tanstack/query"><b>TanStack Query</b></a> – Async state & caching
|
|
@@ -12,6 +12,7 @@ import { AIAdapter, AIAdapterConfig, ChatOptions, DefaultMessageMetadataByModali
|
|
|
12
12
|
* - TMessageMetadataByModality: Map from modality type to adapter-specific metadata types
|
|
13
13
|
*/
|
|
14
14
|
export declare abstract class BaseAdapter<TChatModels extends ReadonlyArray<string> = ReadonlyArray<string>, TEmbeddingModels extends ReadonlyArray<string> = ReadonlyArray<string>, TChatProviderOptions extends Record<string, any> = Record<string, any>, TEmbeddingProviderOptions extends Record<string, any> = Record<string, any>, TModelProviderOptionsByName extends Record<string, any> = Record<string, any>, TModelInputModalitiesByName extends Record<string, ReadonlyArray<Modality>> = Record<string, ReadonlyArray<Modality>>, TMessageMetadataByModality extends {
|
|
15
|
+
text: unknown;
|
|
15
16
|
image: unknown;
|
|
16
17
|
audio: unknown;
|
|
17
18
|
video: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-adapter.js","sources":["../../src/base-adapter.ts"],"sourcesContent":["import type {\n AIAdapter,\n AIAdapterConfig,\n ChatOptions,\n DefaultMessageMetadataByModality,\n EmbeddingOptions,\n EmbeddingResult,\n Modality,\n StreamChunk,\n SummarizationOptions,\n SummarizationResult,\n} from './types'\n\n/**\n * Base adapter class with support for endpoint-specific models and provider options.\n *\n * Generic parameters:\n * - TChatModels: Models that support chat/text completion\n * - TEmbeddingModels: Models that support embeddings\n * - TChatProviderOptions: Provider-specific options for chat endpoint\n * - TEmbeddingProviderOptions: Provider-specific options for embedding endpoint\n * - TModelProviderOptionsByName: Provider-specific options for model by name\n * - TModelInputModalitiesByName: Map from model name to its supported input modalities\n * - TMessageMetadataByModality: Map from modality type to adapter-specific metadata types\n */\nexport abstract class BaseAdapter<\n TChatModels extends ReadonlyArray<string> = ReadonlyArray<string>,\n TEmbeddingModels extends ReadonlyArray<string> = ReadonlyArray<string>,\n TChatProviderOptions extends Record<string, any> = Record<string, any>,\n TEmbeddingProviderOptions extends Record<string, any> = Record<string, any>,\n TModelProviderOptionsByName extends Record<string, any> = Record<string, any>,\n TModelInputModalitiesByName extends Record<\n string,\n ReadonlyArray<Modality>\n > = Record<string, ReadonlyArray<Modality>>,\n TMessageMetadataByModality extends {\n image: unknown\n audio: unknown\n video: unknown\n document: unknown\n } = DefaultMessageMetadataByModality,\n> implements\n AIAdapter<\n TChatModels,\n TEmbeddingModels,\n TChatProviderOptions,\n TEmbeddingProviderOptions,\n TModelProviderOptionsByName,\n TModelInputModalitiesByName,\n TMessageMetadataByModality\n >\n{\n abstract name: string\n abstract models: TChatModels\n embeddingModels?: TEmbeddingModels\n protected config: AIAdapterConfig\n\n // These properties are used for type inference only, never assigned at runtime\n _providerOptions?: TChatProviderOptions\n _chatProviderOptions?: TChatProviderOptions\n _embeddingProviderOptions?: TEmbeddingProviderOptions\n // Type-only map; concrete adapters should override this with a precise type\n _modelProviderOptionsByName!: TModelProviderOptionsByName\n // Type-only map for model input modalities; concrete adapters should override this\n _modelInputModalitiesByName?: TModelInputModalitiesByName\n // Type-only map for message metadata types; concrete adapters should override this\n _messageMetadataByModality?: TMessageMetadataByModality\n\n constructor(config: AIAdapterConfig = {}) {\n this.config = config\n }\n\n abstract chatStream(options: ChatOptions): AsyncIterable<StreamChunk>\n\n abstract summarize(\n options: SummarizationOptions,\n ): Promise<SummarizationResult>\n abstract createEmbeddings(options: EmbeddingOptions): Promise<EmbeddingResult>\n\n protected generateId(): string {\n return `${this.name}-${Date.now()}-${Math.random()\n .toString(36)\n .substring(7)}`\n }\n}\n"],"names":[],"mappings":"AAyBO,MAAe,
|
|
1
|
+
{"version":3,"file":"base-adapter.js","sources":["../../src/base-adapter.ts"],"sourcesContent":["import type {\n AIAdapter,\n AIAdapterConfig,\n ChatOptions,\n DefaultMessageMetadataByModality,\n EmbeddingOptions,\n EmbeddingResult,\n Modality,\n StreamChunk,\n SummarizationOptions,\n SummarizationResult,\n} from './types'\n\n/**\n * Base adapter class with support for endpoint-specific models and provider options.\n *\n * Generic parameters:\n * - TChatModels: Models that support chat/text completion\n * - TEmbeddingModels: Models that support embeddings\n * - TChatProviderOptions: Provider-specific options for chat endpoint\n * - TEmbeddingProviderOptions: Provider-specific options for embedding endpoint\n * - TModelProviderOptionsByName: Provider-specific options for model by name\n * - TModelInputModalitiesByName: Map from model name to its supported input modalities\n * - TMessageMetadataByModality: Map from modality type to adapter-specific metadata types\n */\nexport abstract class BaseAdapter<\n TChatModels extends ReadonlyArray<string> = ReadonlyArray<string>,\n TEmbeddingModels extends ReadonlyArray<string> = ReadonlyArray<string>,\n TChatProviderOptions extends Record<string, any> = Record<string, any>,\n TEmbeddingProviderOptions extends Record<string, any> = Record<string, any>,\n TModelProviderOptionsByName extends Record<string, any> = Record<string, any>,\n TModelInputModalitiesByName extends Record<\n string,\n ReadonlyArray<Modality>\n > = Record<string, ReadonlyArray<Modality>>,\n TMessageMetadataByModality extends {\n text: unknown\n image: unknown\n audio: unknown\n video: unknown\n document: unknown\n } = DefaultMessageMetadataByModality,\n> implements\n AIAdapter<\n TChatModels,\n TEmbeddingModels,\n TChatProviderOptions,\n TEmbeddingProviderOptions,\n TModelProviderOptionsByName,\n TModelInputModalitiesByName,\n TMessageMetadataByModality\n >\n{\n abstract name: string\n abstract models: TChatModels\n embeddingModels?: TEmbeddingModels\n protected config: AIAdapterConfig\n\n // These properties are used for type inference only, never assigned at runtime\n _providerOptions?: TChatProviderOptions\n _chatProviderOptions?: TChatProviderOptions\n _embeddingProviderOptions?: TEmbeddingProviderOptions\n // Type-only map; concrete adapters should override this with a precise type\n _modelProviderOptionsByName!: TModelProviderOptionsByName\n // Type-only map for model input modalities; concrete adapters should override this\n _modelInputModalitiesByName?: TModelInputModalitiesByName\n // Type-only map for message metadata types; concrete adapters should override this\n _messageMetadataByModality?: TMessageMetadataByModality\n\n constructor(config: AIAdapterConfig = {}) {\n this.config = config\n }\n\n abstract chatStream(options: ChatOptions): AsyncIterable<StreamChunk>\n\n abstract summarize(\n options: SummarizationOptions,\n ): Promise<SummarizationResult>\n abstract createEmbeddings(options: EmbeddingOptions): Promise<EmbeddingResult>\n\n protected generateId(): string {\n return `${this.name}-${Date.now()}-${Math.random()\n .toString(36)\n .substring(7)}`\n }\n}\n"],"names":[],"mappings":"AAyBO,MAAe,YA2BtB;AAAA,EAiBE,YAAY,SAA0B,IAAI;AACxC,SAAK,SAAS;AAAA,EAChB;AAAA,EASU,aAAqB;AAC7B,WAAO,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,OAAA,EACvC,SAAS,EAAE,EACX,UAAU,CAAC,CAAC;AAAA,EACjB;AACF;"}
|
|
@@ -277,35 +277,8 @@ export interface AIDevtoolsEventMap {
|
|
|
277
277
|
timestamp: number;
|
|
278
278
|
};
|
|
279
279
|
}
|
|
280
|
-
type StripPrefix<T extends string> = T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never;
|
|
281
|
-
type EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>;
|
|
282
280
|
declare class AiEventClient extends EventClient<AIDevtoolsEventMap> {
|
|
283
|
-
private eventTarget;
|
|
284
281
|
constructor();
|
|
285
|
-
/**
|
|
286
|
-
* Subscribe to events using both the parent EventClient and EventTarget API
|
|
287
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
288
|
-
* @param handler - The event handler function
|
|
289
|
-
* @param options - Optional configuration for event subscription
|
|
290
|
-
* @returns A function to unsubscribe from the event
|
|
291
|
-
*/
|
|
292
|
-
on<TSuffix extends EventSuffix>(eventSuffix: TSuffix, handler: (event: {
|
|
293
|
-
type: `tanstack-ai-devtools:${TSuffix}`;
|
|
294
|
-
payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`];
|
|
295
|
-
}) => void, options?: {
|
|
296
|
-
withEventTarget?: boolean;
|
|
297
|
-
}): () => void;
|
|
298
|
-
/**
|
|
299
|
-
* Emit an event to both the parent EventClient and the EventTarget
|
|
300
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
301
|
-
* @param data - The event data
|
|
302
|
-
*/
|
|
303
|
-
emit<TSuffix extends EventSuffix>(eventSuffix: TSuffix, data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]): void;
|
|
304
|
-
/**
|
|
305
|
-
* Get the underlying EventTarget for advanced use cases
|
|
306
|
-
* @returns The EventTarget instance
|
|
307
|
-
*/
|
|
308
|
-
getEventTarget(): EventTarget;
|
|
309
282
|
}
|
|
310
283
|
declare const aiEventClient: AiEventClient;
|
|
311
284
|
export { aiEventClient };
|
package/dist/esm/event-client.js
CHANGED
|
@@ -4,55 +4,6 @@ class AiEventClient extends EventClient {
|
|
|
4
4
|
super({
|
|
5
5
|
pluginId: "tanstack-ai-devtools"
|
|
6
6
|
});
|
|
7
|
-
this.eventTarget = new EventTarget();
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Subscribe to events using both the parent EventClient and EventTarget API
|
|
11
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
12
|
-
* @param handler - The event handler function
|
|
13
|
-
* @param options - Optional configuration for event subscription
|
|
14
|
-
* @returns A function to unsubscribe from the event
|
|
15
|
-
*/
|
|
16
|
-
on(eventSuffix, handler, options) {
|
|
17
|
-
const parentUnsubscribe = super.on(eventSuffix, handler);
|
|
18
|
-
const withEventTarget = options?.withEventTarget ?? true;
|
|
19
|
-
let eventListener;
|
|
20
|
-
if (withEventTarget) {
|
|
21
|
-
eventListener = (event) => {
|
|
22
|
-
if (event instanceof CustomEvent) {
|
|
23
|
-
handler({
|
|
24
|
-
type: `${eventSuffix}`,
|
|
25
|
-
payload: event.detail
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
this.eventTarget.addEventListener(eventSuffix, eventListener);
|
|
30
|
-
}
|
|
31
|
-
return () => {
|
|
32
|
-
parentUnsubscribe();
|
|
33
|
-
if (withEventTarget && eventListener) {
|
|
34
|
-
this.eventTarget.removeEventListener(eventSuffix, eventListener);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Emit an event to both the parent EventClient and the EventTarget
|
|
40
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
41
|
-
* @param data - The event data
|
|
42
|
-
*/
|
|
43
|
-
emit(eventSuffix, data) {
|
|
44
|
-
super.emit(eventSuffix, data);
|
|
45
|
-
const customEvent = new CustomEvent(eventSuffix, {
|
|
46
|
-
detail: data
|
|
47
|
-
});
|
|
48
|
-
this.eventTarget.dispatchEvent(customEvent);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get the underlying EventTarget for advanced use cases
|
|
52
|
-
* @returns The EventTarget instance
|
|
53
|
-
*/
|
|
54
|
-
getEventTarget() {
|
|
55
|
-
return this.eventTarget;
|
|
56
7
|
}
|
|
57
8
|
}
|
|
58
9
|
const aiEventClient = new AiEventClient();
|
|
@@ -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:chat: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 providerOptions?: Record<string, unknown>\n }\n 'tanstack-ai-devtools:chat: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:chat: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 // Embedding events\n 'tanstack-ai-devtools:embedding:started': {\n requestId: string\n model: string\n inputCount: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:embedding:completed': {\n requestId: string\n model: string\n inputCount: number\n duration: number\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 // Chat 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\n// Helper type to strip the prefix at the type level\ntype StripPrefix<T extends string> =\n T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never\n\n// Get all event names without the prefix\ntype EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>\n\nclass AiEventClient extends EventClient<AIDevtoolsEventMap> {\n private eventTarget: EventTarget\n\n constructor() {\n super({\n pluginId: 'tanstack-ai-devtools',\n })\n this.eventTarget = new EventTarget()\n }\n\n /**\n * Subscribe to events using both the parent EventClient and EventTarget API\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param handler - The event handler function\n * @param options - Optional configuration for event subscription\n * @returns A function to unsubscribe from the event\n */\n override on<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n handler: (event: {\n type: `tanstack-ai-devtools:${TSuffix}`\n payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]\n }) => void,\n options?: { withEventTarget?: boolean },\n ): () => void {\n const parentUnsubscribe = super.on(eventSuffix, handler)\n\n const withEventTarget = options?.withEventTarget ?? true\n let eventListener: ((event: Event) => void) | undefined\n\n if (withEventTarget) {\n // Create a wrapper to handle CustomEvent for EventTarget\n eventListener = (event: Event) => {\n if (event instanceof CustomEvent) {\n handler({\n type: `${eventSuffix}` as `tanstack-ai-devtools:${TSuffix}`,\n payload: event.detail,\n })\n }\n }\n\n // Add listener to EventTarget\n this.eventTarget.addEventListener(eventSuffix, eventListener)\n }\n\n // Return unsubscribe function that cleans up both subscriptions\n return () => {\n parentUnsubscribe()\n if (withEventTarget && eventListener) {\n this.eventTarget.removeEventListener(eventSuffix, eventListener)\n }\n }\n }\n\n /**\n * Emit an event to both the parent EventClient and the EventTarget\n * @param eventSuffix - The event name without the prefix (e.g., \"stream:started\")\n * @param data - The event data\n */\n override emit<TSuffix extends EventSuffix>(\n eventSuffix: TSuffix,\n data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`],\n ): void {\n super.emit(eventSuffix, data)\n\n // Always dispatch to EventTarget (for local listeners)\n const customEvent = new CustomEvent(eventSuffix, {\n detail: data,\n })\n this.eventTarget.dispatchEvent(customEvent)\n }\n\n /**\n * Get the underlying EventTarget for advanced use cases\n * @returns The EventTarget instance\n */\n getEventTarget(): EventTarget {\n return this.eventTarget\n }\n}\n\nconst aiEventClient = new AiEventClient()\n\nexport { aiEventClient }\n"],"names":[],"mappings":";AAiTA,MAAM,sBAAsB,YAAgC;AAAA,EAG1D,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU;AAAA,IAAA,CACX;AACD,SAAK,cAAc,IAAI,YAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASS,GACP,aACA,SAIA,SACY;AACZ,UAAM,oBAAoB,MAAM,GAAG,aAAa,OAAO;AAEvD,UAAM,kBAAkB,SAAS,mBAAmB;AACpD,QAAI;AAEJ,QAAI,iBAAiB;AAEnB,sBAAgB,CAAC,UAAiB;AAChC,YAAI,iBAAiB,aAAa;AAChC,kBAAQ;AAAA,YACN,MAAM,GAAG,WAAW;AAAA,YACpB,SAAS,MAAM;AAAA,UAAA,CAChB;AAAA,QACH;AAAA,MACF;AAGA,WAAK,YAAY,iBAAiB,aAAa,aAAa;AAAA,IAC9D;AAGA,WAAO,MAAM;AACX,wBAAA;AACA,UAAI,mBAAmB,eAAe;AACpC,aAAK,YAAY,oBAAoB,aAAa,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,KACP,aACA,MACM;AACN,UAAM,KAAK,aAAa,IAAI;AAG5B,UAAM,cAAc,IAAI,YAAY,aAAa;AAAA,MAC/C,QAAQ;AAAA,IAAA,CACT;AACD,SAAK,YAAY,cAAc,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;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'\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:chat: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 providerOptions?: Record<string, unknown>\n }\n 'tanstack-ai-devtools:chat: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:chat: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 // Embedding events\n 'tanstack-ai-devtools:embedding:started': {\n requestId: string\n model: string\n inputCount: number\n timestamp: number\n clientId?: string\n }\n 'tanstack-ai-devtools:embedding:completed': {\n requestId: string\n model: string\n inputCount: number\n duration: number\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 // Chat 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":";AA0SA,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/types.d.ts
CHANGED
|
@@ -87,12 +87,12 @@ export interface DocumentPart<TMetadata = unknown> {
|
|
|
87
87
|
* @template TVideoMeta - Provider-specific video metadata type
|
|
88
88
|
* @template TDocumentMeta - Provider-specific document metadata type
|
|
89
89
|
*/
|
|
90
|
-
export type ContentPart<TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown> = TextPart | ImagePart<TImageMeta> | AudioPart<TAudioMeta> | VideoPart<TVideoMeta> | DocumentPart<TDocumentMeta>;
|
|
90
|
+
export type ContentPart<TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown, TTextMeta = unknown> = TextPart<TTextMeta> | ImagePart<TImageMeta> | AudioPart<TAudioMeta> | VideoPart<TVideoMeta> | DocumentPart<TDocumentMeta>;
|
|
91
91
|
/**
|
|
92
92
|
* Helper type to filter ContentPart union to only include specific modalities.
|
|
93
93
|
* Used to constrain message content based on model capabilities.
|
|
94
94
|
*/
|
|
95
|
-
export type ContentPartForModalities<TModalities extends Modality, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown> = Extract<ContentPart<TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>, {
|
|
95
|
+
export type ContentPartForModalities<TModalities extends Modality, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown, TTextMeta = unknown> = Extract<ContentPart<TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>, {
|
|
96
96
|
type: TModalities;
|
|
97
97
|
}>;
|
|
98
98
|
/**
|
|
@@ -104,7 +104,7 @@ export type ModalitiesArrayToUnion<T extends ReadonlyArray<Modality>> = T[number
|
|
|
104
104
|
* Type for message content constrained by supported modalities.
|
|
105
105
|
* When modalities is ['text', 'image'], only TextPart and ImagePart are allowed in the array.
|
|
106
106
|
*/
|
|
107
|
-
export type ConstrainedContent<TModalities extends ReadonlyArray<Modality>, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown> = string | null | Array<ContentPartForModalities<ModalitiesArrayToUnion<TModalities>, TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>>;
|
|
107
|
+
export type ConstrainedContent<TModalities extends ReadonlyArray<Modality>, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown, TTextMeta = unknown> = string | null | Array<ContentPartForModalities<ModalitiesArrayToUnion<TModalities>, TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>>;
|
|
108
108
|
export interface ModelMessage<TContent extends string | null | Array<ContentPart> = string | null | Array<ContentPart>> {
|
|
109
109
|
role: 'user' | 'assistant' | 'tool';
|
|
110
110
|
content: TContent;
|
|
@@ -115,9 +115,10 @@ export interface ModelMessage<TContent extends string | null | Array<ContentPart
|
|
|
115
115
|
/**
|
|
116
116
|
* Message parts - building blocks of UIMessage
|
|
117
117
|
*/
|
|
118
|
-
export interface TextPart {
|
|
118
|
+
export interface TextPart<TMetadata = unknown> {
|
|
119
119
|
type: 'text';
|
|
120
120
|
content: string;
|
|
121
|
+
metadata?: TMetadata;
|
|
121
122
|
}
|
|
122
123
|
export interface ToolCallPart {
|
|
123
124
|
type: 'tool-call';
|
|
@@ -160,8 +161,8 @@ export interface UIMessage {
|
|
|
160
161
|
* A ModelMessage with content constrained to only allow content parts
|
|
161
162
|
* matching the specified input modalities.
|
|
162
163
|
*/
|
|
163
|
-
export type ConstrainedModelMessage<TModalities extends ReadonlyArray<Modality>, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown> = Omit<ModelMessage, 'content'> & {
|
|
164
|
-
content: ConstrainedContent<TModalities, TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>;
|
|
164
|
+
export type ConstrainedModelMessage<TModalities extends ReadonlyArray<Modality>, TImageMeta = unknown, TAudioMeta = unknown, TVideoMeta = unknown, TDocumentMeta = unknown, TTextMeta = unknown> = Omit<ModelMessage, 'content'> & {
|
|
165
|
+
content: ConstrainedContent<TModalities, TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>;
|
|
165
166
|
};
|
|
166
167
|
/**
|
|
167
168
|
* Tool/Function definition for function calling.
|
|
@@ -516,6 +517,7 @@ export interface EmbeddingResult {
|
|
|
516
517
|
* Uses unknown for all modalities.
|
|
517
518
|
*/
|
|
518
519
|
export interface DefaultMessageMetadataByModality {
|
|
520
|
+
text: unknown;
|
|
519
521
|
image: unknown;
|
|
520
522
|
audio: unknown;
|
|
521
523
|
video: unknown;
|
|
@@ -534,6 +536,7 @@ export interface DefaultMessageMetadataByModality {
|
|
|
534
536
|
* - TMessageMetadataByModality: Map from modality type to adapter-specific metadata types
|
|
535
537
|
*/
|
|
536
538
|
export interface AIAdapter<TChatModels extends ReadonlyArray<string> = ReadonlyArray<string>, TEmbeddingModels extends ReadonlyArray<string> = ReadonlyArray<string>, TChatProviderOptions extends Record<string, any> = Record<string, any>, TEmbeddingProviderOptions extends Record<string, any> = Record<string, any>, TModelProviderOptionsByName extends Record<string, any> = Record<string, any>, TModelInputModalitiesByName extends Record<string, ReadonlyArray<Modality>> = Record<string, ReadonlyArray<Modality>>, TMessageMetadataByModality extends {
|
|
539
|
+
text: unknown;
|
|
537
540
|
image: unknown;
|
|
538
541
|
audio: unknown;
|
|
539
542
|
video: unknown;
|
|
@@ -585,11 +588,12 @@ export type ChatStreamOptionsUnion<TAdapter extends AIAdapter<any, any, any, any
|
|
|
585
588
|
* Metadata types are also constrained based on the adapter's metadata type definitions.
|
|
586
589
|
*/
|
|
587
590
|
messages: TModel extends keyof ModelInputModalities ? ModelInputModalities[TModel] extends ReadonlyArray<Modality> ? MessageMetadata extends {
|
|
591
|
+
text: infer TTextMeta;
|
|
588
592
|
image: infer TImageMeta;
|
|
589
593
|
audio: infer TAudioMeta;
|
|
590
594
|
video: infer TVideoMeta;
|
|
591
595
|
document: infer TDocumentMeta;
|
|
592
|
-
} ? Array<ConstrainedModelMessage<ModelInputModalities[TModel], TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>> : Array<ConstrainedModelMessage<ModelInputModalities[TModel]>> : Array<ModelMessage> : Array<ModelMessage>;
|
|
596
|
+
} ? Array<ConstrainedModelMessage<ModelInputModalities[TModel], TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>> : Array<ConstrainedModelMessage<ModelInputModalities[TModel]>> : Array<ModelMessage> : Array<ModelMessage>;
|
|
593
597
|
} : never : never : never;
|
|
594
598
|
/**
|
|
595
599
|
* Chat options constrained by a specific model's capabilities.
|
|
@@ -606,11 +610,12 @@ export type ChatStreamOptionsForModel<TAdapter extends AIAdapter<any, any, any,
|
|
|
606
610
|
* Metadata types are also constrained based on the adapter's metadata type definitions.
|
|
607
611
|
*/
|
|
608
612
|
messages: TModel extends keyof ModelInputModalities ? ModelInputModalities[TModel] extends ReadonlyArray<Modality> ? MessageMetadata extends {
|
|
613
|
+
text: infer TTextMeta;
|
|
609
614
|
image: infer TImageMeta;
|
|
610
615
|
audio: infer TAudioMeta;
|
|
611
616
|
video: infer TVideoMeta;
|
|
612
617
|
document: infer TDocumentMeta;
|
|
613
|
-
} ? Array<ConstrainedModelMessage<ModelInputModalities[TModel], TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>> : Array<ConstrainedModelMessage<ModelInputModalities[TModel]>> : Array<ModelMessage> : Array<ModelMessage>;
|
|
618
|
+
} ? Array<ConstrainedModelMessage<ModelInputModalities[TModel], TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>> : Array<ConstrainedModelMessage<ModelInputModalities[TModel]>> : Array<ModelMessage> : Array<ModelMessage>;
|
|
614
619
|
} : never;
|
|
615
620
|
export type ExtractModelsFromAdapter<T> = T extends AIAdapter<infer M, any, any, any, any, any> ? M[number] : never;
|
|
616
621
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Core TanStack AI library - Open source AI SDK",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"embeddings"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@tanstack/devtools-event-client": "^0.
|
|
42
|
+
"@tanstack/devtools-event-client": "^0.4.0",
|
|
43
43
|
"partial-json": "^0.1.7"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
package/src/base-adapter.ts
CHANGED
package/src/event-client.ts
CHANGED
|
@@ -296,91 +296,11 @@ export interface AIDevtoolsEventMap {
|
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
// Helper type to strip the prefix at the type level
|
|
300
|
-
type StripPrefix<T extends string> =
|
|
301
|
-
T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never
|
|
302
|
-
|
|
303
|
-
// Get all event names without the prefix
|
|
304
|
-
type EventSuffix = StripPrefix<keyof AIDevtoolsEventMap & string>
|
|
305
|
-
|
|
306
299
|
class AiEventClient extends EventClient<AIDevtoolsEventMap> {
|
|
307
|
-
private eventTarget: EventTarget
|
|
308
|
-
|
|
309
300
|
constructor() {
|
|
310
301
|
super({
|
|
311
302
|
pluginId: 'tanstack-ai-devtools',
|
|
312
303
|
})
|
|
313
|
-
this.eventTarget = new EventTarget()
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Subscribe to events using both the parent EventClient and EventTarget API
|
|
318
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
319
|
-
* @param handler - The event handler function
|
|
320
|
-
* @param options - Optional configuration for event subscription
|
|
321
|
-
* @returns A function to unsubscribe from the event
|
|
322
|
-
*/
|
|
323
|
-
override on<TSuffix extends EventSuffix>(
|
|
324
|
-
eventSuffix: TSuffix,
|
|
325
|
-
handler: (event: {
|
|
326
|
-
type: `tanstack-ai-devtools:${TSuffix}`
|
|
327
|
-
payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`]
|
|
328
|
-
}) => void,
|
|
329
|
-
options?: { withEventTarget?: boolean },
|
|
330
|
-
): () => void {
|
|
331
|
-
const parentUnsubscribe = super.on(eventSuffix, handler)
|
|
332
|
-
|
|
333
|
-
const withEventTarget = options?.withEventTarget ?? true
|
|
334
|
-
let eventListener: ((event: Event) => void) | undefined
|
|
335
|
-
|
|
336
|
-
if (withEventTarget) {
|
|
337
|
-
// Create a wrapper to handle CustomEvent for EventTarget
|
|
338
|
-
eventListener = (event: Event) => {
|
|
339
|
-
if (event instanceof CustomEvent) {
|
|
340
|
-
handler({
|
|
341
|
-
type: `${eventSuffix}` as `tanstack-ai-devtools:${TSuffix}`,
|
|
342
|
-
payload: event.detail,
|
|
343
|
-
})
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// Add listener to EventTarget
|
|
348
|
-
this.eventTarget.addEventListener(eventSuffix, eventListener)
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Return unsubscribe function that cleans up both subscriptions
|
|
352
|
-
return () => {
|
|
353
|
-
parentUnsubscribe()
|
|
354
|
-
if (withEventTarget && eventListener) {
|
|
355
|
-
this.eventTarget.removeEventListener(eventSuffix, eventListener)
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Emit an event to both the parent EventClient and the EventTarget
|
|
362
|
-
* @param eventSuffix - The event name without the prefix (e.g., "stream:started")
|
|
363
|
-
* @param data - The event data
|
|
364
|
-
*/
|
|
365
|
-
override emit<TSuffix extends EventSuffix>(
|
|
366
|
-
eventSuffix: TSuffix,
|
|
367
|
-
data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`],
|
|
368
|
-
): void {
|
|
369
|
-
super.emit(eventSuffix, data)
|
|
370
|
-
|
|
371
|
-
// Always dispatch to EventTarget (for local listeners)
|
|
372
|
-
const customEvent = new CustomEvent(eventSuffix, {
|
|
373
|
-
detail: data,
|
|
374
|
-
})
|
|
375
|
-
this.eventTarget.dispatchEvent(customEvent)
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Get the underlying EventTarget for advanced use cases
|
|
380
|
-
* @returns The EventTarget instance
|
|
381
|
-
*/
|
|
382
|
-
getEventTarget(): EventTarget {
|
|
383
|
-
return this.eventTarget
|
|
384
304
|
}
|
|
385
305
|
}
|
|
386
306
|
|
package/src/types.ts
CHANGED
|
@@ -104,8 +104,9 @@ export type ContentPart<
|
|
|
104
104
|
TAudioMeta = unknown,
|
|
105
105
|
TVideoMeta = unknown,
|
|
106
106
|
TDocumentMeta = unknown,
|
|
107
|
+
TTextMeta = unknown,
|
|
107
108
|
> =
|
|
108
|
-
| TextPart
|
|
109
|
+
| TextPart<TTextMeta>
|
|
109
110
|
| ImagePart<TImageMeta>
|
|
110
111
|
| AudioPart<TAudioMeta>
|
|
111
112
|
| VideoPart<TVideoMeta>
|
|
@@ -121,8 +122,9 @@ export type ContentPartForModalities<
|
|
|
121
122
|
TAudioMeta = unknown,
|
|
122
123
|
TVideoMeta = unknown,
|
|
123
124
|
TDocumentMeta = unknown,
|
|
125
|
+
TTextMeta = unknown,
|
|
124
126
|
> = Extract<
|
|
125
|
-
ContentPart<TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta>,
|
|
127
|
+
ContentPart<TImageMeta, TAudioMeta, TVideoMeta, TDocumentMeta, TTextMeta>,
|
|
126
128
|
{ type: TModalities }
|
|
127
129
|
>
|
|
128
130
|
|
|
@@ -143,6 +145,7 @@ export type ConstrainedContent<
|
|
|
143
145
|
TAudioMeta = unknown,
|
|
144
146
|
TVideoMeta = unknown,
|
|
145
147
|
TDocumentMeta = unknown,
|
|
148
|
+
TTextMeta = unknown,
|
|
146
149
|
> =
|
|
147
150
|
| string
|
|
148
151
|
| null
|
|
@@ -152,7 +155,8 @@ export type ConstrainedContent<
|
|
|
152
155
|
TImageMeta,
|
|
153
156
|
TAudioMeta,
|
|
154
157
|
TVideoMeta,
|
|
155
|
-
TDocumentMeta
|
|
158
|
+
TDocumentMeta,
|
|
159
|
+
TTextMeta
|
|
156
160
|
>
|
|
157
161
|
>
|
|
158
162
|
|
|
@@ -172,9 +176,10 @@ export interface ModelMessage<
|
|
|
172
176
|
/**
|
|
173
177
|
* Message parts - building blocks of UIMessage
|
|
174
178
|
*/
|
|
175
|
-
export interface TextPart {
|
|
179
|
+
export interface TextPart<TMetadata = unknown> {
|
|
176
180
|
type: 'text'
|
|
177
181
|
content: string
|
|
182
|
+
metadata?: TMetadata
|
|
178
183
|
}
|
|
179
184
|
|
|
180
185
|
export interface ToolCallPart {
|
|
@@ -232,13 +237,15 @@ export type ConstrainedModelMessage<
|
|
|
232
237
|
TAudioMeta = unknown,
|
|
233
238
|
TVideoMeta = unknown,
|
|
234
239
|
TDocumentMeta = unknown,
|
|
240
|
+
TTextMeta = unknown,
|
|
235
241
|
> = Omit<ModelMessage, 'content'> & {
|
|
236
242
|
content: ConstrainedContent<
|
|
237
243
|
TModalities,
|
|
238
244
|
TImageMeta,
|
|
239
245
|
TAudioMeta,
|
|
240
246
|
TVideoMeta,
|
|
241
|
-
TDocumentMeta
|
|
247
|
+
TDocumentMeta,
|
|
248
|
+
TTextMeta
|
|
242
249
|
>
|
|
243
250
|
}
|
|
244
251
|
|
|
@@ -655,6 +662,7 @@ export interface EmbeddingResult {
|
|
|
655
662
|
* Uses unknown for all modalities.
|
|
656
663
|
*/
|
|
657
664
|
export interface DefaultMessageMetadataByModality {
|
|
665
|
+
text: unknown
|
|
658
666
|
image: unknown
|
|
659
667
|
audio: unknown
|
|
660
668
|
video: unknown
|
|
@@ -684,6 +692,7 @@ export interface AIAdapter<
|
|
|
684
692
|
ReadonlyArray<Modality>
|
|
685
693
|
> = Record<string, ReadonlyArray<Modality>>,
|
|
686
694
|
TMessageMetadataByModality extends {
|
|
695
|
+
text: unknown
|
|
687
696
|
image: unknown
|
|
688
697
|
audio: unknown
|
|
689
698
|
video: unknown
|
|
@@ -770,6 +779,7 @@ export type ChatStreamOptionsUnion<
|
|
|
770
779
|
messages: TModel extends keyof ModelInputModalities
|
|
771
780
|
? ModelInputModalities[TModel] extends ReadonlyArray<Modality>
|
|
772
781
|
? MessageMetadata extends {
|
|
782
|
+
text: infer TTextMeta
|
|
773
783
|
image: infer TImageMeta
|
|
774
784
|
audio: infer TAudioMeta
|
|
775
785
|
video: infer TVideoMeta
|
|
@@ -781,7 +791,8 @@ export type ChatStreamOptionsUnion<
|
|
|
781
791
|
TImageMeta,
|
|
782
792
|
TAudioMeta,
|
|
783
793
|
TVideoMeta,
|
|
784
|
-
TDocumentMeta
|
|
794
|
+
TDocumentMeta,
|
|
795
|
+
TTextMeta
|
|
785
796
|
>
|
|
786
797
|
>
|
|
787
798
|
: Array<ConstrainedModelMessage<ModelInputModalities[TModel]>>
|
|
@@ -827,6 +838,7 @@ export type ChatStreamOptionsForModel<
|
|
|
827
838
|
messages: TModel extends keyof ModelInputModalities
|
|
828
839
|
? ModelInputModalities[TModel] extends ReadonlyArray<Modality>
|
|
829
840
|
? MessageMetadata extends {
|
|
841
|
+
text: infer TTextMeta
|
|
830
842
|
image: infer TImageMeta
|
|
831
843
|
audio: infer TAudioMeta
|
|
832
844
|
video: infer TVideoMeta
|
|
@@ -838,7 +850,8 @@ export type ChatStreamOptionsForModel<
|
|
|
838
850
|
TImageMeta,
|
|
839
851
|
TAudioMeta,
|
|
840
852
|
TVideoMeta,
|
|
841
|
-
TDocumentMeta
|
|
853
|
+
TDocumentMeta,
|
|
854
|
+
TTextMeta
|
|
842
855
|
>
|
|
843
856
|
>
|
|
844
857
|
: Array<ConstrainedModelMessage<ModelInputModalities[TModel]>>
|