@yourgpt/llm-sdk 2.1.4-alpha.1 → 2.1.4-alpha.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.
Files changed (57) hide show
  1. package/dist/adapters/index.d.mts +4 -2
  2. package/dist/adapters/index.d.ts +4 -2
  3. package/dist/base-5n-UuPfS.d.mts +768 -0
  4. package/dist/base-Di31iy_8.d.ts +768 -0
  5. package/dist/fallback/index.d.mts +96 -0
  6. package/dist/fallback/index.d.ts +96 -0
  7. package/dist/fallback/index.js +284 -0
  8. package/dist/fallback/index.mjs +280 -0
  9. package/dist/index.d.mts +62 -3
  10. package/dist/index.d.ts +62 -3
  11. package/dist/index.js +117 -2
  12. package/dist/index.mjs +116 -3
  13. package/dist/providers/anthropic/index.d.mts +3 -1
  14. package/dist/providers/anthropic/index.d.ts +3 -1
  15. package/dist/providers/azure/index.d.mts +3 -1
  16. package/dist/providers/azure/index.d.ts +3 -1
  17. package/dist/providers/google/index.d.mts +3 -1
  18. package/dist/providers/google/index.d.ts +3 -1
  19. package/dist/providers/ollama/index.d.mts +4 -2
  20. package/dist/providers/ollama/index.d.ts +4 -2
  21. package/dist/providers/openai/index.d.mts +3 -1
  22. package/dist/providers/openai/index.d.ts +3 -1
  23. package/dist/providers/openrouter/index.d.mts +3 -1
  24. package/dist/providers/openrouter/index.d.ts +3 -1
  25. package/dist/providers/xai/index.d.mts +3 -1
  26. package/dist/providers/xai/index.d.ts +3 -1
  27. package/dist/types-BQl1suAv.d.mts +212 -0
  28. package/dist/types-C0vLXzuw.d.ts +355 -0
  29. package/dist/types-CNL8ZRne.d.ts +212 -0
  30. package/dist/types-CR8mi9I0.d.mts +417 -0
  31. package/dist/types-CR8mi9I0.d.ts +417 -0
  32. package/dist/types-VDgiUvH2.d.mts +355 -0
  33. package/dist/yourgpt/index.d.mts +77 -0
  34. package/dist/yourgpt/index.d.ts +77 -0
  35. package/dist/yourgpt/index.js +167 -0
  36. package/dist/yourgpt/index.mjs +164 -0
  37. package/package.json +12 -1
  38. package/dist/adapters/index.js.map +0 -1
  39. package/dist/adapters/index.mjs.map +0 -1
  40. package/dist/index.js.map +0 -1
  41. package/dist/index.mjs.map +0 -1
  42. package/dist/providers/anthropic/index.js.map +0 -1
  43. package/dist/providers/anthropic/index.mjs.map +0 -1
  44. package/dist/providers/azure/index.js.map +0 -1
  45. package/dist/providers/azure/index.mjs.map +0 -1
  46. package/dist/providers/google/index.js.map +0 -1
  47. package/dist/providers/google/index.mjs.map +0 -1
  48. package/dist/providers/ollama/index.js.map +0 -1
  49. package/dist/providers/ollama/index.mjs.map +0 -1
  50. package/dist/providers/openai/index.js.map +0 -1
  51. package/dist/providers/openai/index.mjs.map +0 -1
  52. package/dist/providers/openrouter/index.js.map +0 -1
  53. package/dist/providers/openrouter/index.mjs.map +0 -1
  54. package/dist/providers/xai/index.js.map +0 -1
  55. package/dist/providers/xai/index.mjs.map +0 -1
  56. package/dist/types-COAOEe_y.d.mts +0 -1460
  57. package/dist/types-COAOEe_y.d.ts +0 -1460
