langfx.js 0.1.0-alpha.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/LICENSE +202 -0
- package/NOTICE +11 -0
- package/README.md +107 -0
- package/dist/agentic.d.ts +128 -0
- package/dist/agentic.js +265 -0
- package/dist/agentic.js.map +1 -0
- package/dist/cache.d.ts +32 -0
- package/dist/cache.js +135 -0
- package/dist/cache.js.map +1 -0
- package/dist/cancellation.d.ts +9 -0
- package/dist/cancellation.js +70 -0
- package/dist/cancellation.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/json-stream.d.ts +73 -0
- package/dist/json-stream.js +222 -0
- package/dist/json-stream.js.map +1 -0
- package/dist/langfunc.d.ts +20 -0
- package/dist/langfunc.js +28 -0
- package/dist/langfunc.js.map +1 -0
- package/dist/language-model.d.ts +78 -0
- package/dist/language-model.js +218 -0
- package/dist/language-model.js.map +1 -0
- package/dist/llms/anthropic.d.ts +30 -0
- package/dist/llms/anthropic.js +365 -0
- package/dist/llms/anthropic.js.map +1 -0
- package/dist/llms/gemini.d.ts +34 -0
- package/dist/llms/gemini.js +380 -0
- package/dist/llms/gemini.js.map +1 -0
- package/dist/llms/images.d.ts +10 -0
- package/dist/llms/images.js +43 -0
- package/dist/llms/images.js.map +1 -0
- package/dist/llms/index.d.ts +7 -0
- package/dist/llms/index.js +4 -0
- package/dist/llms/index.js.map +1 -0
- package/dist/llms/openai.d.ts +30 -0
- package/dist/llms/openai.js +398 -0
- package/dist/llms/openai.js.map +1 -0
- package/dist/llms/transport.d.ts +4 -0
- package/dist/llms/transport.js +90 -0
- package/dist/llms/transport.js.map +1 -0
- package/dist/mapping.d.ts +71 -0
- package/dist/mapping.js +190 -0
- package/dist/mapping.js.map +1 -0
- package/dist/message.d.ts +56 -0
- package/dist/message.js +86 -0
- package/dist/message.js.map +1 -0
- package/dist/python-preview.d.ts +24 -0
- package/dist/python-preview.js +368 -0
- package/dist/python-preview.js.map +1 -0
- package/dist/python-stream.d.ts +15 -0
- package/dist/python-stream.js +29 -0
- package/dist/python-stream.js.map +1 -0
- package/dist/python.d.ts +85 -0
- package/dist/python.js +728 -0
- package/dist/python.js.map +1 -0
- package/dist/query.d.ts +31 -0
- package/dist/query.js +151 -0
- package/dist/query.js.map +1 -0
- package/dist/retry.d.ts +12 -0
- package/dist/retry.js +56 -0
- package/dist/retry.js.map +1 -0
- package/dist/schema/zod.d.ts +4 -0
- package/dist/schema/zod.js +7 -0
- package/dist/schema/zod.js.map +1 -0
- package/dist/schema.d.ts +10 -0
- package/dist/schema.js +7 -0
- package/dist/schema.js.map +1 -0
- package/dist/template.d.ts +14 -0
- package/dist/template.js +75 -0
- package/dist/template.js.map +1 -0
- package/dist/testing/index.d.ts +33 -0
- package/dist/testing/index.js +56 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tool-call.d.ts +27 -0
- package/dist/tool-call.js +16 -0
- package/dist/tool-call.js.map +1 -0
- package/dist/tools.d.ts +43 -0
- package/dist/tools.js +155 -0
- package/dist/tools.js.map +1 -0
- package/docs/ANTHROPIC.md +43 -0
- package/docs/API_DESIGN.md +200 -0
- package/docs/GEMINI.md +68 -0
- package/docs/IMPLEMENTATION_STATUS.md +77 -0
- package/docs/LIVE_TESTING.md +24 -0
- package/docs/MAPPING.md +54 -0
- package/docs/OPENAI.md +40 -0
- package/docs/PORTING_PLAN.md +135 -0
- package/docs/PROMPT_PARITY.md +379 -0
- package/docs/PYTHON_PROTOCOL.md +109 -0
- package/docs/PYTHON_PROTOCOL_PARITY.md +964 -0
- package/docs/PYTHON_SCHEMA_EVALUATION.md +93 -0
- package/docs/PYTHON_STREAMING_PARITY.md +59 -0
- package/docs/RELEASING.md +25 -0
- package/docs/RETRIES_AND_CACHE.md +56 -0
- package/docs/SESSION_EVENTS.md +40 -0
- package/docs/SOURCE_AUDIT.md +133 -0
- package/docs/STREAMING.md +76 -0
- package/docs/TOOL_STREAMING.md +31 -0
- package/package.json +95 -0
package/dist/agentic.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { abortable, cancellationScope, checkCancelled } from './cancellation.js';
|
|
2
|
+
import { CancelledError, SessionClosedError } from './errors.js';
|
|
3
|
+
import { query } from './query.js';
|
|
4
|
+
let serial = 0;
|
|
5
|
+
function trace(kind, name, parentId) {
|
|
6
|
+
return { id: `invocation-${++serial}`, parentId, kind, name, status: 'running', startedAt: Date.now(), endedAt: undefined, result: undefined, error: undefined, usage: undefined, metadata: Object.freeze({}), logs: [], progress: undefined, children: [] };
|
|
7
|
+
}
|
|
8
|
+
function snapshot(node) {
|
|
9
|
+
return Object.freeze({ ...node, logs: Object.freeze([...node.logs]), children: Object.freeze(node.children.map(snapshot)) });
|
|
10
|
+
}
|
|
11
|
+
function flatten(node) {
|
|
12
|
+
return node.children.flatMap(child => [child, ...flatten(child)]);
|
|
13
|
+
}
|
|
14
|
+
export class Session {
|
|
15
|
+
store;
|
|
16
|
+
node;
|
|
17
|
+
scope;
|
|
18
|
+
lm;
|
|
19
|
+
bound = false;
|
|
20
|
+
active = true;
|
|
21
|
+
operations = new Set();
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
const limit = options.maxTraceNodes ?? 10_000;
|
|
24
|
+
if (!Number.isInteger(limit) || limit < 1)
|
|
25
|
+
throw new RangeError('maxTraceNodes must be a positive integer.');
|
|
26
|
+
const logLimit = options.maxLogEntries ?? 10_000;
|
|
27
|
+
if (!Number.isInteger(logLimit) || logLimit < 0)
|
|
28
|
+
throw new RangeError('maxLogEntries must be a non-negative integer.');
|
|
29
|
+
this.lm = options.lm;
|
|
30
|
+
this.node = trace('session', 'Session');
|
|
31
|
+
this.scope = cancellationScope([options.signal], options.maxExecutionTime);
|
|
32
|
+
this.store = { root: this.node, closed: false, nodes: 1, limit, logLimit, logCount: 0, logSequence: 0, observers: new Set(), observerErrors: [], pending: new Set() };
|
|
33
|
+
}
|
|
34
|
+
get signal() { return this.scope.signal; }
|
|
35
|
+
/** Root session metadata, matching Python Session.metadata. */
|
|
36
|
+
get metadata() { return this.store.root.metadata; }
|
|
37
|
+
/** Snapshot of the invocation owned by this Session view. */
|
|
38
|
+
get currentInvocation() { return snapshot(this.node); }
|
|
39
|
+
get root() { return snapshot(this.store.root); }
|
|
40
|
+
get allActions() { return flatten(this.root).filter(node => node.kind === 'action'); }
|
|
41
|
+
get allQueries() { return flatten(this.root).filter(node => node.kind === 'query'); }
|
|
42
|
+
get allLogs() {
|
|
43
|
+
const root = this.root;
|
|
44
|
+
return Object.freeze([root, ...flatten(root)].flatMap(node => node.logs).sort((a, b) => a.sequence - b.sequence));
|
|
45
|
+
}
|
|
46
|
+
get observerErrors() { return [...this.store.observerErrors]; }
|
|
47
|
+
get usageSummary() { return this.summarizeUsage(false); }
|
|
48
|
+
get cachedUsageSummary() { return this.summarizeUsage(true); }
|
|
49
|
+
summarizeUsage(cached) {
|
|
50
|
+
let promptTokens = 0, completionTokens = 0, totalTokens = 0, unknownQueries = 0;
|
|
51
|
+
for (const node of this.allQueries) {
|
|
52
|
+
if (cached && !node.cacheHit)
|
|
53
|
+
continue;
|
|
54
|
+
const usage = cached ? node.cachedUsage : node.usage;
|
|
55
|
+
if (!usage)
|
|
56
|
+
unknownQueries++;
|
|
57
|
+
else {
|
|
58
|
+
promptTokens += usage.promptTokens;
|
|
59
|
+
completionTokens += usage.completionTokens;
|
|
60
|
+
totalTokens += usage.totalTokens;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { known: { promptTokens, completionTokens, totalTokens }, unknownQueries };
|
|
64
|
+
}
|
|
65
|
+
subscribe(observer) {
|
|
66
|
+
this.assertOpen();
|
|
67
|
+
this.store.observers.add(observer);
|
|
68
|
+
return () => { this.store.observers.delete(observer); };
|
|
69
|
+
}
|
|
70
|
+
/** Shallow-merge metadata into this view's invocation, never its parent. */
|
|
71
|
+
addMetadata(metadata) {
|
|
72
|
+
this.assertOpen();
|
|
73
|
+
if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata))
|
|
74
|
+
throw new TypeError('Metadata must be a record.');
|
|
75
|
+
this.node.metadata = Object.freeze({ ...this.node.metadata, ...metadata });
|
|
76
|
+
this.dispatch(Object.freeze({ type: 'metadata', invocation: snapshot(this.node) }));
|
|
77
|
+
}
|
|
78
|
+
debug(message, options = {}) { this.log('debug', message, options); }
|
|
79
|
+
info(message, options = {}) { this.log('info', message, options); }
|
|
80
|
+
warning(message, options = {}) { this.log('warning', message, options); }
|
|
81
|
+
error(message, options = {}) { this.log('error', message, options); }
|
|
82
|
+
fatal(message, options = {}) { this.log('fatal', message, options); }
|
|
83
|
+
updateProgress(title, metadata = {}) {
|
|
84
|
+
this.assertOpen();
|
|
85
|
+
if (typeof title !== 'string')
|
|
86
|
+
throw new TypeError('Progress title must be a string.');
|
|
87
|
+
const progress = Object.freeze({ title, timestamp: Date.now(), metadata: Object.freeze({ ...metadata }) });
|
|
88
|
+
this.node.progress = progress;
|
|
89
|
+
this.dispatch(Object.freeze({ type: 'progress', invocation: snapshot(this.node), progress }));
|
|
90
|
+
}
|
|
91
|
+
log(level, message, options) {
|
|
92
|
+
this.assertOpen();
|
|
93
|
+
if (typeof message !== 'string')
|
|
94
|
+
throw new TypeError('Log message must be a string.');
|
|
95
|
+
const keep = options.keep ?? true;
|
|
96
|
+
if (keep && this.store.logCount >= this.store.logLimit)
|
|
97
|
+
throw new RangeError('Session log limit reached. Use keep: false or increase maxLogEntries.');
|
|
98
|
+
const entry = Object.freeze({ sequence: ++this.store.logSequence, invocationId: this.node.id, timestamp: Date.now(), level, message, metadata: Object.freeze({ ...options.metadata }) });
|
|
99
|
+
if (keep) {
|
|
100
|
+
this.node.logs.push(entry);
|
|
101
|
+
this.store.logCount++;
|
|
102
|
+
}
|
|
103
|
+
this.dispatch(Object.freeze({ type: 'log', invocation: snapshot(this.node), entry }));
|
|
104
|
+
}
|
|
105
|
+
async query(prompt, schemaOrOptions = {}, options) {
|
|
106
|
+
const isSchema = typeof schemaOrOptions === 'function' || 'schema' in schemaOrOptions || 'parse' in schemaOrOptions;
|
|
107
|
+
const schema = isSchema ? schemaOrOptions : undefined;
|
|
108
|
+
const config = (isSchema ? options : schemaOrOptions) ?? {};
|
|
109
|
+
return this.execute('query', 'query', async (view) => {
|
|
110
|
+
const lm = config.lm ?? view.lm;
|
|
111
|
+
if (!lm)
|
|
112
|
+
throw new TypeError('Session.query requires a LanguageModel.');
|
|
113
|
+
const full = { ...config, lm, signal: view.signal, returnsMessage: true };
|
|
114
|
+
const response = schema ? await query(prompt, schema, full) : await query(prompt, full);
|
|
115
|
+
view.node.usage = response.metadata['usage'];
|
|
116
|
+
view.node.cacheHit = response.metadata['cacheHit'] === true;
|
|
117
|
+
if (response.metadata['cachedUsage'])
|
|
118
|
+
view.node.cachedUsage = response.metadata['cachedUsage'];
|
|
119
|
+
return config.returnsMessage ? response : response.result;
|
|
120
|
+
}, config);
|
|
121
|
+
}
|
|
122
|
+
async concurrentMap(inputs, fn, options = {}) {
|
|
123
|
+
const concurrency = options.maxConcurrency ?? 4;
|
|
124
|
+
if (!Number.isInteger(concurrency) || concurrency < 1)
|
|
125
|
+
throw new RangeError('maxConcurrency must be a positive integer.');
|
|
126
|
+
return this.execute('parallel', 'concurrentMap', async (group) => {
|
|
127
|
+
const batch = cancellationScope([group.signal]);
|
|
128
|
+
const results = new Array(inputs.length);
|
|
129
|
+
let cursor = 0;
|
|
130
|
+
let failed = false;
|
|
131
|
+
let failure;
|
|
132
|
+
const worker = async () => {
|
|
133
|
+
while (!failed && cursor < inputs.length) {
|
|
134
|
+
const index = cursor++;
|
|
135
|
+
try {
|
|
136
|
+
results[index] = await group.execute('branch', String(index), branch => fn(inputs[index], branch), { signal: batch.signal });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (!failed) {
|
|
140
|
+
failed = true;
|
|
141
|
+
failure = error;
|
|
142
|
+
batch.abort(error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
try {
|
|
148
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, inputs.length) }, worker));
|
|
149
|
+
if (failed)
|
|
150
|
+
throw failure;
|
|
151
|
+
return results;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
batch.dispose();
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/** @internal Action.invoke is the public action lifecycle entry point. */
|
|
159
|
+
async runAction(action, options = {}) {
|
|
160
|
+
return this.execute('action', action.name, view => action.call(view), options);
|
|
161
|
+
}
|
|
162
|
+
async dispose() {
|
|
163
|
+
if (this.bound)
|
|
164
|
+
throw new TypeError('Dispose the owning Session, not an invocation-bound view.');
|
|
165
|
+
if (!this.store.closed) {
|
|
166
|
+
this.store.closed = true;
|
|
167
|
+
this.scope.abort(new CancelledError('Session disposed.'));
|
|
168
|
+
await Promise.allSettled([...this.store.pending]);
|
|
169
|
+
this.node.status = this.node.children.some(child => child.status === 'cancelled') ? 'cancelled'
|
|
170
|
+
: this.node.children.some(child => child.status === 'failed') ? 'failed' : 'completed';
|
|
171
|
+
this.node.endedAt = Date.now();
|
|
172
|
+
this.emit('end', this.node);
|
|
173
|
+
this.store.observers.clear();
|
|
174
|
+
this.scope.dispose();
|
|
175
|
+
this.active = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
assertOpen() {
|
|
179
|
+
if (this.store.closed || !this.active)
|
|
180
|
+
throw new SessionClosedError('Session or invocation has ended.');
|
|
181
|
+
checkCancelled(this.signal);
|
|
182
|
+
}
|
|
183
|
+
async execute(kind, name, work, options = {}) {
|
|
184
|
+
this.assertOpen();
|
|
185
|
+
if (this.store.nodes >= this.store.limit)
|
|
186
|
+
throw new RangeError('Session trace limit reached. Start a new session or increase maxTraceNodes.');
|
|
187
|
+
const scope = cancellationScope([this.signal, options.signal], options.maxExecutionTime);
|
|
188
|
+
const node = trace(kind, name, this.node.id);
|
|
189
|
+
this.store.nodes++;
|
|
190
|
+
this.node.children.push(node);
|
|
191
|
+
const view = new Session();
|
|
192
|
+
view.scope.dispose();
|
|
193
|
+
view.store = this.store;
|
|
194
|
+
view.node = node;
|
|
195
|
+
view.scope = scope;
|
|
196
|
+
view.lm = options.lm ?? this.lm;
|
|
197
|
+
view.bound = true;
|
|
198
|
+
this.emit('start', node);
|
|
199
|
+
const task = (async () => {
|
|
200
|
+
try {
|
|
201
|
+
checkCancelled(scope.signal);
|
|
202
|
+
const result = await abortable(Promise.resolve().then(() => { view.assertOpen(); return work(view); }), scope.signal);
|
|
203
|
+
checkCancelled(scope.signal);
|
|
204
|
+
node.result = result;
|
|
205
|
+
node.status = 'completed';
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
node.error = error;
|
|
210
|
+
node.status = error instanceof CancelledError ? 'cancelled' : 'failed';
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
view.active = false;
|
|
215
|
+
scope.abort(new CancelledError('Invocation ended.'));
|
|
216
|
+
scope.dispose();
|
|
217
|
+
await Promise.allSettled([...view.operations]);
|
|
218
|
+
node.endedAt = Date.now();
|
|
219
|
+
this.emit('end', node);
|
|
220
|
+
}
|
|
221
|
+
})();
|
|
222
|
+
this.store.pending.add(task);
|
|
223
|
+
this.operations.add(task);
|
|
224
|
+
try {
|
|
225
|
+
return await task;
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
this.store.pending.delete(task);
|
|
229
|
+
this.operations.delete(task);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
emit(type, node) {
|
|
233
|
+
this.dispatch(Object.freeze({ type, invocation: snapshot(node) }));
|
|
234
|
+
}
|
|
235
|
+
dispatch(event) {
|
|
236
|
+
for (const observer of [...this.store.observers]) {
|
|
237
|
+
const report = (error) => {
|
|
238
|
+
if (this.store.observerErrors.length === 100)
|
|
239
|
+
this.store.observerErrors.shift();
|
|
240
|
+
this.store.observerErrors.push(error);
|
|
241
|
+
};
|
|
242
|
+
try {
|
|
243
|
+
void Promise.resolve(observer(event)).catch(report);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
report(error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export class Action {
|
|
252
|
+
get name() { return this.constructor.name; }
|
|
253
|
+
async invoke(session, options = {}) {
|
|
254
|
+
const owned = session === undefined;
|
|
255
|
+
const current = session ?? new Session(options);
|
|
256
|
+
try {
|
|
257
|
+
return await current.runAction(this, options);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
if (owned)
|
|
261
|
+
await current.dispose();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=agentic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentic.js","sourceRoot":"","sources":["../src/agentic.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SamplingResult } from './language-model.js';
|
|
2
|
+
/** Async storage contract. Implementations must return independent result snapshots. */
|
|
3
|
+
export declare abstract class Cache {
|
|
4
|
+
abstract get(key: string): Promise<SamplingResult | undefined>;
|
|
5
|
+
abstract put(key: string, result: SamplingResult): Promise<void>;
|
|
6
|
+
abstract delete(key: string): Promise<void>;
|
|
7
|
+
abstract clear(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface InMemoryCacheOptions {
|
|
10
|
+
readonly maxEntries?: number;
|
|
11
|
+
/** Total UTF-16 code units across serialized keys and values. Default 8 MiB. */
|
|
12
|
+
readonly maxChars?: number;
|
|
13
|
+
/** Seconds from insertion; default 300. Zero disables retention. */
|
|
14
|
+
readonly ttl?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class InMemoryCache extends Cache {
|
|
17
|
+
private readonly entries;
|
|
18
|
+
private chars;
|
|
19
|
+
private readonly maxEntries;
|
|
20
|
+
private readonly maxChars;
|
|
21
|
+
private readonly ttl;
|
|
22
|
+
constructor(options?: InMemoryCacheOptions);
|
|
23
|
+
get size(): number;
|
|
24
|
+
get(key: string): Promise<SamplingResult | undefined>;
|
|
25
|
+
put(key: string, result: SamplingResult): Promise<void>;
|
|
26
|
+
delete(key: string): Promise<void>;
|
|
27
|
+
clear(): Promise<void>;
|
|
28
|
+
private remove;
|
|
29
|
+
private prune;
|
|
30
|
+
}
|
|
31
|
+
/** Tagged, sorted encoding avoids ambiguous keys and never serializes credentials from model objects. */
|
|
32
|
+
export declare function canonical(value: unknown): string;
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { AIMessage, ComplexMessage, Image, Message, Modality, SystemMessage, ToolMessage, UserMessage } from './message.js';
|
|
2
|
+
import { ToolCall } from './tool-call.js';
|
|
3
|
+
/** Async storage contract. Implementations must return independent result snapshots. */
|
|
4
|
+
export class Cache {
|
|
5
|
+
}
|
|
6
|
+
export class InMemoryCache extends Cache {
|
|
7
|
+
entries = new Map();
|
|
8
|
+
chars = 0;
|
|
9
|
+
maxEntries;
|
|
10
|
+
maxChars;
|
|
11
|
+
ttl;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
super();
|
|
14
|
+
this.maxEntries = options.maxEntries ?? 1000;
|
|
15
|
+
this.maxChars = options.maxChars ?? 8_388_608;
|
|
16
|
+
this.ttl = options.ttl ?? 300;
|
|
17
|
+
for (const value of [this.maxEntries, this.maxChars])
|
|
18
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
19
|
+
throw new RangeError('Cache limits must be positive safe integers.');
|
|
20
|
+
if (!Number.isFinite(this.ttl) || this.ttl < 0)
|
|
21
|
+
throw new RangeError('Cache ttl must be finite non-negative seconds.');
|
|
22
|
+
}
|
|
23
|
+
get size() { this.prune(); return this.entries.size; }
|
|
24
|
+
async get(key) {
|
|
25
|
+
this.prune();
|
|
26
|
+
const entry = this.entries.get(key);
|
|
27
|
+
if (!entry)
|
|
28
|
+
return undefined;
|
|
29
|
+
this.entries.delete(key);
|
|
30
|
+
this.entries.set(key, entry);
|
|
31
|
+
return decode(JSON.parse(entry.value));
|
|
32
|
+
}
|
|
33
|
+
async put(key, result) {
|
|
34
|
+
this.remove(key);
|
|
35
|
+
this.prune();
|
|
36
|
+
if (this.ttl === 0)
|
|
37
|
+
return;
|
|
38
|
+
let value;
|
|
39
|
+
try {
|
|
40
|
+
value = canonical(result);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return;
|
|
44
|
+
} // Unsupported custom metadata is not retained.
|
|
45
|
+
const size = key.length + value.length;
|
|
46
|
+
if (size > this.maxChars)
|
|
47
|
+
return;
|
|
48
|
+
this.entries.set(key, { value, expires: Date.now() + this.ttl * 1000, size });
|
|
49
|
+
this.chars += size;
|
|
50
|
+
while (this.entries.size > this.maxEntries || this.chars > this.maxChars)
|
|
51
|
+
this.remove(this.entries.keys().next().value);
|
|
52
|
+
}
|
|
53
|
+
async delete(key) { this.remove(key); }
|
|
54
|
+
async clear() { this.entries.clear(); this.chars = 0; }
|
|
55
|
+
remove(key) { const entry = this.entries.get(key); if (entry) {
|
|
56
|
+
this.chars -= entry.size;
|
|
57
|
+
this.entries.delete(key);
|
|
58
|
+
} }
|
|
59
|
+
prune() { const now = Date.now(); for (const [key, entry] of this.entries)
|
|
60
|
+
if (entry.expires <= now)
|
|
61
|
+
this.remove(key); }
|
|
62
|
+
}
|
|
63
|
+
/** Tagged, sorted encoding avoids ambiguous keys and never serializes credentials from model objects. */
|
|
64
|
+
export function canonical(value) { return JSON.stringify(encode(value, new Set(), 0)); }
|
|
65
|
+
function encode(value, seen, depth) {
|
|
66
|
+
if (depth > 64)
|
|
67
|
+
throw new TypeError('Cache data exceeds nesting limit.');
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
return ['undefined'];
|
|
70
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
71
|
+
return ['scalar', value];
|
|
72
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
73
|
+
return ['number', Object.is(value, -0) ? '-0' : value];
|
|
74
|
+
if (!value || typeof value !== 'object' || seen.has(value))
|
|
75
|
+
throw new TypeError('Unsupported cache data.');
|
|
76
|
+
seen.add(value);
|
|
77
|
+
const child = (v) => encode(v, seen, depth + 1);
|
|
78
|
+
try {
|
|
79
|
+
if (value instanceof Message) {
|
|
80
|
+
if (![Message, AIMessage, UserMessage, SystemMessage, ToolMessage, ComplexMessage].includes(value.constructor))
|
|
81
|
+
throw new TypeError('Custom messages bypass caching.');
|
|
82
|
+
return ['message', value.role, child(value.parts), child(value.metadata), child(value.result), child(value.source)];
|
|
83
|
+
}
|
|
84
|
+
if (value instanceof Image || value.constructor === Modality) {
|
|
85
|
+
if (value.source.kind === 'blob')
|
|
86
|
+
throw new TypeError('Blob media bypasses caching.');
|
|
87
|
+
return [value instanceof Image ? 'image' : 'modality', value.mimeType, child(value.source)];
|
|
88
|
+
}
|
|
89
|
+
if (value instanceof ToolCall)
|
|
90
|
+
return ['toolCall', value.id, value.name, child(value.args)];
|
|
91
|
+
if (value instanceof Uint8Array)
|
|
92
|
+
return ['bytes', Array.from(value)];
|
|
93
|
+
if (Array.isArray(value))
|
|
94
|
+
return ['array', Array.from(value, child)];
|
|
95
|
+
if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
|
|
96
|
+
throw new TypeError('Non-data cache value.');
|
|
97
|
+
if (Object.getOwnPropertySymbols(value).length)
|
|
98
|
+
throw new TypeError('Symbol cache keys are unsupported.');
|
|
99
|
+
return ['object', Object.keys(value).sort().map(key => {
|
|
100
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
101
|
+
if (!('value' in descriptor))
|
|
102
|
+
throw new TypeError('Cache values cannot contain accessors.');
|
|
103
|
+
return [key, child(descriptor.value)];
|
|
104
|
+
})];
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
seen.delete(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Decode only our own in-memory encoding, never external/persisted data.
|
|
111
|
+
function decode(input) {
|
|
112
|
+
switch (input[0]) {
|
|
113
|
+
case 'undefined': return undefined;
|
|
114
|
+
case 'scalar': return input[1];
|
|
115
|
+
case 'number': return input[1] === '-0' ? -0 : input[1];
|
|
116
|
+
case 'array': return input[1].map(decode);
|
|
117
|
+
case 'object': return Object.fromEntries(input[1].map(([key, value]) => [key, decode(value)]));
|
|
118
|
+
case 'bytes': return new Uint8Array(input[1]);
|
|
119
|
+
case 'image': return new Image(input[1], decode(input[2]));
|
|
120
|
+
case 'modality': return new Modality(input[1], decode(input[2]));
|
|
121
|
+
case 'toolCall': return new ToolCall(input[1], input[2], decode(input[3]));
|
|
122
|
+
case 'message': {
|
|
123
|
+
const parts = decode(input[2]), metadata = decode(input[3]), result = decode(input[4]), source = decode(input[5]);
|
|
124
|
+
const options = { metadata, result, ...(source ? { source } : {}) };
|
|
125
|
+
if (input[1] === 'assistant')
|
|
126
|
+
return new AIMessage(parts, options);
|
|
127
|
+
if (input[1] === 'user')
|
|
128
|
+
return new UserMessage(parts, options);
|
|
129
|
+
if (input[1] === 'system')
|
|
130
|
+
return new SystemMessage(parts, options);
|
|
131
|
+
return new ToolMessage(parts, metadata.toolCallId, options);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function checkCancelled(signal?: AbortSignal): void;
|
|
2
|
+
/** A caller-owned cancellation scope; always dispose after use. */
|
|
3
|
+
export declare function cancellationScope(signals: readonly (AbortSignal | undefined)[], seconds?: number): {
|
|
4
|
+
signal: AbortSignal;
|
|
5
|
+
abort: (reason?: unknown) => void;
|
|
6
|
+
dispose(): void;
|
|
7
|
+
};
|
|
8
|
+
/** Observe cancellation without leaving late rejections unhandled. */
|
|
9
|
+
export declare function abortable<T>(work: Promise<T>, signal: AbortSignal): Promise<T>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ActionTimeoutError, CancelledError } from './errors.js';
|
|
2
|
+
export function checkCancelled(signal) {
|
|
3
|
+
if (signal?.aborted) {
|
|
4
|
+
throw signal.reason instanceof CancelledError
|
|
5
|
+
? signal.reason
|
|
6
|
+
: new CancelledError('Operation cancelled.', { cause: signal.reason });
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/** A caller-owned cancellation scope; always dispose after use. */
|
|
10
|
+
export function cancellationScope(signals, seconds) {
|
|
11
|
+
if (seconds !== undefined && (!Number.isFinite(seconds) || seconds < 0)) {
|
|
12
|
+
throw new RangeError('maxExecutionTime must be a finite non-negative number of seconds.');
|
|
13
|
+
}
|
|
14
|
+
const controller = new AbortController();
|
|
15
|
+
const removers = [];
|
|
16
|
+
for (const signal of signals) {
|
|
17
|
+
if (!signal)
|
|
18
|
+
continue;
|
|
19
|
+
const forward = () => controller.abort(signal.reason);
|
|
20
|
+
if (signal.aborted)
|
|
21
|
+
forward();
|
|
22
|
+
else {
|
|
23
|
+
signal.addEventListener('abort', forward, { once: true });
|
|
24
|
+
removers.push(() => signal.removeEventListener('abort', forward));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let timer;
|
|
28
|
+
if (seconds === 0)
|
|
29
|
+
controller.abort(new ActionTimeoutError('Execution deadline exceeded.'));
|
|
30
|
+
else if (seconds !== undefined) {
|
|
31
|
+
const deadline = Date.now() + seconds * 1000;
|
|
32
|
+
const tick = () => {
|
|
33
|
+
const remaining = deadline - Date.now();
|
|
34
|
+
if (remaining <= 0)
|
|
35
|
+
controller.abort(new ActionTimeoutError('Execution deadline exceeded.'));
|
|
36
|
+
else
|
|
37
|
+
timer = setTimeout(tick, Math.min(remaining, 2_147_483_647));
|
|
38
|
+
};
|
|
39
|
+
tick();
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
signal: controller.signal,
|
|
43
|
+
abort: (reason) => controller.abort(reason),
|
|
44
|
+
dispose() {
|
|
45
|
+
for (const remove of removers)
|
|
46
|
+
remove();
|
|
47
|
+
if (timer !== undefined)
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Observe cancellation without leaving late rejections unhandled. */
|
|
53
|
+
export async function abortable(work, signal) {
|
|
54
|
+
// Attach rejection handling even if the signal was already cancelled.
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const onAbort = () => {
|
|
57
|
+
try {
|
|
58
|
+
checkCancelled(signal);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
reject(error);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
65
|
+
work.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));
|
|
66
|
+
if (signal.aborted)
|
|
67
|
+
onAbort();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cancellation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Errors shared by the runtime and model adapters. */
|
|
2
|
+
export declare class LangfxError extends Error {
|
|
3
|
+
constructor(message: string, options?: ErrorOptions);
|
|
4
|
+
}
|
|
5
|
+
export declare class TemplateError extends LangfxError {
|
|
6
|
+
}
|
|
7
|
+
export declare class SchemaError extends LangfxError {
|
|
8
|
+
}
|
|
9
|
+
export declare class LMError extends LangfxError {
|
|
10
|
+
}
|
|
11
|
+
export declare class LMInputError extends LMError {
|
|
12
|
+
}
|
|
13
|
+
export declare class UnsupportedCapabilityError extends LMError {
|
|
14
|
+
}
|
|
15
|
+
export declare class EmptyGenerationError extends LMError {
|
|
16
|
+
}
|
|
17
|
+
export declare class OutputValidationError extends LangfxError {
|
|
18
|
+
}
|
|
19
|
+
export declare class CancelledError extends LangfxError {
|
|
20
|
+
}
|
|
21
|
+
export declare class ActionTimeoutError extends CancelledError {
|
|
22
|
+
}
|
|
23
|
+
export declare class SessionClosedError extends LangfxError {
|
|
24
|
+
}
|
|
25
|
+
export declare class AuthenticationError extends LMError {
|
|
26
|
+
}
|
|
27
|
+
export declare class RateLimitError extends LMError {
|
|
28
|
+
}
|
|
29
|
+
export declare class TemporaryLMError extends LMError {
|
|
30
|
+
}
|
|
31
|
+
export declare class ContentFilteredError extends LMError {
|
|
32
|
+
}
|
|
33
|
+
export declare class IncompleteGenerationError extends LMError {
|
|
34
|
+
}
|
|
35
|
+
export declare class ToolExecutionError extends LangfxError {
|
|
36
|
+
}
|
|
37
|
+
export declare class ToolDeniedError extends LangfxError {
|
|
38
|
+
}
|
|
39
|
+
export declare class BudgetExceededError extends LangfxError {
|
|
40
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Errors shared by the runtime and model adapters. */
|
|
2
|
+
export class LangfxError extends Error {
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = new.target.name;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class TemplateError extends LangfxError {
|
|
9
|
+
}
|
|
10
|
+
export class SchemaError extends LangfxError {
|
|
11
|
+
}
|
|
12
|
+
export class LMError extends LangfxError {
|
|
13
|
+
}
|
|
14
|
+
export class LMInputError extends LMError {
|
|
15
|
+
}
|
|
16
|
+
export class UnsupportedCapabilityError extends LMError {
|
|
17
|
+
}
|
|
18
|
+
export class EmptyGenerationError extends LMError {
|
|
19
|
+
}
|
|
20
|
+
export class OutputValidationError extends LangfxError {
|
|
21
|
+
}
|
|
22
|
+
export class CancelledError extends LangfxError {
|
|
23
|
+
}
|
|
24
|
+
export class ActionTimeoutError extends CancelledError {
|
|
25
|
+
}
|
|
26
|
+
export class SessionClosedError extends LangfxError {
|
|
27
|
+
}
|
|
28
|
+
export class AuthenticationError extends LMError {
|
|
29
|
+
}
|
|
30
|
+
export class RateLimitError extends LMError {
|
|
31
|
+
}
|
|
32
|
+
export class TemporaryLMError extends LMError {
|
|
33
|
+
}
|
|
34
|
+
export class ContentFilteredError extends LMError {
|
|
35
|
+
}
|
|
36
|
+
export class IncompleteGenerationError extends LMError {
|
|
37
|
+
}
|
|
38
|
+
export class ToolExecutionError extends LangfxError {
|
|
39
|
+
}
|
|
40
|
+
export class ToolDeniedError extends LangfxError {
|
|
41
|
+
}
|
|
42
|
+
export class BudgetExceededError extends LangfxError {
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AACD,MAAM,OAAO,aAAc,SAAQ,WAAW;CAAG;AACjD,MAAM,OAAO,WAAY,SAAQ,WAAW;CAAG;AAC/C,MAAM,OAAO,OAAQ,SAAQ,WAAW;CAAG;AAC3C,MAAM,OAAO,YAAa,SAAQ,OAAO;CAAG;AAC5C,MAAM,OAAO,0BAA2B,SAAQ,OAAO;CAAG;AAC1D,MAAM,OAAO,oBAAqB,SAAQ,OAAO;CAAG;AACpD,MAAM,OAAO,qBAAsB,SAAQ,WAAW;CAAG;AACzD,MAAM,OAAO,cAAe,SAAQ,WAAW;CAAG;AAClD,MAAM,OAAO,kBAAmB,SAAQ,cAAc;CAAG;AACzD,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG;AACtD,MAAM,OAAO,mBAAoB,SAAQ,OAAO;CAAG;AACnD,MAAM,OAAO,cAAe,SAAQ,OAAO;CAAG;AAC9C,MAAM,OAAO,gBAAiB,SAAQ,OAAO;CAAG;AAChD,MAAM,OAAO,oBAAqB,SAAQ,OAAO;CAAG;AACpD,MAAM,OAAO,yBAA0B,SAAQ,OAAO;CAAG;AACzD,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG;AACtD,MAAM,OAAO,eAAgB,SAAQ,WAAW;CAAG;AACnD,MAAM,OAAO,mBAAoB,SAAQ,WAAW;CAAG"}
|