@tanstack/ai 0.0.1 → 0.0.2

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 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,YA0BtB;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;"}
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;"}
@@ -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.1",
3
+ "version": "0.0.2",
4
4
  "description": "Core TanStack AI library - Open source AI SDK",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -34,6 +34,7 @@ export abstract class BaseAdapter<
34
34
  ReadonlyArray<Modality>
35
35
  > = Record<string, ReadonlyArray<Modality>>,
36
36
  TMessageMetadataByModality extends {
37
+ text: unknown
37
38
  image: unknown
38
39
  audio: unknown
39
40
  video: unknown
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]>>