@@ -0,0 +1,280 @@
1
+ // src/fallback/errors.ts
2
+ var FallbackExhaustedError = class extends Error {
3
+ constructor(failures) {
4
+ const summary = failures.map((f) => `${f.provider}/${f.model}: ${f.error.message}`).join("; ");
5
+ super(
6
+ `All ${failures.length} model(s) in the fallback chain failed. ${summary}`
7
+ );
8
+ this.name = "FallbackExhaustedError";
9
+ this.failures = failures;
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ };
13
+
14
+ // src/fallback/routing-store.ts
15
+ var MemoryRoutingStore = class {
16
+ constructor() {
17
+ this._map = /* @__PURE__ */ new Map();
18
+ }
19
+ async get(key) {
20
+ return this._map.get(key);
21
+ }
22
+ async set(key, value) {
23
+ this._map.set(key, value);
24
+ }
25
+ };
26
+
27
+ // src/fallback/chain.ts
28
+ var ROUND_ROBIN_KEY = "ygpt_fallback_rr_index";
29
+ function defaultIsRetryable(error) {
30
+ if (typeof error === "object" && error !== null) {
31
+ const ctorName = error.constructor?.name ?? "";
32
+ if (ctorName === "APIUserAbortError") return false;
33
+ if (ctorName === "APIConnectionError") return true;
34
+ if (ctorName === "APIConnectionTimeoutError") return true;
35
+ const status = error.status ?? error.statusCode;
36
+ if (typeof status === "number") {
37
+ if (status === 429) return true;
38
+ if (status >= 500) return true;
39
+ if (status >= 400) return false;
40
+ }
41
+ }
42
+ if (error instanceof Error) {
43
+ const msg = error.message;
44
+ if (/the operation was aborted/i.test(msg)) return false;
45
+ if (/the user aborted a request/i.test(msg)) return false;
46
+ if (/\b4[0-9]{2}\b/.test(msg) && !/\b429\b/.test(msg)) return false;
47
+ if (/\b429\b/.test(msg)) return true;
48
+ if (/rate[\s_-]?limit/i.test(msg)) return true;
49
+ if (/too many requests/i.test(msg)) return true;
50
+ if (/quota exceeded/i.test(msg)) return true;
51
+ if (/\b5[0-9]{2}\b/.test(msg)) return true;
52
+ if (/internal server error/i.test(msg)) return true;
53
+ if (/service unavailable/i.test(msg)) return true;
54
+ if (/bad gateway/i.test(msg)) return true;
55
+ if (/gateway timeout/i.test(msg)) return true;
56
+ if (/overloaded/i.test(msg)) return true;
57
+ if (/^connection error\.?$/i.test(msg)) return true;
58
+ if (/^request timed out\.?$/i.test(msg)) return true;
59
+ if (/timed?\s*out/i.test(msg)) return true;
60
+ if (/timeout/i.test(msg)) return true;
61
+ if (/fetch failed/i.test(msg)) return true;
62
+ if (/ECONNREFUSED/.test(msg)) return true;
63
+ if (/ECONNRESET/.test(msg)) return true;
64
+ if (/ETIMEDOUT/.test(msg)) return true;
65
+ if (/ENOTFOUND/.test(msg)) return true;
66
+ if (/ENETUNREACH/.test(msg)) return true;
67
+ if (/EHOSTUNREACH/.test(msg)) return true;
68
+ }
69
+ return false;
70
+ }
71
+ function calcDelay(base, attempt, backoff) {
72
+ if (backoff === "fixed") return base;
73
+ return base * Math.pow(2, attempt - 1);
74
+ }
75
+ function sleep(ms) {
76
+ return new Promise((resolve) => setTimeout(resolve, ms));
77
+ }
78
+ var FallbackChain = class {
79
+ constructor(config) {
80
+ if (config.models.length === 0) {
81
+ throw new Error("FallbackChain requires at least one model.");
82
+ }
83
+ this._config = {
84
+ models: config.models,
85
+ strategy: config.strategy ?? "priority",
86
+ store: config.store ?? new MemoryRoutingStore(),
87
+ retries: config.retries ?? 0,
88
+ retryDelay: config.retryDelay ?? 500,
89
+ retryBackoff: config.retryBackoff ?? "exponential",
90
+ onFallback: config.onFallback,
91
+ onRetry: config.onRetry,
92
+ retryableErrors: config.retryableErrors
93
+ };
94
+ }
95
+ get provider() {
96
+ return "fallback-chain";
97
+ }
98
+ get model() {
99
+ return this._config.models.map((m) => `${m.provider}/${m.model}`).join(",");
100
+ }
101
+ async _startIndex() {
102
+ if (this._config.strategy !== "round-robin") return 0;
103
+ const stored = await this._config.store.get(ROUND_ROBIN_KEY);
104
+ return typeof stored === "number" ? stored % this._config.models.length : 0;
105
+ }
106
+ async _advanceIndex(successfulIndex) {
107
+ if (this._config.strategy !== "round-robin") return;
108
+ const next = (successfulIndex + 1) % this._config.models.length;
109
+ await this._config.store.set(ROUND_ROBIN_KEY, next);
110
+ }
111
+ _isRetryable(error) {
112
+ return this._config.retryableErrors ? this._config.retryableErrors(error) : defaultIsRetryable(error);
113
+ }
114
+ /**
115
+ * Try streaming from a single adapter, with per-model retries.
116
+ *
117
+ * Returns an async generator that either:
118
+ * - yields all chunks on success, then returns
119
+ * - throws the final error if all retries exhausted or error is non-retryable
120
+ *
121
+ * The `retriesAttempted` out-param is filled via the returned object so callers
122
+ * can record it in FallbackFailure.
123
+ */
124
+ async *_streamWithRetries(adapter, request, out) {
125
+ const { retries, retryDelay, retryBackoff, onRetry } = this._config;
126
+ const maxAttempts = retries + 1;
127
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
128
+ let contentStarted = false;
129
+ let failureError = null;
130
+ try {
131
+ for await (const chunk of adapter.stream(request)) {
132
+ if (chunk.type === "error") {
133
+ if (!contentStarted) {
134
+ const msg = chunk.message ?? "Unknown error";
135
+ failureError = new Error(msg);
136
+ break;
137
+ }
138
+ yield chunk;
139
+ return;
140
+ }
141
+ if (chunk.type === "message:start") continue;
142
+ contentStarted = true;
143
+ yield chunk;
144
+ }
145
+ } catch (error) {
146
+ if (contentStarted) throw error;
147
+ if (!this._isRetryable(error)) throw error;
148
+ failureError = error instanceof Error ? error : new Error(String(error));
149
+ }
150
+ if (failureError === null) return;
151
+ if (!this._isRetryable(failureError)) throw failureError;
152
+ out.retriesAttempted = attempt - 1;
153
+ if (attempt < maxAttempts) {
154
+ const delayMs = calcDelay(retryDelay, attempt, retryBackoff);
155
+ const retryInfo = {
156
+ model: adapter.model,
157
+ provider: adapter.provider,
158
+ error: failureError,
159
+ retryAttempt: attempt,
160
+ maxRetries: retries,
161
+ delayMs
162
+ };
163
+ onRetry?.(retryInfo);
164
+ await sleep(delayMs);
165
+ continue;
166
+ }
167
+ out.retriesAttempted = retries;
168
+ throw failureError;
169
+ }
170
+ }
171
+ async *stream(request) {
172
+ const { models, onFallback } = this._config;
173
+ const startIndex = await this._startIndex();
174
+ const failures = [];
175
+ for (let i = 0; i < models.length; i++) {
176
+ const index = (startIndex + i) % models.length;
177
+ const adapter = models[index];
178
+ const out = { retriesAttempted: 0 };
179
+ try {
180
+ yield* this._streamWithRetries(adapter, request, out);
181
+ await this._advanceIndex(index);
182
+ return;
183
+ } catch (error) {
184
+ if (!this._isRetryable(error)) throw error;
185
+ const failure = {
186
+ model: adapter.model,
187
+ provider: adapter.provider,
188
+ error: error instanceof Error ? error : new Error(String(error)),
189
+ attempt: i + 1,
190
+ retriesAttempted: out.retriesAttempted
191
+ };
192
+ failures.push(failure);
193
+ const nextOffset = i + 1;
194
+ if (nextOffset < models.length && onFallback) {
195
+ const nextIndex = (startIndex + nextOffset) % models.length;
196
+ onFallback({
197
+ attemptedModel: adapter.model,
198
+ nextModel: models[nextIndex].model,
199
+ error: failure.error,
200
+ attempt: failure.attempt
201
+ });
202
+ }
203
+ }
204
+ }
205
+ throw new FallbackExhaustedError(failures);
206
+ }
207
+ async complete(request) {
208
+ const { models, onFallback, retries, retryDelay, retryBackoff, onRetry } = this._config;
209
+ const startIndex = await this._startIndex();
210
+ const failures = [];
211
+ for (let i = 0; i < models.length; i++) {
212
+ const index = (startIndex + i) % models.length;
213
+ const adapter = models[index];
214
+ if (!adapter.complete) {
215
+ failures.push({
216
+ model: adapter.model,
217
+ provider: adapter.provider,
218
+ error: new Error(
219
+ `Adapter ${adapter.provider}/${adapter.model} does not implement complete()`
220
+ ),
221
+ attempt: i + 1,
222
+ retriesAttempted: 0
223
+ });
224
+ continue;
225
+ }
226
+ const maxAttempts = retries + 1;
227
+ let lastError = null;
228
+ let retriesAttempted = 0;
229
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
230
+ try {
231
+ const result = await adapter.complete(request);
232
+ await this._advanceIndex(index);
233
+ return result;
234
+ } catch (error) {
235
+ if (!this._isRetryable(error)) throw error;
236
+ lastError = error instanceof Error ? error : new Error(String(error));
237
+ retriesAttempted = attempt - 1;
238
+ if (attempt < maxAttempts) {
239
+ const delayMs = calcDelay(retryDelay, attempt, retryBackoff);
240
+ onRetry?.({
241
+ model: adapter.model,
242
+ provider: adapter.provider,
243
+ error: lastError,
244
+ retryAttempt: attempt,
245
+ maxRetries: retries,
246
+ delayMs
247
+ });
248
+ await sleep(delayMs);
249
+ }
250
+ }
251
+ }
252
+ const failure = {
253
+ model: adapter.model,
254
+ provider: adapter.provider,
255
+ error: lastError,
256
+ attempt: i + 1,
257
+ retriesAttempted
258
+ };
259
+ failures.push(failure);
260
+ const nextOffset = i + 1;
261
+ if (nextOffset < models.length && onFallback) {
262
+ const nextIndex = (startIndex + nextOffset) % models.length;
263
+ onFallback({
264
+ attemptedModel: adapter.model,
265
+ nextModel: models[nextIndex].model,
266
+ error: failure.error,
267
+ attempt: failure.attempt
268
+ });
269
+ }
270
+ }
271
+ throw new FallbackExhaustedError(failures);
272
+ }
273
+ };
274
+ function createFallbackChain(config) {
275
+ return new FallbackChain(config);
276
+ }
277
+
278
+ export { FallbackExhaustedError, MemoryRoutingStore, createFallbackChain };
279
+ //# sourceMappingURL=index.mjs.map
280
+ //# sourceMappingURL=index.mjs.map
package/dist/index.d.mts CHANGED
@@ -1,8 +1,13 @@
1
- import { G as GenerateTextParams, a as GenerateTextResult, S as StreamTextParams, b as StreamTextResult, T as ToolContext, c as Tool, A as AIProvider, d as ActionDefinition, e as ToolDefinition, f as ToolProfile, K as KnowledgeBaseConfig, W as WebSearchConfig, L as LLMAdapter, D as DoneEventMessage, g as StreamEvent, h as ToolCallInfo, i as TokenUsageRaw, P as ProviderToolRuntimeOptions, M as Message, j as ToolResponse } from './types-COAOEe_y.mjs';
2
- export { V as AdapterFactory, _ as AnthropicProviderConfig, an as AnthropicProviderToolOptions, a5 as AnthropicTool, a7 as AnthropicToolResult, ak as AnthropicToolSelectionHints, a6 as AnthropicToolUse, p as AssistantMessage, a1 as AzureProviderConfig, Y as BaseProviderConfig, Q as ChatCompletionRequest, ao as Citation, C as CoreMessage, O as DEFAULT_CAPABILITIES, m as DoGenerateParams, n as DoGenerateResult, H as ErrorChunk, F as FilePart, E as FinishChunk, N as FinishReason, ac as GeminiFunctionCall, ab as GeminiFunctionDeclaration, ad as GeminiFunctionResponse, v as GenerateStep, $ as GoogleProviderConfig, I as ImagePart, ae as LLMConfig, k as LanguageModel, l as ModelCapabilities, a3 as OllamaModelOptions, a2 as OllamaProviderConfig, Z as OpenAIProviderConfig, am as OpenAIProviderToolOptions, a8 as OpenAITool, a9 as OpenAIToolCall, aa as OpenAIToolResult, aj as OpenAIToolSelectionHints, X as ProviderCapabilities, a4 as ProviderFormatter, R as ResponseOptions, x as StreamChunk, w as StreamPart, o as SystemMessage, y as TextDeltaChunk, s as TextPart, J as TokenUsage, t as ToolCall, z as ToolCallChunk, ai as ToolExecution, af as ToolLocation, q as ToolMessage, al as ToolNativeProviderHints, u as ToolResult, B as ToolResultChunk, ag as UnifiedToolCall, ah as UnifiedToolResult, r as UserContentPart, U as UserMessage, a0 as XAIProviderConfig } from './types-COAOEe_y.mjs';
1
+ import { G as GenerateTextParams, a as GenerateTextResult, S as StreamTextParams, b as StreamTextResult, T as ToolContext, c as Tool, d as StorageAdapter, e as StorageMessage } from './types-CR8mi9I0.mjs';
2
+ export { A as AssistantMessage, C as CoreMessage, w as DEFAULT_CAPABILITIES, D as DoGenerateParams, f as DoGenerateResult, E as ErrorChunk, F as FilePart, s as FinishChunk, u as FinishReason, m as GenerateStep, I as ImagePart, L as LanguageModel, M as ModelCapabilities, R as ResponseOptions, v as StorageFile, o as StreamChunk, n as StreamPart, g as SystemMessage, p as TextDeltaChunk, j as TextPart, t as TokenUsage, k as ToolCall, q as ToolCallChunk, h as ToolMessage, l as ToolResult, r as ToolResultChunk, i as UserContentPart, U as UserMessage } from './types-CR8mi9I0.mjs';
3
3
  import { z } from 'zod';
