@tanstack/ai 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/activities/chat/adapter.d.ts +6 -1
- package/dist/esm/activities/chat/adapter.js.map +1 -1
- package/dist/esm/activities/chat/index.d.ts +8 -0
- package/dist/esm/activities/chat/index.js +78 -17
- package/dist/esm/activities/chat/index.js.map +1 -1
- package/dist/esm/activities/chat/middleware/compose.d.ts +3 -1
- package/dist/esm/activities/chat/middleware/compose.js +79 -1
- package/dist/esm/activities/chat/middleware/compose.js.map +1 -1
- package/dist/esm/activities/error-payload.d.ts +12 -0
- package/dist/esm/activities/error-payload.js +25 -0
- package/dist/esm/activities/error-payload.js.map +1 -0
- package/dist/esm/activities/generateAudio/adapter.d.ts +62 -0
- package/dist/esm/activities/generateAudio/adapter.js +14 -0
- package/dist/esm/activities/generateAudio/adapter.js.map +1 -0
- package/dist/esm/activities/generateAudio/index.d.ts +74 -0
- package/dist/esm/activities/generateAudio/index.js +80 -0
- package/dist/esm/activities/generateAudio/index.js.map +1 -0
- package/dist/esm/activities/generateImage/adapter.d.ts +1 -1
- package/dist/esm/activities/generateImage/adapter.js +1 -1
- package/dist/esm/activities/generateImage/adapter.js.map +1 -1
- package/dist/esm/activities/generateImage/index.d.ts +7 -0
- package/dist/esm/activities/generateImage/index.js +19 -3
- package/dist/esm/activities/generateImage/index.js.map +1 -1
- package/dist/esm/activities/generateSpeech/adapter.d.ts +1 -1
- package/dist/esm/activities/generateSpeech/adapter.js +1 -1
- package/dist/esm/activities/generateSpeech/adapter.js.map +1 -1
- package/dist/esm/activities/generateSpeech/index.d.ts +10 -3
- package/dist/esm/activities/generateSpeech/index.js +32 -3
- package/dist/esm/activities/generateSpeech/index.js.map +1 -1
- package/dist/esm/activities/generateTranscription/adapter.d.ts +1 -1
- package/dist/esm/activities/generateTranscription/adapter.js +1 -1
- package/dist/esm/activities/generateTranscription/adapter.js.map +1 -1
- package/dist/esm/activities/generateTranscription/index.d.ts +10 -3
- package/dist/esm/activities/generateTranscription/index.js +43 -13
- package/dist/esm/activities/generateTranscription/index.js.map +1 -1
- package/dist/esm/activities/generateVideo/index.d.ts +7 -0
- package/dist/esm/activities/generateVideo/index.js +55 -13
- package/dist/esm/activities/generateVideo/index.js.map +1 -1
- package/dist/esm/activities/index.d.ts +5 -2
- package/dist/esm/activities/index.js +11 -6
- package/dist/esm/activities/index.js.map +1 -1
- package/dist/esm/activities/stream-generation-result.js +5 -6
- package/dist/esm/activities/stream-generation-result.js.map +1 -1
- package/dist/esm/activities/summarize/index.d.ts +7 -0
- package/dist/esm/activities/summarize/index.js +54 -19
- package/dist/esm/activities/summarize/index.js.map +1 -1
- package/dist/esm/adapter-internals.d.ts +4 -0
- package/dist/esm/adapter-internals.js +9 -0
- package/dist/esm/adapter-internals.js.map +1 -0
- package/dist/esm/index.d.ts +5 -2
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger/console-logger.d.ts +11 -0
- package/dist/esm/logger/console-logger.js +27 -0
- package/dist/esm/logger/console-logger.js.map +1 -0
- package/dist/esm/logger/internal-logger.d.ts +33 -0
- package/dist/esm/logger/internal-logger.js +69 -0
- package/dist/esm/logger/internal-logger.js.map +1 -0
- package/dist/esm/logger/resolve.d.ts +14 -0
- package/dist/esm/logger/resolve.js +54 -0
- package/dist/esm/logger/resolve.js.map +1 -0
- package/dist/esm/logger/types.d.ts +75 -0
- package/dist/esm/stream-to-response.js +3 -8
- package/dist/esm/stream-to-response.js.map +1 -1
- package/dist/esm/types.d.ts +97 -6
- package/package.json +6 -2
- package/skills/ai-core/SKILL.md +5 -3
- package/skills/ai-core/debug-logging/SKILL.md +263 -0
- package/skills/ai-core/media-generation/SKILL.md +154 -10
- package/src/activities/chat/adapter.ts +6 -1
- package/src/activities/chat/index.ts +104 -22
- package/src/activities/chat/middleware/compose.ts +84 -1
- package/src/activities/error-payload.ts +35 -0
- package/src/activities/generateAudio/adapter.ts +89 -0
- package/src/activities/generateAudio/index.ts +224 -0
- package/src/activities/generateImage/adapter.ts +1 -1
- package/src/activities/generateImage/index.ts +29 -3
- package/src/activities/generateSpeech/adapter.ts +1 -1
- package/src/activities/generateSpeech/index.ts +51 -9
- package/src/activities/generateTranscription/adapter.ts +1 -1
- package/src/activities/generateTranscription/index.ts +72 -17
- package/src/activities/generateVideo/index.ts +72 -13
- package/src/activities/index.ts +22 -0
- package/src/activities/stream-generation-result.ts +6 -7
- package/src/activities/summarize/index.ts +66 -20
- package/src/adapter-internals.ts +8 -0
- package/src/index.ts +13 -0
- package/src/logger/console-logger.ts +49 -0
- package/src/logger/internal-logger.ts +107 -0
- package/src/logger/resolve.ts +72 -0
- package/src/logger/types.ts +78 -0
- package/src/stream-to-response.ts +5 -10
- package/src/types.ts +110 -5
|
@@ -4,20 +4,25 @@ import { summarize, kind as kind2 } from "./summarize/index.js";
|
|
|
4
4
|
import { BaseSummarizeAdapter } from "./summarize/adapter.js";
|
|
5
5
|
import { generateImage, kind as kind3 } from "./generateImage/index.js";
|
|
6
6
|
import { BaseImageAdapter } from "./generateImage/adapter.js";
|
|
7
|
-
import {
|
|
7
|
+
import { kind as kind4, generateAudio } from "./generateAudio/index.js";
|
|
8
|
+
import { BaseAudioAdapter } from "./generateAudio/adapter.js";
|
|
9
|
+
import { generateVideo, getVideoJobStatus, kind as kind5 } from "./generateVideo/index.js";
|
|
8
10
|
import { BaseVideoAdapter } from "./generateVideo/adapter.js";
|
|
9
|
-
import { generateSpeech, kind as
|
|
11
|
+
import { generateSpeech, kind as kind6 } from "./generateSpeech/index.js";
|
|
10
12
|
import { BaseTTSAdapter } from "./generateSpeech/adapter.js";
|
|
11
|
-
import { generateTranscription, kind as
|
|
13
|
+
import { generateTranscription, kind as kind7 } from "./generateTranscription/index.js";
|
|
12
14
|
import { BaseTranscriptionAdapter } from "./generateTranscription/adapter.js";
|
|
13
15
|
export {
|
|
16
|
+
BaseAudioAdapter,
|
|
14
17
|
BaseImageAdapter,
|
|
15
18
|
BaseSummarizeAdapter,
|
|
16
19
|
BaseTTSAdapter,
|
|
17
20
|
BaseTextAdapter,
|
|
18
21
|
BaseTranscriptionAdapter,
|
|
19
22
|
BaseVideoAdapter,
|
|
23
|
+
kind4 as audioKind,
|
|
20
24
|
chat,
|
|
25
|
+
generateAudio,
|
|
21
26
|
generateImage,
|
|
22
27
|
generateSpeech,
|
|
23
28
|
generateTranscription,
|
|
@@ -27,8 +32,8 @@ export {
|
|
|
27
32
|
summarize,
|
|
28
33
|
kind2 as summarizeKind,
|
|
29
34
|
kind as textKind,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
kind7 as transcriptionKind,
|
|
36
|
+
kind6 as ttsKind,
|
|
37
|
+
kind5 as videoKind
|
|
33
38
|
};
|
|
34
39
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventType } from "@ag-ui/core";
|
|
2
|
+
import { toRunErrorPayload } from "./error-payload.js";
|
|
2
3
|
function createId(prefix) {
|
|
3
4
|
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
4
5
|
}
|
|
@@ -27,17 +28,15 @@ async function* streamGenerationResult(generator, options) {
|
|
|
27
28
|
timestamp: Date.now()
|
|
28
29
|
};
|
|
29
30
|
} catch (error) {
|
|
31
|
+
const payload = toRunErrorPayload(error, "Generation failed");
|
|
30
32
|
yield {
|
|
31
33
|
type: EventType.RUN_ERROR,
|
|
32
34
|
runId,
|
|
33
35
|
threadId,
|
|
34
|
-
message:
|
|
35
|
-
code:
|
|
36
|
+
message: payload.message,
|
|
37
|
+
code: payload.code,
|
|
36
38
|
// Deprecated nested form for backward compatibility
|
|
37
|
-
error:
|
|
38
|
-
message: error.message || "Generation failed",
|
|
39
|
-
code: error.code
|
|
40
|
-
},
|
|
39
|
+
error: payload,
|
|
41
40
|
timestamp: Date.now()
|
|
42
41
|
};
|
|
43
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-generation-result.js","sources":["../../../src/activities/stream-generation-result.ts"],"sourcesContent":["/**\n * Internal helper for wrapping one-shot generation results as StreamChunk\n * async iterables. NOT exported from the package — used only by activity\n * implementations to support `stream: true`.\n */\n\nimport { EventType } from '@ag-ui/core'\nimport type { StreamChunk } from '../types'\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Wrap a one-shot generation result as a StreamChunk async iterable.\n *\n * This allows non-streaming activities (image, speech, transcription, summarize)\n * to be sent over the same streaming transport as chat.\n *\n * @param generator - An async function that performs the generation and returns the result\n * @param options - Optional configuration (runId, threadId)\n * @returns An AsyncIterable of StreamChunks with RUN_STARTED, CUSTOM(generation:result), and RUN_FINISHED events on success, or RUN_STARTED and RUN_ERROR on failure\n */\nexport async function* streamGenerationResult<TResult>(\n generator: () => Promise<TResult>,\n options?: { runId?: string; threadId?: string },\n): AsyncIterable<StreamChunk> {\n const runId = options?.runId ?? createId('run')\n const threadId = options?.threadId ?? createId('thread')\n\n yield {\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n timestamp: Date.now(),\n } as StreamChunk\n\n try {\n const result = await generator()\n\n yield {\n type: EventType.CUSTOM,\n name: 'generation:result',\n value: result as unknown,\n timestamp: Date.now(),\n } as StreamChunk\n\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n finishReason: 'stop',\n timestamp: Date.now(),\n } as StreamChunk\n } catch (error:
|
|
1
|
+
{"version":3,"file":"stream-generation-result.js","sources":["../../../src/activities/stream-generation-result.ts"],"sourcesContent":["/**\n * Internal helper for wrapping one-shot generation results as StreamChunk\n * async iterables. NOT exported from the package — used only by activity\n * implementations to support `stream: true`.\n */\n\nimport { EventType } from '@ag-ui/core'\nimport { toRunErrorPayload } from './error-payload'\nimport type { StreamChunk } from '../types'\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n/**\n * Wrap a one-shot generation result as a StreamChunk async iterable.\n *\n * This allows non-streaming activities (image, speech, transcription, summarize)\n * to be sent over the same streaming transport as chat.\n *\n * @param generator - An async function that performs the generation and returns the result\n * @param options - Optional configuration (runId, threadId)\n * @returns An AsyncIterable of StreamChunks with RUN_STARTED, CUSTOM(generation:result), and RUN_FINISHED events on success, or RUN_STARTED and RUN_ERROR on failure\n */\nexport async function* streamGenerationResult<TResult>(\n generator: () => Promise<TResult>,\n options?: { runId?: string; threadId?: string },\n): AsyncIterable<StreamChunk> {\n const runId = options?.runId ?? createId('run')\n const threadId = options?.threadId ?? createId('thread')\n\n yield {\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n timestamp: Date.now(),\n } as StreamChunk\n\n try {\n const result = await generator()\n\n yield {\n type: EventType.CUSTOM,\n name: 'generation:result',\n value: result as unknown,\n timestamp: Date.now(),\n } as StreamChunk\n\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n finishReason: 'stop',\n timestamp: Date.now(),\n } as StreamChunk\n } catch (error: unknown) {\n const payload = toRunErrorPayload(error, 'Generation failed')\n yield {\n type: EventType.RUN_ERROR,\n runId,\n threadId,\n message: payload.message,\n code: payload.code,\n // Deprecated nested form for backward compatibility\n error: payload,\n timestamp: Date.now(),\n } as StreamChunk\n }\n}\n"],"names":[],"mappings":";;AAUA,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAYA,gBAAuB,uBACrB,WACA,SAC4B;AAC5B,QAAM,QAA0B,SAAS,KAAK;AAC9C,QAAM,WAAgC,SAAS,QAAQ;AAEvD,QAAM;AAAA,IACJ,MAAM,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,EAAI;AAGtB,MAAI;AACF,UAAM,SAAS,MAAM,UAAA;AAErB,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB,SAAS,OAAgB;AACvB,UAAM,UAAU,kBAAkB,OAAO,mBAAmB;AAC5D,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,MAEd,OAAO;AAAA,MACP,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB;AACF;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DebugOption } from '../../logger/types.js';
|
|
1
2
|
import { SummarizeAdapter } from './adapter.js';
|
|
2
3
|
import { StreamChunk, SummarizationResult } from '../../types.js';
|
|
3
4
|
/** The adapter kind this activity handles */
|
|
@@ -34,6 +35,12 @@ export interface SummarizeActivityOptions<TAdapter extends SummarizeAdapter<stri
|
|
|
34
35
|
* @default false
|
|
35
36
|
*/
|
|
36
37
|
stream?: TStream;
|
|
38
|
+
/**
|
|
39
|
+
* Enable debug logging. Pass `true` to enable all categories, `false` to
|
|
40
|
+
* silence everything including errors, or a `DebugConfig` object for granular
|
|
41
|
+
* control and/or a custom `Logger`.
|
|
42
|
+
*/
|
|
43
|
+
debug?: DebugOption;
|
|
37
44
|
}
|
|
38
45
|
/**
|
|
39
46
|
* Result type for the summarize activity.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { aiEventClient } from "@tanstack/ai-event-client";
|
|
2
2
|
import { streamGenerationResult } from "../stream-generation-result.js";
|
|
3
|
+
import { resolveDebugOption } from "../../logger/resolve.js";
|
|
3
4
|
const kind = "summarize";
|
|
4
5
|
function createId(prefix) {
|
|
5
6
|
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
@@ -21,6 +22,7 @@ async function runSummarize(options) {
|
|
|
21
22
|
const requestId = createId("summarize");
|
|
22
23
|
const inputLength = text.length;
|
|
23
24
|
const startTime = Date.now();
|
|
25
|
+
const logger = resolveDebugOption(options.debug);
|
|
24
26
|
aiEventClient.emit("summarize:request:started", {
|
|
25
27
|
requestId,
|
|
26
28
|
provider: adapter.name,
|
|
@@ -28,42 +30,75 @@ async function runSummarize(options) {
|
|
|
28
30
|
inputLength,
|
|
29
31
|
timestamp: startTime
|
|
30
32
|
});
|
|
33
|
+
logger.request(`activity=summarize provider=${adapter.name}`, {
|
|
34
|
+
provider: adapter.name,
|
|
35
|
+
model,
|
|
36
|
+
inputLength
|
|
37
|
+
});
|
|
31
38
|
const summarizeOptions = {
|
|
32
39
|
model,
|
|
33
40
|
text,
|
|
34
41
|
maxLength,
|
|
35
42
|
style,
|
|
36
|
-
focus
|
|
43
|
+
focus,
|
|
44
|
+
logger
|
|
37
45
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
try {
|
|
47
|
+
const result = await adapter.summarize(summarizeOptions);
|
|
48
|
+
const duration = Date.now() - startTime;
|
|
49
|
+
const outputLength = result.summary.length;
|
|
50
|
+
aiEventClient.emit("summarize:request:completed", {
|
|
51
|
+
requestId,
|
|
52
|
+
provider: adapter.name,
|
|
53
|
+
model,
|
|
54
|
+
inputLength,
|
|
55
|
+
outputLength,
|
|
56
|
+
duration,
|
|
57
|
+
timestamp: Date.now()
|
|
58
|
+
});
|
|
59
|
+
logger.output(`activity=summarize length=${outputLength}`, {
|
|
60
|
+
hasSummary: !!result.summary,
|
|
61
|
+
outputLength
|
|
62
|
+
});
|
|
63
|
+
return result;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.errors("summarize activity failed", {
|
|
66
|
+
error,
|
|
67
|
+
source: "summarize"
|
|
68
|
+
});
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
51
71
|
}
|
|
52
72
|
async function* runStreamingSummarize(options) {
|
|
53
73
|
const { adapter, text, maxLength, style, focus } = options;
|
|
54
74
|
const model = adapter.model;
|
|
75
|
+
const logger = resolveDebugOption(options.debug);
|
|
76
|
+
logger.request(`activity=summarize provider=${adapter.name}`, {
|
|
77
|
+
provider: adapter.name,
|
|
78
|
+
model,
|
|
79
|
+
stream: true
|
|
80
|
+
});
|
|
55
81
|
const summarizeOptions = {
|
|
56
82
|
model,
|
|
57
83
|
text,
|
|
58
84
|
maxLength,
|
|
59
85
|
style,
|
|
60
|
-
focus
|
|
86
|
+
focus,
|
|
87
|
+
logger
|
|
61
88
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
89
|
+
try {
|
|
90
|
+
if (adapter.summarizeStream) {
|
|
91
|
+
yield* adapter.summarizeStream(summarizeOptions);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
yield* streamGenerationResult(() => adapter.summarize(summarizeOptions));
|
|
95
|
+
} catch (error) {
|
|
96
|
+
logger.errors("summarize activity failed", {
|
|
97
|
+
error,
|
|
98
|
+
source: "summarize"
|
|
99
|
+
});
|
|
100
|
+
throw error;
|
|
65
101
|
}
|
|
66
|
-
yield* streamGenerationResult(() => adapter.summarize(summarizeOptions));
|
|
67
102
|
}
|
|
68
103
|
function createSummarizeOptions(options) {
|
|
69
104
|
return options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/activities/summarize/index.ts"],"sourcesContent":["/**\n * Summarize Activity\n *\n * Generates summaries from text input.\n * This is a self-contained module with implementation, types, and JSDoc.\n */\n\nimport { aiEventClient } from '@tanstack/ai-event-client'\nimport { streamGenerationResult } from '../stream-generation-result.js'\nimport type { SummarizeAdapter } from './adapter'\nimport type {\n StreamChunk,\n SummarizationOptions,\n SummarizationResult,\n} from '../../types'\n\n// ===========================\n// Activity Kind\n// ===========================\n\n/** The adapter kind this activity handles */\nexport const kind = 'summarize' as const\n\n// ===========================\n// Type Extraction Helpers\n// ===========================\n\n/** Extract provider options from a SummarizeAdapter via ~types */\nexport type SummarizeProviderOptions<TAdapter> =\n TAdapter extends SummarizeAdapter<any, any>\n ? TAdapter['~types']['providerOptions']\n : object\n\n// ===========================\n// Activity Options Type\n// ===========================\n\n/**\n * Options for the summarize activity.\n * The model is extracted from the adapter's model property.\n *\n * @template TAdapter - The summarize adapter type\n * @template TStream - Whether to stream the output\n */\nexport interface SummarizeActivityOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n> {\n /** The summarize adapter to use (must be created with a model) */\n adapter: TAdapter & { kind: typeof kind }\n /** The text to summarize */\n text: string\n /** Maximum length of the summary (in words or characters, provider-dependent) */\n maxLength?: number\n /** Style of summary to generate */\n style?: 'bullet-points' | 'paragraph' | 'concise'\n /** Topics or aspects to focus on in the summary */\n focus?: Array<string>\n /** Provider-specific options */\n modelOptions?: SummarizeProviderOptions<TAdapter>\n /**\n * Whether to stream the summarization result.\n * When true, returns an AsyncIterable<StreamChunk> for streaming output.\n * When false or not provided, returns a Promise<SummarizationResult>.\n *\n * @default false\n */\n stream?: TStream\n}\n\n// ===========================\n// Activity Result Type\n// ===========================\n\n/**\n * Result type for the summarize activity.\n * - If stream is true: AsyncIterable<StreamChunk>\n * - Otherwise: Promise<SummarizationResult>\n */\nexport type SummarizeActivityResult<TStream extends boolean> =\n TStream extends true\n ? AsyncIterable<StreamChunk>\n : Promise<SummarizationResult>\n\n// ===========================\n// Helper Functions\n// ===========================\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n// ===========================\n// Activity Implementation\n// ===========================\n\n/**\n * Summarize activity - generates summaries from text.\n *\n * Supports both streaming and non-streaming modes.\n *\n * @example Basic summarization\n * ```ts\n * import { summarize } from '@tanstack/ai'\n * import { openaiSummarize } from '@tanstack/ai-openai'\n *\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...'\n * })\n *\n * console.log(result.summary)\n * ```\n *\n * @example Summarization with style\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * style: 'bullet-points',\n * maxLength: 100\n * })\n * ```\n *\n * @example Focused summarization\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long technical document...',\n * focus: ['key findings', 'methodology']\n * })\n * ```\n *\n * @example Streaming summarization\n * ```ts\n * for await (const chunk of summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * stream: true\n * })) {\n * if (chunk.type === 'content') {\n * process.stdout.write(chunk.delta)\n * }\n * }\n * ```\n */\nexport function summarize<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityResult<TStream> {\n const { stream } = options\n\n if (stream) {\n return runStreamingSummarize(\n options as unknown as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n true\n >,\n ) as SummarizeActivityResult<TStream>\n }\n\n return runSummarize(\n options as unknown as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n false\n >,\n ) as SummarizeActivityResult<TStream>\n}\n\n/**\n * Run non-streaming summarization\n */\nasync function runSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, false>,\n): Promise<SummarizationResult> {\n const { adapter, text, maxLength, style, focus } = options\n const model = adapter.model\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n\n aiEventClient.emit('summarize:request:started', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n timestamp: startTime,\n })\n\n const summarizeOptions: SummarizationOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n }\n\n const result = await adapter.summarize(summarizeOptions)\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:request:completed', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n return result\n}\n\n/**\n * Run streaming summarization\n * Uses the adapter's native streaming if available, otherwise falls back\n * to non-streaming and yields the result as a single chunk.\n */\nasync function* runStreamingSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, true>,\n): AsyncIterable<StreamChunk> {\n const { adapter, text, maxLength, style, focus } = options\n const model = adapter.model\n\n const summarizeOptions: SummarizationOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n }\n\n // Use real streaming if the adapter supports it\n if (adapter.summarizeStream) {\n yield* adapter.summarizeStream(summarizeOptions)\n return\n }\n\n // Fall back to non-streaming — wrap result with streamGenerationResult\n yield* streamGenerationResult(() => adapter.summarize(summarizeOptions))\n}\n\n// ===========================\n// Options Factory\n// ===========================\n\n/**\n * Create typed options for the summarize() function without executing.\n */\nexport function createSummarizeOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityOptions<TAdapter, TStream> {\n return options\n}\n\n// Re-export adapter types\nexport type {\n SummarizeAdapter,\n SummarizeAdapterConfig,\n AnySummarizeAdapter,\n} from './adapter'\nexport { BaseSummarizeAdapter } from './adapter'\n"],"names":[],"mappings":";;AAqBO,MAAM,OAAO;AAmEpB,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAwDO,SAAS,UAId,SACkC;AAClC,QAAM,EAAE,WAAW;AAEnB,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,IAAA;AAAA,EAKJ;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAKJ;AAKA,eAAe,aACb,SAC8B;AAC9B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,UAAU;AACnD,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,KAAK,IAAA;AAEvB,gBAAc,KAAK,6BAA6B;AAAA,IAC9C;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EAAA,CACZ;AAED,QAAM,mBAAyC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,SAAS,MAAM,QAAQ,UAAU,gBAAgB;AAEvD,QAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,QAAM,eAAe,OAAO,QAAQ;AAEpC,gBAAc,KAAK,+BAA+B;AAAA,IAChD;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,EAAI,CACrB;AAED,SAAO;AACT;AAOA,gBAAgB,sBACd,SAC4B;AAC5B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,UAAU;AACnD,QAAM,QAAQ,QAAQ;AAEtB,QAAM,mBAAyC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAIF,MAAI,QAAQ,iBAAiB;AAC3B,WAAO,QAAQ,gBAAgB,gBAAgB;AAC/C;AAAA,EACF;AAGA,SAAO,uBAAuB,MAAM,QAAQ,UAAU,gBAAgB,CAAC;AACzE;AASO,SAAS,uBAId,SAC6C;AAC7C,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/activities/summarize/index.ts"],"sourcesContent":["/**\n * Summarize Activity\n *\n * Generates summaries from text input.\n * This is a self-contained module with implementation, types, and JSDoc.\n */\n\nimport { aiEventClient } from '@tanstack/ai-event-client'\nimport { streamGenerationResult } from '../stream-generation-result.js'\nimport { resolveDebugOption } from '../../logger/resolve'\nimport type { InternalLogger } from '../../logger/internal-logger'\nimport type { DebugOption } from '../../logger/types'\nimport type { SummarizeAdapter } from './adapter'\nimport type {\n StreamChunk,\n SummarizationOptions,\n SummarizationResult,\n} from '../../types'\n\n// ===========================\n// Activity Kind\n// ===========================\n\n/** The adapter kind this activity handles */\nexport const kind = 'summarize' as const\n\n// ===========================\n// Type Extraction Helpers\n// ===========================\n\n/** Extract provider options from a SummarizeAdapter via ~types */\nexport type SummarizeProviderOptions<TAdapter> =\n TAdapter extends SummarizeAdapter<any, any>\n ? TAdapter['~types']['providerOptions']\n : object\n\n// ===========================\n// Activity Options Type\n// ===========================\n\n/**\n * Options for the summarize activity.\n * The model is extracted from the adapter's model property.\n *\n * @template TAdapter - The summarize adapter type\n * @template TStream - Whether to stream the output\n */\nexport interface SummarizeActivityOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n> {\n /** The summarize adapter to use (must be created with a model) */\n adapter: TAdapter & { kind: typeof kind }\n /** The text to summarize */\n text: string\n /** Maximum length of the summary (in words or characters, provider-dependent) */\n maxLength?: number\n /** Style of summary to generate */\n style?: 'bullet-points' | 'paragraph' | 'concise'\n /** Topics or aspects to focus on in the summary */\n focus?: Array<string>\n /** Provider-specific options */\n modelOptions?: SummarizeProviderOptions<TAdapter>\n /**\n * Whether to stream the summarization result.\n * When true, returns an AsyncIterable<StreamChunk> for streaming output.\n * When false or not provided, returns a Promise<SummarizationResult>.\n *\n * @default false\n */\n stream?: TStream\n /**\n * Enable debug logging. Pass `true` to enable all categories, `false` to\n * silence everything including errors, or a `DebugConfig` object for granular\n * control and/or a custom `Logger`.\n */\n debug?: DebugOption\n}\n\n// ===========================\n// Activity Result Type\n// ===========================\n\n/**\n * Result type for the summarize activity.\n * - If stream is true: AsyncIterable<StreamChunk>\n * - Otherwise: Promise<SummarizationResult>\n */\nexport type SummarizeActivityResult<TStream extends boolean> =\n TStream extends true\n ? AsyncIterable<StreamChunk>\n : Promise<SummarizationResult>\n\n// ===========================\n// Helper Functions\n// ===========================\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n// ===========================\n// Activity Implementation\n// ===========================\n\n/**\n * Summarize activity - generates summaries from text.\n *\n * Supports both streaming and non-streaming modes.\n *\n * @example Basic summarization\n * ```ts\n * import { summarize } from '@tanstack/ai'\n * import { openaiSummarize } from '@tanstack/ai-openai'\n *\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...'\n * })\n *\n * console.log(result.summary)\n * ```\n *\n * @example Summarization with style\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * style: 'bullet-points',\n * maxLength: 100\n * })\n * ```\n *\n * @example Focused summarization\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long technical document...',\n * focus: ['key findings', 'methodology']\n * })\n * ```\n *\n * @example Streaming summarization\n * ```ts\n * for await (const chunk of summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * stream: true\n * })) {\n * if (chunk.type === 'content') {\n * process.stdout.write(chunk.delta)\n * }\n * }\n * ```\n */\nexport function summarize<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityResult<TStream> {\n const { stream } = options\n\n if (stream) {\n return runStreamingSummarize(\n options as unknown as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n true\n >,\n ) as SummarizeActivityResult<TStream>\n }\n\n return runSummarize(\n options as unknown as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n false\n >,\n ) as SummarizeActivityResult<TStream>\n}\n\n/**\n * Run non-streaming summarization\n */\nasync function runSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, false>,\n): Promise<SummarizationResult> {\n const { adapter, text, maxLength, style, focus } = options\n const model = adapter.model\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n aiEventClient.emit('summarize:request:started', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n timestamp: startTime,\n })\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n inputLength,\n })\n\n const summarizeOptions: SummarizationOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n logger,\n }\n\n try {\n const result = await adapter.summarize(summarizeOptions)\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:request:completed', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n logger.output(`activity=summarize length=${outputLength}`, {\n hasSummary: !!result.summary,\n outputLength,\n })\n\n return result\n } catch (error) {\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n/**\n * Run streaming summarization\n * Uses the adapter's native streaming if available, otherwise falls back\n * to non-streaming and yields the result as a single chunk.\n */\nasync function* runStreamingSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, true>,\n): AsyncIterable<StreamChunk> {\n const { adapter, text, maxLength, style, focus } = options\n const model = adapter.model\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n stream: true,\n })\n\n const summarizeOptions: SummarizationOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n logger,\n }\n\n try {\n // Use real streaming if the adapter supports it\n if (adapter.summarizeStream) {\n yield* adapter.summarizeStream(summarizeOptions)\n return\n }\n\n // Fall back to non-streaming — wrap result with streamGenerationResult\n yield* streamGenerationResult(() => adapter.summarize(summarizeOptions))\n } catch (error) {\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n// ===========================\n// Options Factory\n// ===========================\n\n/**\n * Create typed options for the summarize() function without executing.\n */\nexport function createSummarizeOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityOptions<TAdapter, TStream> {\n return options\n}\n\n// Re-export adapter types\nexport type {\n SummarizeAdapter,\n SummarizeAdapterConfig,\n AnySummarizeAdapter,\n} from './adapter'\nexport { BaseSummarizeAdapter } from './adapter'\n"],"names":[],"mappings":";;;AAwBO,MAAM,OAAO;AAyEpB,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAwDO,SAAS,UAId,SACkC;AAClC,QAAM,EAAE,WAAW;AAEnB,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,IAAA;AAAA,EAKJ;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAKJ;AAKA,eAAe,aACb,SAC8B;AAC9B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,UAAU;AACnD,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,KAAK,IAAA;AACvB,QAAM,SAAyB,mBAAmB,QAAQ,KAAK;AAE/D,gBAAc,KAAK,6BAA6B;AAAA,IAC9C;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EAAA,CACZ;AAED,SAAO,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;AAAA,IAC5D,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,mBAAyC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,UAAU,gBAAgB;AAEvD,UAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,UAAM,eAAe,OAAO,QAAQ;AAEpC,kBAAc,KAAK,+BAA+B;AAAA,MAChD;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI,CACrB;AAED,WAAO,OAAO,6BAA6B,YAAY,IAAI;AAAA,MACzD,YAAY,CAAC,CAAC,OAAO;AAAA,MACrB;AAAA,IAAA,CACD;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO,6BAA6B;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AACD,UAAM;AAAA,EACR;AACF;AAOA,gBAAgB,sBACd,SAC4B;AAC5B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,UAAU;AACnD,QAAM,QAAQ,QAAQ;AACtB,QAAM,SAAyB,mBAAmB,QAAQ,KAAK;AAE/D,SAAO,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;AAAA,IAC5D,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,EAAA,CACT;AAED,QAAM,mBAAyC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAI;AAEF,QAAI,QAAQ,iBAAiB;AAC3B,aAAO,QAAQ,gBAAgB,gBAAgB;AAC/C;AAAA,IACF;AAGA,WAAO,uBAAuB,MAAM,QAAQ,UAAU,gBAAgB,CAAC;AAAA,EACzE,SAAS,OAAO;AACd,WAAO,OAAO,6BAA6B;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AACD,UAAM;AAAA,EACR;AACF;AASO,SAAS,uBAId,SAC6C;AAC7C,SAAO;AACT;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InternalLogger } from "./logger/internal-logger.js";
|
|
2
|
+
import { resolveDebugOption } from "./logger/resolve.js";
|
|
3
|
+
import { toRunErrorPayload } from "./activities/error-payload.js";
|
|
4
|
+
export {
|
|
5
|
+
InternalLogger,
|
|
6
|
+
resolveDebugOption,
|
|
7
|
+
toRunErrorPayload
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=adapter-internals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-internals.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
export { chat, summarize, generateImage, generateVideo, getVideoJobStatus, generateSpeech, generateTranscription, } from './activities/index.js';
|
|
1
|
+
export { chat, summarize, generateImage, generateAudio, generateVideo, getVideoJobStatus, generateSpeech, generateTranscription, } from './activities/index.js';
|
|
2
2
|
export { createChatOptions } from './activities/chat/index.js';
|
|
3
3
|
export { createSummarizeOptions } from './activities/summarize/index.js';
|
|
4
4
|
export { createImageOptions } from './activities/generateImage/index.js';
|
|
5
|
+
export { createAudioOptions } from './activities/generateAudio/index.js';
|
|
5
6
|
export { createVideoOptions } from './activities/generateVideo/index.js';
|
|
6
7
|
export { createSpeechOptions } from './activities/generateSpeech/index.js';
|
|
7
8
|
export { createTranscriptionOptions } from './activities/generateTranscription/index.js';
|
|
8
|
-
export type { AIAdapter, ImageAdapter, AnyImageAdapter, TextAdapter, AnyTextAdapter, AnySummarizeAdapter, SummarizeAdapter, AnyTTSAdapter, TTSAdapter, AnyTranscriptionAdapter, TranscriptionAdapter, AnyVideoAdapter, VideoAdapter, } from './activities/index.js';
|
|
9
|
+
export type { AIAdapter, ImageAdapter, AnyImageAdapter, TextAdapter, AnyTextAdapter, AnySummarizeAdapter, SummarizeAdapter, AnyAudioAdapter, AudioAdapter, AnyTTSAdapter, TTSAdapter, AnyTranscriptionAdapter, TranscriptionAdapter, AnyVideoAdapter, VideoAdapter, } from './activities/index.js';
|
|
9
10
|
export { toolDefinition, type ToolDefinition, type ToolDefinitionInstance, type ToolDefinitionConfig, type ServerTool, type ClientTool, type AnyClientTool, type InferToolName, type InferToolInput, type InferToolOutput, } from './activities/chat/tools/tool-definition.js';
|
|
10
11
|
export { convertSchemaToJsonSchema } from './activities/chat/tools/schema-converter.js';
|
|
11
12
|
export { streamToText, toServerSentEventsStream, toServerSentEventsResponse, toHttpStream, toHttpResponse, } from './stream-to-response.js';
|
|
@@ -23,3 +24,5 @@ export { StreamProcessor, createReplayStream, ImmediateStrategy, PunctuationStra
|
|
|
23
24
|
export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorOptions, ToolCallState, ToolResultState, JSONParser, } from './activities/chat/stream/index.js';
|
|
24
25
|
export { createModel, extendAdapter } from './extend-adapter.js';
|
|
25
26
|
export type { ExtendedModelDef } from './extend-adapter.js';
|
|
27
|
+
export type { Logger, DebugCategories, DebugConfig, DebugOption, } from './logger/types.js';
|
|
28
|
+
export { ConsoleLogger } from './logger/console-logger.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { chat, createChatOptions } from "./activities/chat/index.js";
|
|
2
2
|
import { createSummarizeOptions, summarize } from "./activities/summarize/index.js";
|
|
3
3
|
import { createImageOptions, generateImage } from "./activities/generateImage/index.js";
|
|
4
|
+
import { createAudioOptions, generateAudio } from "./activities/generateAudio/index.js";
|
|
4
5
|
import { createVideoOptions, generateVideo, getVideoJobStatus } from "./activities/generateVideo/index.js";
|
|
5
6
|
import { createSpeechOptions, generateSpeech } from "./activities/generateSpeech/index.js";
|
|
6
7
|
import { createTranscriptionOptions, generateTranscription } from "./activities/generateTranscription/index.js";
|
|
@@ -14,6 +15,7 @@ import { detectImageMimeType } from "./utils.js";
|
|
|
14
15
|
import { realtimeToken } from "./realtime/index.js";
|
|
15
16
|
import { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages } from "./activities/chat/messages.js";
|
|
16
17
|
import { createModel, extendAdapter } from "./extend-adapter.js";
|
|
18
|
+
import { ConsoleLogger } from "./logger/console-logger.js";
|
|
17
19
|
import { StreamProcessor, createReplayStream } from "./activities/chat/stream/processor.js";
|
|
18
20
|
import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./activities/chat/stream/strategies.js";
|
|
19
21
|
import { PartialJSONParser, defaultJSONParser, parsePartialJSON } from "./activities/chat/stream/json-parser.js";
|
|
@@ -21,6 +23,7 @@ import { EventType } from "@ag-ui/core";
|
|
|
21
23
|
export {
|
|
22
24
|
BatchStrategy,
|
|
23
25
|
CompositeStrategy,
|
|
26
|
+
ConsoleLogger,
|
|
24
27
|
EventType,
|
|
25
28
|
ImmediateStrategy,
|
|
26
29
|
PartialJSONParser,
|
|
@@ -32,6 +35,7 @@ export {
|
|
|
32
35
|
combineStrategies,
|
|
33
36
|
convertMessagesToModelMessages,
|
|
34
37
|
convertSchemaToJsonSchema,
|
|
38
|
+
createAudioOptions,
|
|
35
39
|
createChatOptions,
|
|
36
40
|
createFrozenRegistry,
|
|
37
41
|
createImageOptions,
|
|
@@ -45,6 +49,7 @@ export {
|
|
|
45
49
|
defaultJSONParser,
|
|
46
50
|
detectImageMimeType,
|
|
47
51
|
extendAdapter,
|
|
52
|
+
generateAudio,
|
|
48
53
|
generateImage,
|
|
49
54
|
generateMessageId,
|
|
50
55
|
generateSpeech,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Logger } from './types.js';
|
|
2
|
+
export declare class ConsoleLogger implements Logger {
|
|
3
|
+
/** Log a debug-level message; forwards to `console.debug`. */
|
|
4
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
5
|
+
/** Log an info-level message; forwards to `console.info`. */
|
|
6
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
7
|
+
/** Log a warning-level message; forwards to `console.warn`. */
|
|
8
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
9
|
+
/** Log an error-level message; forwards to `console.error`. */
|
|
10
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const DIR_OPTIONS = { depth: null, colors: true };
|
|
2
|
+
class ConsoleLogger {
|
|
3
|
+
/** Log a debug-level message; forwards to `console.debug`. */
|
|
4
|
+
debug(message, meta) {
|
|
5
|
+
console.debug(message);
|
|
6
|
+
if (meta !== void 0) console.dir(meta, DIR_OPTIONS);
|
|
7
|
+
}
|
|
8
|
+
/** Log an info-level message; forwards to `console.info`. */
|
|
9
|
+
info(message, meta) {
|
|
10
|
+
console.info(message);
|
|
11
|
+
if (meta !== void 0) console.dir(meta, DIR_OPTIONS);
|
|
12
|
+
}
|
|
13
|
+
/** Log a warning-level message; forwards to `console.warn`. */
|
|
14
|
+
warn(message, meta) {
|
|
15
|
+
console.warn(message);
|
|
16
|
+
if (meta !== void 0) console.dir(meta, DIR_OPTIONS);
|
|
17
|
+
}
|
|
18
|
+
/** Log an error-level message; forwards to `console.error`. */
|
|
19
|
+
error(message, meta) {
|
|
20
|
+
console.error(message);
|
|
21
|
+
if (meta !== void 0) console.dir(meta, DIR_OPTIONS);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
ConsoleLogger
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=console-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-logger.js","sources":["../../../src/logger/console-logger.ts"],"sourcesContent":["import type { Logger } from './types'\n\n/**\n * Default `Logger` implementation that routes each level to the matching\n * `console` method:\n *\n * - `debug` → `console.debug`\n * - `info` → `console.info`\n * - `warn` → `console.warn`\n * - `error` → `console.error`\n *\n * When a `meta` object is supplied, the message is logged first and the meta\n * object is then printed via `console.dir(meta, { depth: null, colors: true })`\n * so deeply nested structures (e.g. provider chunk payloads with `usage`,\n * `output`, `reasoning`, `tools`) render in full instead of truncating to\n * `[Object]` / `[Array]`. On Node this produces a depth-unlimited inspect\n * dump; browsers present the object as an interactive tree (extra options\n * are ignored).\n *\n * This is the logger used when `debug` is enabled on any activity and no\n * custom `logger` is supplied via `debug: { logger }`.\n */\nconst DIR_OPTIONS = { depth: null, colors: true } as const\n\nexport class ConsoleLogger implements Logger {\n /** Log a debug-level message; forwards to `console.debug`. */\n debug(message: string, meta?: Record<string, unknown>): void {\n console.debug(message)\n if (meta !== undefined) console.dir(meta, DIR_OPTIONS)\n }\n\n /** Log an info-level message; forwards to `console.info`. */\n info(message: string, meta?: Record<string, unknown>): void {\n console.info(message)\n if (meta !== undefined) console.dir(meta, DIR_OPTIONS)\n }\n\n /** Log a warning-level message; forwards to `console.warn`. */\n warn(message: string, meta?: Record<string, unknown>): void {\n console.warn(message)\n if (meta !== undefined) console.dir(meta, DIR_OPTIONS)\n }\n\n /** Log an error-level message; forwards to `console.error`. */\n error(message: string, meta?: Record<string, unknown>): void {\n console.error(message)\n if (meta !== undefined) console.dir(meta, DIR_OPTIONS)\n }\n}\n"],"names":[],"mappings":"AAsBA,MAAM,cAAc,EAAE,OAAO,MAAM,QAAQ,KAAA;AAEpC,MAAM,cAAgC;AAAA;AAAA,EAE3C,MAAM,SAAiB,MAAsC;AAC3D,YAAQ,MAAM,OAAO;AACrB,QAAI,SAAS,OAAW,SAAQ,IAAI,MAAM,WAAW;AAAA,EACvD;AAAA;AAAA,EAGA,KAAK,SAAiB,MAAsC;AAC1D,YAAQ,KAAK,OAAO;AACpB,QAAI,SAAS,OAAW,SAAQ,IAAI,MAAM,WAAW;AAAA,EACvD;AAAA;AAAA,EAGA,KAAK,SAAiB,MAAsC;AAC1D,YAAQ,KAAK,OAAO;AACpB,QAAI,SAAS,OAAW,SAAQ,IAAI,MAAM,WAAW;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,SAAiB,MAAsC;AAC3D,YAAQ,MAAM,OAAO;AACrB,QAAI,SAAS,OAAW,SAAQ,IAAI,MAAM,WAAW;AAAA,EACvD;AACF;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DebugCategories, Logger } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fully-resolved categories map. Every flag is a definite boolean (never
|
|
4
|
+
* undefined), produced by `resolveDebugOption` from a `DebugOption`.
|
|
5
|
+
*/
|
|
6
|
+
export type ResolvedCategories = Required<DebugCategories>;
|
|
7
|
+
export declare class InternalLogger {
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private readonly categories;
|
|
10
|
+
constructor(logger: Logger, categories: ResolvedCategories);
|
|
11
|
+
/** Whether a category is enabled. Cheap, safe to call on hot paths. */
|
|
12
|
+
isEnabled(category: keyof ResolvedCategories): boolean;
|
|
13
|
+
private emit;
|
|
14
|
+
/** Log a raw chunk/frame received from a provider SDK. */
|
|
15
|
+
provider(message: string, meta?: Record<string, unknown>): void;
|
|
16
|
+
/** Log a chunk/result yielded to the consumer after middleware. */
|
|
17
|
+
output(message: string, meta?: Record<string, unknown>): void;
|
|
18
|
+
/** Log inputs/outputs around a middleware hook invocation. Chat-only. */
|
|
19
|
+
middleware(message: string, meta?: Record<string, unknown>): void;
|
|
20
|
+
/** Log before/after a tool-call execution. Chat-only. */
|
|
21
|
+
tools(message: string, meta?: Record<string, unknown>): void;
|
|
22
|
+
/** Log an agent-loop iteration marker or phase transition. Chat-only. */
|
|
23
|
+
agentLoop(message: string, meta?: Record<string, unknown>): void;
|
|
24
|
+
/** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */
|
|
25
|
+
config(message: string, meta?: Record<string, unknown>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Log a caught error. Defaults to on even when `debug` is unspecified.
|
|
28
|
+
* Uses the underlying logger's `error` level.
|
|
29
|
+
*/
|
|
30
|
+
errors(message: string, meta?: Record<string, unknown>): void;
|
|
31
|
+
/** Log outgoing request metadata before an adapter SDK call. */
|
|
32
|
+
request(message: string, meta?: Record<string, unknown>): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const CATEGORY_EMOJI = {
|
|
2
|
+
request: "📤",
|
|
3
|
+
provider: "📥",
|
|
4
|
+
output: "📨",
|
|
5
|
+
middleware: "🧩",
|
|
6
|
+
tools: "🔧",
|
|
7
|
+
agentLoop: "🔁",
|
|
8
|
+
config: "⚙️",
|
|
9
|
+
errors: "❌"
|
|
10
|
+
};
|
|
11
|
+
class InternalLogger {
|
|
12
|
+
constructor(logger, categories) {
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.categories = categories;
|
|
15
|
+
}
|
|
16
|
+
/** Whether a category is enabled. Cheap, safe to call on hot paths. */
|
|
17
|
+
isEnabled(category) {
|
|
18
|
+
return this.categories[category];
|
|
19
|
+
}
|
|
20
|
+
emit(level, category, message, meta) {
|
|
21
|
+
if (!this.categories[category]) return;
|
|
22
|
+
const emoji = CATEGORY_EMOJI[category];
|
|
23
|
+
const prefixed = `${emoji} [tanstack-ai:${category}] ${emoji} ${message}`;
|
|
24
|
+
try {
|
|
25
|
+
if (level === "error") this.logger.error(prefixed, meta);
|
|
26
|
+
else this.logger.debug(prefixed, meta);
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Log a raw chunk/frame received from a provider SDK. */
|
|
31
|
+
provider(message, meta) {
|
|
32
|
+
this.emit("debug", "provider", message, meta);
|
|
33
|
+
}
|
|
34
|
+
/** Log a chunk/result yielded to the consumer after middleware. */
|
|
35
|
+
output(message, meta) {
|
|
36
|
+
this.emit("debug", "output", message, meta);
|
|
37
|
+
}
|
|
38
|
+
/** Log inputs/outputs around a middleware hook invocation. Chat-only. */
|
|
39
|
+
middleware(message, meta) {
|
|
40
|
+
this.emit("debug", "middleware", message, meta);
|
|
41
|
+
}
|
|
42
|
+
/** Log before/after a tool-call execution. Chat-only. */
|
|
43
|
+
tools(message, meta) {
|
|
44
|
+
this.emit("debug", "tools", message, meta);
|
|
45
|
+
}
|
|
46
|
+
/** Log an agent-loop iteration marker or phase transition. Chat-only. */
|
|
47
|
+
agentLoop(message, meta) {
|
|
48
|
+
this.emit("debug", "agentLoop", message, meta);
|
|
49
|
+
}
|
|
50
|
+
/** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */
|
|
51
|
+
config(message, meta) {
|
|
52
|
+
this.emit("debug", "config", message, meta);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Log a caught error. Defaults to on even when `debug` is unspecified.
|
|
56
|
+
* Uses the underlying logger's `error` level.
|
|
57
|
+
*/
|
|
58
|
+
errors(message, meta) {
|
|
59
|
+
this.emit("error", "errors", message, meta);
|
|
60
|
+
}
|
|
61
|
+
/** Log outgoing request metadata before an adapter SDK call. */
|
|
62
|
+
request(message, meta) {
|
|
63
|
+
this.emit("debug", "request", message, meta);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
InternalLogger
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=internal-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-logger.js","sources":["../../../src/logger/internal-logger.ts"],"sourcesContent":["import type { DebugCategories, Logger } from './types'\n\n/**\n * Fully-resolved categories map. Every flag is a definite boolean (never\n * undefined), produced by `resolveDebugOption` from a `DebugOption`.\n */\nexport type ResolvedCategories = Required<DebugCategories>\n\n/**\n * Package-internal logger wrapper used by every activity and adapter in\n * `@tanstack/ai`. Wraps a user-supplied (or default `ConsoleLogger`) `Logger`\n * plus a fully-resolved per-category map. Each category has a dedicated\n * method that no-ops when its flag is `false`, or prepends a\n * `[tanstack-ai:<category>] ` prefix and calls the underlying logger's\n * `error` (for the `errors` category) or `debug` (for everything else).\n *\n * Not exported from the package root. Adapter packages consume it via the\n * `@tanstack/ai/adapter-internals` subpath export.\n */\n/**\n * Emoji marker per category — bracketing the `[tanstack-ai:<cat>]` tag on\n * both sides makes it trivial to visually pick out a category when scanning\n * dense streaming logs.\n */\nconst CATEGORY_EMOJI: Record<keyof ResolvedCategories, string> = {\n request: '📤',\n provider: '📥',\n output: '📨',\n middleware: '🧩',\n tools: '🔧',\n agentLoop: '🔁',\n config: '⚙️',\n errors: '❌',\n}\n\nexport class InternalLogger {\n constructor(\n private readonly logger: Logger,\n private readonly categories: ResolvedCategories,\n ) {}\n\n /** Whether a category is enabled. Cheap, safe to call on hot paths. */\n isEnabled(category: keyof ResolvedCategories): boolean {\n return this.categories[category]\n }\n\n private emit(\n level: 'debug' | 'error',\n category: keyof ResolvedCategories,\n message: string,\n meta?: Record<string, unknown>,\n ): void {\n if (!this.categories[category]) return\n const emoji = CATEGORY_EMOJI[category]\n const prefixed = `${emoji} [tanstack-ai:${category}] ${emoji} ${message}`\n try {\n if (level === 'error') this.logger.error(prefixed, meta)\n else this.logger.debug(prefixed, meta)\n } catch {\n // User-supplied logger threw; swallow so we never mask the original\n // error that triggered this log call.\n }\n }\n\n /** Log a raw chunk/frame received from a provider SDK. */\n provider(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'provider', message, meta)\n }\n\n /** Log a chunk/result yielded to the consumer after middleware. */\n output(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'output', message, meta)\n }\n\n /** Log inputs/outputs around a middleware hook invocation. Chat-only. */\n middleware(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'middleware', message, meta)\n }\n\n /** Log before/after a tool-call execution. Chat-only. */\n tools(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'tools', message, meta)\n }\n\n /** Log an agent-loop iteration marker or phase transition. Chat-only. */\n agentLoop(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'agentLoop', message, meta)\n }\n\n /** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */\n config(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'config', message, meta)\n }\n\n /**\n * Log a caught error. Defaults to on even when `debug` is unspecified.\n * Uses the underlying logger's `error` level.\n */\n errors(message: string, meta?: Record<string, unknown>): void {\n this.emit('error', 'errors', message, meta)\n }\n\n /** Log outgoing request metadata before an adapter SDK call. */\n request(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'request', message, meta)\n }\n}\n"],"names":[],"mappings":"AAwBA,MAAM,iBAA2D;AAAA,EAC/D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,MAAM,eAAe;AAAA,EAC1B,YACmB,QACA,YACjB;AAFiB,SAAA,SAAA;AACA,SAAA,aAAA;AAAA,EAChB;AAAA;AAAA,EAGH,UAAU,UAA6C;AACrD,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEQ,KACN,OACA,UACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,UAAM,QAAQ,eAAe,QAAQ;AACrC,UAAM,WAAW,GAAG,KAAK,iBAAiB,QAAQ,KAAK,KAAK,IAAI,OAAO;AACvE,QAAI;AACF,UAAI,UAAU,QAAS,MAAK,OAAO,MAAM,UAAU,IAAI;AAAA,UAClD,MAAK,OAAO,MAAM,UAAU,IAAI;AAAA,IACvC,QAAQ;AAAA,IAGR;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,SAAiB,MAAsC;AAC9D,SAAK,KAAK,SAAS,YAAY,SAAS,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,WAAW,SAAiB,MAAsC;AAChE,SAAK,KAAK,SAAS,cAAc,SAAS,IAAI;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,KAAK,SAAS,SAAS,SAAS,IAAI;AAAA,EAC3C;AAAA;AAAA,EAGA,UAAU,SAAiB,MAAsC;AAC/D,SAAK,KAAK,SAAS,aAAa,SAAS,IAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,QAAQ,SAAiB,MAAsC;AAC7D,SAAK,KAAK,SAAS,WAAW,SAAS,IAAI;AAAA,EAC7C;AACF;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { InternalLogger } from './internal-logger.js';
|
|
2
|
+
import { DebugOption } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Normalize a `DebugOption` into an `InternalLogger` ready to be threaded
|
|
5
|
+
* through the library's activities and adapters. See the `DebugOption`
|
|
6
|
+
* resolution table in the spec for the complete rules.
|
|
7
|
+
*
|
|
8
|
+
* - `undefined`: only the `errors` category is enabled; default `ConsoleLogger`.
|
|
9
|
+
* - `true`: all categories enabled; default `ConsoleLogger`.
|
|
10
|
+
* - `false`: all categories disabled (including `errors`); default `ConsoleLogger`.
|
|
11
|
+
* - `DebugConfig`: each unspecified category defaults to `true`; an optional
|
|
12
|
+
* `logger` replaces the default `ConsoleLogger`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveDebugOption(debug: DebugOption | undefined): InternalLogger;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ConsoleLogger } from "./console-logger.js";
|
|
2
|
+
import { InternalLogger } from "./internal-logger.js";
|
|
3
|
+
const ALL_OFF = {
|
|
4
|
+
provider: false,
|
|
5
|
+
output: false,
|
|
6
|
+
middleware: false,
|
|
7
|
+
tools: false,
|
|
8
|
+
agentLoop: false,
|
|
9
|
+
config: false,
|
|
10
|
+
errors: false,
|
|
11
|
+
request: false
|
|
12
|
+
};
|
|
13
|
+
const ALL_ON = {
|
|
14
|
+
provider: true,
|
|
15
|
+
output: true,
|
|
16
|
+
middleware: true,
|
|
17
|
+
tools: true,
|
|
18
|
+
agentLoop: true,
|
|
19
|
+
config: true,
|
|
20
|
+
errors: true,
|
|
21
|
+
request: true
|
|
22
|
+
};
|
|
23
|
+
const errorsOnlyCategories = () => ({
|
|
24
|
+
...ALL_OFF,
|
|
25
|
+
errors: true
|
|
26
|
+
});
|
|
27
|
+
const resolveCategoriesFromPartial = (partial) => ({
|
|
28
|
+
provider: partial.provider ?? true,
|
|
29
|
+
output: partial.output ?? true,
|
|
30
|
+
middleware: partial.middleware ?? true,
|
|
31
|
+
tools: partial.tools ?? true,
|
|
32
|
+
agentLoop: partial.agentLoop ?? true,
|
|
33
|
+
config: partial.config ?? true,
|
|
34
|
+
errors: partial.errors ?? true,
|
|
35
|
+
request: partial.request ?? true
|
|
36
|
+
});
|
|
37
|
+
function resolveDebugOption(debug) {
|
|
38
|
+
if (debug === void 0) {
|
|
39
|
+
return new InternalLogger(new ConsoleLogger(), errorsOnlyCategories());
|
|
40
|
+
}
|
|
41
|
+
if (debug === true) {
|
|
42
|
+
return new InternalLogger(new ConsoleLogger(), ALL_ON);
|
|
43
|
+
}
|
|
44
|
+
if (debug === false) {
|
|
45
|
+
return new InternalLogger(new ConsoleLogger(), ALL_OFF);
|
|
46
|
+
}
|
|
47
|
+
const { logger, ...cats } = debug;
|
|
48
|
+
const userLogger = logger ?? new ConsoleLogger();
|
|
49
|
+
return new InternalLogger(userLogger, resolveCategoriesFromPartial(cats));
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
resolveDebugOption
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sources":["../../../src/logger/resolve.ts"],"sourcesContent":["import { ConsoleLogger } from './console-logger'\nimport { InternalLogger } from './internal-logger'\nimport type { ResolvedCategories } from './internal-logger'\nimport type { DebugCategories, DebugConfig, DebugOption, Logger } from './types'\n\nconst ALL_OFF: ResolvedCategories = {\n provider: false,\n output: false,\n middleware: false,\n tools: false,\n agentLoop: false,\n config: false,\n errors: false,\n request: false,\n}\n\nconst ALL_ON: ResolvedCategories = {\n provider: true,\n output: true,\n middleware: true,\n tools: true,\n agentLoop: true,\n config: true,\n errors: true,\n request: true,\n}\n\nconst errorsOnlyCategories = (): ResolvedCategories => ({\n ...ALL_OFF,\n errors: true,\n})\n\nconst resolveCategoriesFromPartial = (\n partial: DebugCategories,\n): ResolvedCategories => ({\n provider: partial.provider ?? true,\n output: partial.output ?? true,\n middleware: partial.middleware ?? true,\n tools: partial.tools ?? true,\n agentLoop: partial.agentLoop ?? true,\n config: partial.config ?? true,\n errors: partial.errors ?? true,\n request: partial.request ?? true,\n})\n\n/**\n * Normalize a `DebugOption` into an `InternalLogger` ready to be threaded\n * through the library's activities and adapters. See the `DebugOption`\n * resolution table in the spec for the complete rules.\n *\n * - `undefined`: only the `errors` category is enabled; default `ConsoleLogger`.\n * - `true`: all categories enabled; default `ConsoleLogger`.\n * - `false`: all categories disabled (including `errors`); default `ConsoleLogger`.\n * - `DebugConfig`: each unspecified category defaults to `true`; an optional\n * `logger` replaces the default `ConsoleLogger`.\n */\nexport function resolveDebugOption(\n debug: DebugOption | undefined,\n): InternalLogger {\n if (debug === undefined) {\n return new InternalLogger(new ConsoleLogger(), errorsOnlyCategories())\n }\n if (debug === true) {\n return new InternalLogger(new ConsoleLogger(), ALL_ON)\n }\n if (debug === false) {\n return new InternalLogger(new ConsoleLogger(), ALL_OFF)\n }\n const { logger, ...cats }: DebugConfig = debug\n const userLogger: Logger = logger ?? new ConsoleLogger()\n return new InternalLogger(userLogger, resolveCategoriesFromPartial(cats))\n}\n"],"names":[],"mappings":";;AAKA,MAAM,UAA8B;AAAA,EAClC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,MAAM,SAA6B;AAAA,EACjC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,MAAM,uBAAuB,OAA2B;AAAA,EACtD,GAAG;AAAA,EACH,QAAQ;AACV;AAEA,MAAM,+BAA+B,CACnC,aACwB;AAAA,EACxB,UAAU,QAAQ,YAAY;AAAA,EAC9B,QAAQ,QAAQ,UAAU;AAAA,EAC1B,YAAY,QAAQ,cAAc;AAAA,EAClC,OAAO,QAAQ,SAAS;AAAA,EACxB,WAAW,QAAQ,aAAa;AAAA,EAChC,QAAQ,QAAQ,UAAU;AAAA,EAC1B,QAAQ,QAAQ,UAAU;AAAA,EAC1B,SAAS,QAAQ,WAAW;AAC9B;AAaO,SAAS,mBACd,OACgB;AAChB,MAAI,UAAU,QAAW;AACvB,WAAO,IAAI,eAAe,IAAI,cAAA,GAAiB,sBAAsB;AAAA,EACvE;AACA,MAAI,UAAU,MAAM;AAClB,WAAO,IAAI,eAAe,IAAI,cAAA,GAAiB,MAAM;AAAA,EACvD;AACA,MAAI,UAAU,OAAO;AACnB,WAAO,IAAI,eAAe,IAAI,cAAA,GAAiB,OAAO;AAAA,EACxD;AACA,QAAM,EAAE,QAAQ,GAAG,KAAA,IAAsB;AACzC,QAAM,aAAqB,UAAU,IAAI,cAAA;AACzC,SAAO,IAAI,eAAe,YAAY,6BAA6B,IAAI,CAAC;AAC1E;"}
|