4
+ import { A as ActionDefinition, T as ToolDefinition, a as ToolProfile, K as KnowledgeBaseConfig, W as WebSearchConfig, L as LLMAdapter, D as DoneEventMessage, S as StreamEvent, b as ToolCallInfo, c as TokenUsageRaw, P as ProviderToolRuntimeOptions, M as Message, d as ToolResponse } from './base-5n-UuPfS.mjs';
5
+ export { e as AdapterFactory, m as AnthropicProviderToolOptions, j as AnthropicToolSelectionHints, C as ChatCompletionRequest, n as Citation, f as LLMConfig, l as OpenAIProviderToolOptions, O as OpenAIToolSelectionHints, i as ToolExecution, g as ToolLocation, k as ToolNativeProviderHints, U as UnifiedToolCall, h as UnifiedToolResult } from './base-5n-UuPfS.mjs';
6
+ import { A as AIProvider } from './types-VDgiUvH2.mjs';
7
+ export { a as AnthropicProviderConfig, f as AnthropicTool, h as AnthropicToolResult, g as AnthropicToolUse, b as AzureProviderConfig, B as BaseProviderConfig, m as GeminiFunctionCall, l as GeminiFunctionDeclaration, n as GeminiFunctionResponse, G as GoogleProviderConfig, d as OllamaModelOptions, c as OllamaProviderConfig, O as OpenAIProviderConfig, i as OpenAITool, j as OpenAIToolCall, k as OpenAIToolResult, P as ProviderCapabilities, e as ProviderFormatter, X as XAIProviderConfig } from './types-VDgiUvH2.mjs';
4
8
  import * as hono from 'hono';
5
9
  import { Hono } from 'hono';
10
+ export { F as FallbackChainConfig, c as FallbackFailure, d as FallbackInfo, b as RetryBackoff, e as RetryInfo, R as RoutingStore, a as RoutingStrategy } from './types-BQl1suAv.mjs';
6
11
 
7
12
  /**
8
13
  * generateText - Generate text using a language model
@@ -257,6 +262,17 @@ interface RuntimeConfigWithAdapter {
257
262
  * Set to true for defaults, or pass WebSearchConfig for customization.
258
263
  */
259
264
  webSearch?: boolean | WebSearchConfig;
265
+ /**
266
+ * Storage adapter for automatic session creation and message persistence.
267
+ * When provided, runtime.chat() and runtime.stream() auto-save messages.
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * import { createYourGPT } from '@yourgpt/llm-sdk/yourgpt'
272
+ * storage: createYourGPT({ apiKey, widgetUid })
273
+ * ```
274
+ */
275
+ storage?: StorageAdapter;
260
276
  }
261
277
  /**
262
278
  * Runtime configuration with AIProvider
@@ -303,6 +319,17 @@ interface RuntimeConfigWithProvider {
303
319
  * Set to true for defaults, or pass WebSearchConfig for customization.
304
320
  */
305
321
  webSearch?: boolean | WebSearchConfig;
322
+ /**
323
+ * Storage adapter for automatic session creation and message persistence.
324
+ * When provided, runtime.chat() and runtime.stream() auto-save messages.
325
+ *
326
+ * @example
327
+ * ```ts
328
+ * import { createYourGPT } from '@yourgpt/llm-sdk/yourgpt'
329
+ * storage: createYourGPT({ apiKey, widgetUid })
330
+ * ```
331
+ */
332
+ storage?: StorageAdapter;
306
333
  }
307
334
  /**
308
335
  * Runtime configuration - provide either a provider instance or a custom adapter
@@ -537,6 +564,8 @@ interface OnFinishResult {
537
564
  completionTokens: number;
538
565
  totalTokens: number;
539
566
  };
567
+ /** Session ID — present when storage adapter created/resolved a session */
568
+ threadId?: string;
540
569
  }
541
570
  /**
542
571
  * Options for StreamResult constructor
@@ -562,6 +591,8 @@ interface CollectedResult {
562
591
  requiresAction: boolean;
563
592
  /** Token usage for billing/tracking */
564
593
  usage?: TokenUsageRaw;
594
+ /** Session ID — present when storage adapter created/resolved a session */
595
+ threadId?: string;
565
596
  /** Raw events (for debugging) */
566
597
  events: StreamEvent[];
567
598
  }
@@ -870,6 +901,7 @@ type ToolSearchState = {
870
901
  declare class Runtime {
871
902
  private adapter;
872
903
  private config;
904
+ private storage;
873
905
  private actions;
874
906
  private tools;
875
907
  constructor(config: RuntimeConfig);
@@ -1034,6 +1066,7 @@ declare class Runtime {
1034
1066
  */
1035
1067
  onFinish?: (result: {
1036
1068
  messages: DoneEventMessage[];
1069
+ threadId?: string;
1037
1070
  usage?: {
1038
1071
  promptTokens: number;
1039
1072
  completionTokens: number;
@@ -1464,6 +1497,32 @@ interface AgentLoopOptions {
1464
1497
  */
1465
1498
  declare function runAgentLoop(options: AgentLoopOptions): AsyncGenerator<StreamEvent>;
1466
1499
 
1500
+ /**
1501
+ * Storage Helpers
1502
+ *
1503
+ * Extract input/output messages from request/response for storage adapters.
1504
+ * Used internally by Runtime when `storage` is configured.
1505
+ */
1506
+
1507
+ /**
1508
+ * Extract new INPUT messages from a request's message array.
1509
+ *
1510
+ * The SDK sends the full conversation history on each request. This function
1511
+ * picks only the NEW messages the user just added:
1512
+ * - New user turn (last meaningful msg = "user"): returns [userMsg]
1513
+ * - Tool continuation (last meaningful msg = "tool"): returns tool results after last assistant
1514
+ * - Otherwise: returns []
1515
+ *
1516
+ * Skips empty assistant placeholders the SDK pushes before sending.
1517
+ */
1518
+ declare function extractInputMessages(reqMessages: unknown[]): StorageMessage[];
1519
+ /**
1520
+ * Map LLM output messages (DoneEventMessage format) to StorageMessage format.
1521
+ *
1522
+ * Converts from snake_case API format to camelCase storage format.
1523
+ */
1524
+ declare function mapOutputMessages(resultMessages: DoneEventMessage[]): StorageMessage[];
1525
+
1467
1526
  /**
1468
1527
  * Generate a message ID
1469
1528
  */
@@ -1477,4 +1536,4 @@ declare function generateThreadId(): string;
1477
1536
  */
1478
1537
  declare function generateToolCallId(): string;
1479
1538
 
1480
- export { AIProvider, ActionDefinition, type ActionRequest, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, ProviderToolRuntimeOptions, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolProfile, ToolResponse, type ToolSearchMatch, WebSearchConfig, buildProviderToolOptions, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, searchTools, selectTools, shouldExposeToolSearch, streamText, tool };
1539
+ export { AIProvider, ActionDefinition, type ActionRequest, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, ProviderToolRuntimeOptions, type RequestContext, Runtime, type RuntimeConfig, StorageAdapter, StorageMessage, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolProfile, ToolResponse, type ToolSearchMatch, WebSearchConfig, buildProviderToolOptions, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, extractInputMessages, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, mapOutputMessages, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, searchTools, selectTools, shouldExposeToolSearch, streamText, tool };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,13 @@
1
- import { G as GenerateTextParams, a as GenerateTextResult, S as StreamTextParams, b as StreamTextResult, T as ToolContext, c as Tool, A as AIProvider, d as ActionDefinition, e as ToolDefinition, f as ToolProfile, K as KnowledgeBaseConfig, W as WebSearchConfig, L as LLMAdapter, D as DoneEventMessage, g as StreamEvent, h as ToolCallInfo, i as TokenUsageRaw, P as ProviderToolRuntimeOptions, M as Message, j as ToolResponse } from './types-COAOEe_y.js';
2
- export { V as AdapterFactory, _ as AnthropicProviderConfig, an as AnthropicProviderToolOptions, a5 as AnthropicTool, a7 as AnthropicToolResult, ak as AnthropicToolSelectionHints, a6 as AnthropicToolUse, p as AssistantMessage, a1 as AzureProviderConfig, Y as BaseProviderConfig, Q as ChatCompletionRequest, ao as Citation, C as CoreMessage, O as DEFAULT_CAPABILITIES, m as DoGenerateParams, n as DoGenerateResult, H as ErrorChunk, F as FilePart, E as FinishChunk, N as FinishReason, ac as GeminiFunctionCall, ab as GeminiFunctionDeclaration, ad as GeminiFunctionResponse, v as GenerateStep, $ as GoogleProviderConfig, I as ImagePart, ae as LLMConfig, k as LanguageModel, l as ModelCapabilities, a3 as OllamaModelOptions, a2 as OllamaProviderConfig, Z as OpenAIProviderConfig, am as OpenAIProviderToolOptions, a8 as OpenAITool, a9 as OpenAIToolCall, aa as OpenAIToolResult, aj as OpenAIToolSelectionHints, X as ProviderCapabilities, a4 as ProviderFormatter, R as ResponseOptions, x as StreamChunk, w as StreamPart, o as SystemMessage, y as TextDeltaChunk, s as TextPart, J as TokenUsage, t as ToolCall, z as ToolCallChunk, ai as ToolExecution, af as ToolLocation, q as ToolMessage, al as ToolNativeProviderHints, u as ToolResult, B as ToolResultChunk, ag as UnifiedToolCall, ah as UnifiedToolResult, r as UserContentPart, U as UserMessage, a0 as XAIProviderConfig } from './types-COAOEe_y.js';
1
+ import { G as GenerateTextParams, a as GenerateTextResult, S as StreamTextParams, b as StreamTextResult, T as ToolContext, c as Tool, d as StorageAdapter, e as StorageMessage } from './types-CR8mi9I0.js';
2
+ export { A as AssistantMessage, C as CoreMessage, w as DEFAULT_CAPABILITIES, D as DoGenerateParams, f as DoGenerateResult, E as ErrorChunk, F as FilePart, s as FinishChunk, u as FinishReason, m as GenerateStep, I as ImagePart, L as LanguageModel, M as ModelCapabilities, R as ResponseOptions, v as StorageFile, o as StreamChunk, n as StreamPart, g as SystemMessage, p as TextDeltaChunk, j as TextPart, t as TokenUsage, k as ToolCall, q as ToolCallChunk, h as ToolMessage, l as ToolResult, r as ToolResultChunk, i as UserContentPart, U as UserMessage } from './types-CR8mi9I0.js';
3
3
  import { z } from 'zod';
4
+ import { A as ActionDefinition, T as ToolDefinition, a as ToolProfile, K as KnowledgeBaseConfig, W as WebSearchConfig, L as LLMAdapter, D as DoneEventMessage, S as StreamEvent, b as ToolCallInfo, c as TokenUsageRaw, P as ProviderToolRuntimeOptions, M as Message, d as ToolResponse } from './base-Di31iy_8.js';
5
+ export { e as AdapterFactory, m as AnthropicProviderToolOptions, j as AnthropicToolSelectionHints, C as ChatCompletionRequest, n as Citation, f as LLMConfig, l as OpenAIProviderToolOptions, O as OpenAIToolSelectionHints, i as ToolExecution, g as ToolLocation, k as ToolNativeProviderHints, U as UnifiedToolCall, h as UnifiedToolResult } from './base-Di31iy_8.js';
6
+ import { A as AIProvider } from './types-C0vLXzuw.js';
7
+ export { a as AnthropicProviderConfig, f as AnthropicTool, h as AnthropicToolResult, g as AnthropicToolUse, b as AzureProviderConfig, B as BaseProviderConfig, m as GeminiFunctionCall, l as GeminiFunctionDeclaration, n as GeminiFunctionResponse, G as GoogleProviderConfig, d as OllamaModelOptions, c as OllamaProviderConfig, O as OpenAIProviderConfig, i as OpenAITool, j as OpenAIToolCall, k as OpenAIToolResult, P as ProviderCapabilities, e as ProviderFormatter, X as XAIProviderConfig } from './types-C0vLXzuw.js';
4
8
  import * as hono from 'hono';
5
9
  import { Hono } from 'hono';
10
+ export { F as FallbackChainConfig, c as FallbackFailure, d as FallbackInfo, b as RetryBackoff, e as RetryInfo, R as RoutingStore, a as RoutingStrategy } from './types-CNL8ZRne.js';
6
11
 
7
12
  /**
8
13
  * generateText - Generate text using a language model
@@ -257,6 +262,17 @@ interface RuntimeConfigWithAdapter {
257
262
  * Set to true for defaults, or pass WebSearchConfig for customization.
258
263
  */
259
264
  webSearch?: boolean | WebSearchConfig;
265
+ /**
266
+ * Storage adapter for automatic session creation and message persistence.
267
+ * When provided, runtime.chat() and runtime.stream() auto-save messages.
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * import { createYourGPT } from '@yourgpt/llm-sdk/yourgpt'
272
+ * storage: createYourGPT({ apiKey, widgetUid })
273
+ * ```
274
+ */
275
+ storage?: StorageAdapter;
260
276
  }
261
277
  /**
262
278
  * Runtime configuration with AIProvider
@@ -303,6 +319,17 @@ interface RuntimeConfigWithProvider {
303
319
  * Set to true for defaults, or pass WebSearchConfig for customization.
304
320
  */
305
321
  webSearch?: boolean | WebSearchConfig;
322
+ /**
323
+ * Storage adapter for automatic session creation and message persistence.
324
+ * When provided, runtime.chat() and runtime.stream() auto-save messages.
325
+ *
326
+ * @example
327
+ * ```ts
328
+ * import { createYourGPT } from '@yourgpt/llm-sdk/yourgpt'
329
+ * storage: createYourGPT({ apiKey, widgetUid })
330
+ * ```
331
+ */
332
+ storage?: StorageAdapter;
306
333
  }
307
334
  /**
308
335
  * Runtime configuration - provide either a provider instance or a custom adapter
@@ -537,6 +564,8 @@ interface OnFinishResult {
537
564
  completionTokens: number;
538
565
  totalTokens: number;
539
566
  };
567
+ /** Session ID — present when storage adapter created/resolved a session */
568
+ threadId?: string;
540
569
  }
541
570
  /**
542
571
  * Options for StreamResult constructor
@@ -562,6 +591,8 @@ interface CollectedResult {
562
591
  requiresAction: boolean;
563
592
  /** Token usage for billing/tracking */
564
593
  usage?: TokenUsageRaw;
594
+ /** Session ID — present when storage adapter created/resolved a session */
595
+ threadId?: string;
565
596
  /** Raw events (for debugging) */
566
597
  events: StreamEvent[];
567
598
  }
@@ -870,6 +901,7 @@ type ToolSearchState = {
870
901
  declare class Runtime {
871
902
  private adapter;
872
903
  private config;
904
+ private storage;
873
905
  private actions;
874
906
  private tools;
875
907
  constructor(config: RuntimeConfig);
@@ -1034,6 +1066,7 @@ declare class Runtime {
1034
1066
  */
1035
1067
  onFinish?: (result: {
1036
1068
  messages: DoneEventMessage[];
1069
+ threadId?: string;
1037
1070
  usage?: {
1038
1071
  promptTokens: number;
1039
1072
  completionTokens: number;
@@ -1464,6 +1497,32 @@ interface AgentLoopOptions {
1464
1497
  */
1465
1498
  declare function runAgentLoop(options: AgentLoopOptions): AsyncGenerator<StreamEvent>;
1466
1499
 
1500
+ /**
1501
+ * Storage Helpers
1502
+ *
1503
+ * Extract input/output messages from request/response for storage adapters.
1504
+ * Used internally by Runtime when `storage` is configured.
1505
+ */
1506
+
1507
+ /**
1508
+ * Extract new INPUT messages from a request's message array.
1509
+ *
1510
+ * The SDK sends the full conversation history on each request. This function
1511
+ * picks only the NEW messages the user just added:
1512
+ * - New user turn (last meaningful msg = "user"): returns [userMsg]
1513
+ * - Tool continuation (last meaningful msg = "tool"): returns tool results after last assistant
1514
+ * - Otherwise: returns []
1515
+ *
1516
+ * Skips empty assistant placeholders the SDK pushes before sending.
1517
+ */
1518
+ declare function extractInputMessages(reqMessages: unknown[]): StorageMessage[];
1519
+ /**
1520
+ * Map LLM output messages (DoneEventMessage format) to StorageMessage format.
1521
+ *
1522
+ * Converts from snake_case API format to camelCase storage format.
1523
+ */
1524
+ declare function mapOutputMessages(resultMessages: DoneEventMessage[]): StorageMessage[];
1525
+
1467
1526
  /**
1468
1527
  * Generate a message ID
1469
1528
  */
@@ -1477,4 +1536,4 @@ declare function generateThreadId(): string;
1477
1536
  */
1478
1537
  declare function generateToolCallId(): string;
1479
1538
 
1480
- export { AIProvider, ActionDefinition, type ActionRequest, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, ProviderToolRuntimeOptions, type RequestContext, Runtime, type RuntimeConfig, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolProfile, ToolResponse, type ToolSearchMatch, WebSearchConfig, buildProviderToolOptions, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, searchTools, selectTools, shouldExposeToolSearch, streamText, tool };
1539
+ export { AIProvider, ActionDefinition, type ActionRequest, type AgentLoopOptions, type ChatRequest, type CollectedResult, type CopilotChatResponse, DEFAULT_MAX_ITERATIONS, DoneEventMessage, GenerateResult, type GenerateResultData, GenerateTextParams, GenerateTextResult, LLMAdapter, Message, ProviderToolRuntimeOptions, type RequestContext, Runtime, type RuntimeConfig, StorageAdapter, StorageMessage, StreamEvent, StreamResult, type StreamResultOptions, StreamTextParams, StreamTextResult, TokenUsageRaw, Tool, ToolCallInfo, ToolContext, ToolDefinition, ToolProfile, ToolResponse, type ToolSearchMatch, WebSearchConfig, buildProviderToolOptions, createEventStream, createExpressHandler, createExpressMiddleware, createHonoApp, createNextHandler, createNodeHandler, createRuntime, createSSEHeaders, createSSEResponse, createStreamResult, createTextStreamHeaders, createTextStreamResponse, extractInputMessages, formatSSEData, formatToolsForAnthropic, formatToolsForGoogle, formatToolsForOpenAI, generateMessageId, generateText, generateThreadId, generateToolCallId, mapOutputMessages, pipeSSEToResponse, pipeTextToResponse, runAgentLoop, searchTools, selectTools, shouldExposeToolSearch, streamText, tool };