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
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { JsonStreamParser } from '../json-stream.js';
|
|
2
|
+
import { encodeImage, validateImageRole } from './images.js';
|
|
3
|
+
import { LanguageModel } from '../language-model.js';
|
|
4
|
+
import { AIMessage, Image, Message } from '../message.js';
|
|
5
|
+
import { ToolCall } from '../tool-call.js';
|
|
6
|
+
import { abortable, checkCancelled } from '../cancellation.js';
|
|
7
|
+
import { AuthenticationError, ContentFilteredError, EmptyGenerationError, IncompleteGenerationError, LMError, RateLimitError, TemporaryLMError, UnsupportedCapabilityError } from '../errors.js';
|
|
8
|
+
import { readJson, sse } from './transport.js';
|
|
9
|
+
function object(value) {
|
|
10
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
11
|
+
throw new LMError('Invalid OpenAI object.');
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function string(value) {
|
|
15
|
+
if (typeof value !== 'string')
|
|
16
|
+
throw new LMError('Invalid OpenAI text field.');
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function array(value) {
|
|
20
|
+
if (!Array.isArray(value))
|
|
21
|
+
throw new LMError('Invalid OpenAI array.');
|
|
22
|
+
return value.map(object);
|
|
23
|
+
}
|
|
24
|
+
function freeze(value) {
|
|
25
|
+
if (value && typeof value === 'object') {
|
|
26
|
+
for (const child of Object.values(value))
|
|
27
|
+
freeze(child);
|
|
28
|
+
Object.freeze(value);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
function failure(code) {
|
|
33
|
+
if (code === 'rate_limit_exceeded')
|
|
34
|
+
return new RateLimitError('OpenAI rate limit.');
|
|
35
|
+
if (code === 'server_error')
|
|
36
|
+
return new TemporaryLMError('OpenAI temporarily unavailable.');
|
|
37
|
+
return new LMError('OpenAI response failed.');
|
|
38
|
+
}
|
|
39
|
+
function usage(value) {
|
|
40
|
+
if (value == null)
|
|
41
|
+
return undefined;
|
|
42
|
+
const data = object(value);
|
|
43
|
+
const values = [data['input_tokens'], data['output_tokens'], data['total_tokens']];
|
|
44
|
+
if (values.some(v => typeof v !== 'number' || !Number.isSafeInteger(v) || v < 0))
|
|
45
|
+
throw new LMError('Invalid OpenAI usage.');
|
|
46
|
+
return { promptTokens: values[0], completionTokens: values[1], totalTokens: values[2] };
|
|
47
|
+
}
|
|
48
|
+
/** Conservative strict-schema subset: never silently adds requirements or changes optional fields. */
|
|
49
|
+
function strictSchema(schema, depth = 0) {
|
|
50
|
+
if (depth > 64)
|
|
51
|
+
throw new UnsupportedCapabilityError('OpenAI schema exceeds depth limit.');
|
|
52
|
+
const allowed = new Set(['$schema', 'type', 'title', 'description', 'properties', 'required', 'additionalProperties', 'items', 'enum', 'anyOf']);
|
|
53
|
+
for (const key of Object.keys(schema))
|
|
54
|
+
if (!allowed.has(key))
|
|
55
|
+
throw new UnsupportedCapabilityError(`Unsupported OpenAI schema keyword: ${key}`);
|
|
56
|
+
const { $schema: _dialect, ...result } = schema;
|
|
57
|
+
const types = Array.isArray(schema['type']) ? schema['type'] : [schema['type']];
|
|
58
|
+
if (schema['type'] !== undefined && (!types.length || types.some(type => !['object', 'array', 'string', 'number', 'integer', 'boolean', 'null'].includes(String(type)))))
|
|
59
|
+
throw new UnsupportedCapabilityError('Unsupported OpenAI schema type.');
|
|
60
|
+
if (schema['type'] === undefined && schema['anyOf'] === undefined)
|
|
61
|
+
throw new UnsupportedCapabilityError('OpenAI schema requires type or anyOf.');
|
|
62
|
+
if (schema['anyOf'] !== undefined && (!Array.isArray(schema['anyOf']) || !schema['anyOf'].length))
|
|
63
|
+
throw new UnsupportedCapabilityError('OpenAI anyOf requires alternatives.');
|
|
64
|
+
if (types.includes('object')) {
|
|
65
|
+
const properties = object(schema['properties']);
|
|
66
|
+
const required = schema['required'];
|
|
67
|
+
if (schema['additionalProperties'] !== false || !Array.isArray(required) || required.length !== Object.keys(properties).length || new Set(required).size !== required.length || !Object.keys(properties).every(key => required.includes(key)))
|
|
68
|
+
throw new UnsupportedCapabilityError('OpenAI strict objects require every property and additionalProperties: false.');
|
|
69
|
+
result['properties'] = Object.fromEntries(Object.entries(properties).map(([key, value]) => [key, strictSchema(object(value), depth + 1)]));
|
|
70
|
+
}
|
|
71
|
+
if (types.includes('array') && schema['items'] === undefined)
|
|
72
|
+
throw new UnsupportedCapabilityError('OpenAI arrays require items.');
|
|
73
|
+
if (schema['items'] !== undefined)
|
|
74
|
+
result['items'] = strictSchema(object(schema['items']), depth + 1);
|
|
75
|
+
if (schema['anyOf'] !== undefined)
|
|
76
|
+
result['anyOf'] = array(schema['anyOf']).map(value => strictSchema(value, depth + 1));
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/** Stateless Responses API adapter. Text, client tools, strict JSON output, and text SSE. */
|
|
80
|
+
export class OpenAI extends LanguageModel {
|
|
81
|
+
capabilities = Object.freeze({ streaming: true, nativeStructuredOutput: true, media: true, tools: true, toolStreaming: true });
|
|
82
|
+
endpoint;
|
|
83
|
+
transport;
|
|
84
|
+
apiKey;
|
|
85
|
+
constructor(options) {
|
|
86
|
+
const { model, apiKey, baseUrl = 'https://api.openai.com/v1', transport, ...sampling } = options;
|
|
87
|
+
if (!model || !/^[\w.:-]+$/.test(model))
|
|
88
|
+
throw new TypeError('Expected an OpenAI model ID.');
|
|
89
|
+
super({ ...sampling, model });
|
|
90
|
+
this.endpoint = baseUrl.replace(/\/$/, '');
|
|
91
|
+
this.apiKey = apiKey;
|
|
92
|
+
this.transport = transport ?? ((url, init) => fetch(url, init));
|
|
93
|
+
}
|
|
94
|
+
async _sample(prompts, context) {
|
|
95
|
+
const results = [];
|
|
96
|
+
for (const prompt of prompts)
|
|
97
|
+
results.push(this.parse(await readJson(await this.request(prompt, context, false), context.signal)));
|
|
98
|
+
return results;
|
|
99
|
+
}
|
|
100
|
+
async *_stream(prompt, context) {
|
|
101
|
+
const response = await this.request(prompt, context, true);
|
|
102
|
+
let text = '', started = false, responseId = '';
|
|
103
|
+
const items = new Map();
|
|
104
|
+
const tools = new Map();
|
|
105
|
+
const itemIds = new Set(), callIds = new Set();
|
|
106
|
+
let totalChars = 0;
|
|
107
|
+
const bound = (value) => { totalChars += value.length; if (totalChars > 16_777_216)
|
|
108
|
+
throw new LMError('OpenAI stream exceeds size limit.'); };
|
|
109
|
+
const matches = (item, state) => item['type'] === 'function_call' && item['id'] === state.item['id'] && item['call_id'] === state.item['call_id'] && item['name'] === state.item['name'] && item['arguments'] === state.args;
|
|
110
|
+
for await (const raw of sse(response, context.signal)) {
|
|
111
|
+
let event;
|
|
112
|
+
try {
|
|
113
|
+
event = object(JSON.parse(raw));
|
|
114
|
+
}
|
|
115
|
+
catch (cause) {
|
|
116
|
+
throw new LMError('Invalid OpenAI SSE event.', { cause });
|
|
117
|
+
}
|
|
118
|
+
const type = event['type'];
|
|
119
|
+
if (started && event['response_id'] !== undefined && event['response_id'] !== responseId)
|
|
120
|
+
throw new LMError('OpenAI stream response ID mismatch.');
|
|
121
|
+
if (type === 'error')
|
|
122
|
+
throw failure(event['code']);
|
|
123
|
+
if (type === 'response.failed' || type === 'response.incomplete') {
|
|
124
|
+
this.parse(event['response']);
|
|
125
|
+
throw new LMError('Inconsistent OpenAI terminal event.');
|
|
126
|
+
}
|
|
127
|
+
if (type === 'response.created') {
|
|
128
|
+
if (started)
|
|
129
|
+
throw new LMError('Duplicate OpenAI response.created.');
|
|
130
|
+
responseId = string(object(event['response'])['id']);
|
|
131
|
+
started = true;
|
|
132
|
+
}
|
|
133
|
+
else if (type === 'response.output_text.delta') {
|
|
134
|
+
const item = items.get(event['output_index']);
|
|
135
|
+
if (!started || item?.['type'] !== 'message' || item['id'] !== event['item_id'] || !Number.isSafeInteger(event['content_index']) || event['content_index'] < 0)
|
|
136
|
+
throw new LMError('Invalid OpenAI text delta correlation.');
|
|
137
|
+
const delta = string(event['delta']);
|
|
138
|
+
text += delta;
|
|
139
|
+
bound(delta);
|
|
140
|
+
if (text.length > 16_777_216)
|
|
141
|
+
throw new LMError('OpenAI stream exceeds size limit.');
|
|
142
|
+
yield { delta: new AIMessage(delta), aggregated: new AIMessage(text), index: 0, isFinal: false };
|
|
143
|
+
}
|
|
144
|
+
else if (type === 'response.refusal.delta' || type === 'response.refusal.done')
|
|
145
|
+
throw new ContentFilteredError('OpenAI refused the request.');
|
|
146
|
+
else if (type === 'response.output_item.added') {
|
|
147
|
+
const item = object(event['item']);
|
|
148
|
+
const index = event['output_index'];
|
|
149
|
+
if (!started || !Number.isSafeInteger(index) || index < 0 || items.has(index) || typeof item['id'] !== 'string')
|
|
150
|
+
throw new LMError('Invalid OpenAI output item order.');
|
|
151
|
+
const itemId = string(item['id']);
|
|
152
|
+
if (!itemId || itemIds.has(itemId) || items.size >= 1024)
|
|
153
|
+
throw new LMError('Duplicate or excessive OpenAI output items.');
|
|
154
|
+
itemIds.add(itemId);
|
|
155
|
+
items.set(index, item);
|
|
156
|
+
bound(itemId);
|
|
157
|
+
if (!['message', 'reasoning', 'function_call'].includes(String(item['type'])))
|
|
158
|
+
throw new UnsupportedCapabilityError('Unsupported OpenAI streamed item.');
|
|
159
|
+
if (item['type'] === 'function_call') {
|
|
160
|
+
const id = string(item['call_id']), name = string(item['name']);
|
|
161
|
+
if (!id || !name || callIds.has(id) || item['arguments'] !== '')
|
|
162
|
+
throw new LMError('Invalid OpenAI streamed function start.');
|
|
163
|
+
callIds.add(id);
|
|
164
|
+
bound(id + name);
|
|
165
|
+
tools.set(index, { item, args: '', done: false, itemDone: false });
|
|
166
|
+
yield { delta: new AIMessage(''), aggregated: new AIMessage(text), index: 0, isFinal: false, toolEvent: Object.freeze({ type: 'toolCallStart', id, name }) };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (type === 'response.function_call_arguments.delta' || type === 'response.function_call_arguments.done') {
|
|
170
|
+
const state = tools.get(event['output_index']);
|
|
171
|
+
if (!state || state.done || state.item['id'] !== event['item_id'])
|
|
172
|
+
throw new LMError('Invalid OpenAI tool delta correlation.');
|
|
173
|
+
if (type === 'response.function_call_arguments.delta') {
|
|
174
|
+
const delta = string(event['delta']);
|
|
175
|
+
bound(delta);
|
|
176
|
+
state.args += delta;
|
|
177
|
+
if (state.args.length > 1_048_576)
|
|
178
|
+
throw new LMError('Tool arguments exceed size limit.');
|
|
179
|
+
yield { delta: new AIMessage(''), aggregated: new AIMessage(text), index: 0, isFinal: false, toolEvent: Object.freeze({ type: 'toolCallDelta', id: string(state.item['call_id']), delta }) };
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
if (event['arguments'] !== state.args)
|
|
183
|
+
throw new LMError('OpenAI completed arguments differ from deltas.');
|
|
184
|
+
let args;
|
|
185
|
+
try {
|
|
186
|
+
const parser = new JsonStreamParser();
|
|
187
|
+
for (const _ of parser.feed(state.args)) { /* Parse only complete arguments. */ }
|
|
188
|
+
for (const _ of parser.finish()) { /* Validate terminal state. */ }
|
|
189
|
+
args = object(parser.value);
|
|
190
|
+
}
|
|
191
|
+
catch (cause) {
|
|
192
|
+
throw new LMError('Invalid streamed tool arguments.', { cause });
|
|
193
|
+
}
|
|
194
|
+
state.done = true;
|
|
195
|
+
const call = freeze(new ToolCall(string(state.item['call_id']), string(state.item['name']), args));
|
|
196
|
+
yield { delta: new AIMessage(''), aggregated: new AIMessage(text), index: 0, isFinal: false, toolEvent: Object.freeze({ type: 'toolCallEnd', call }) };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else if (type === 'response.output_item.done') {
|
|
200
|
+
const item = object(event['item']);
|
|
201
|
+
const state = tools.get(event['output_index']);
|
|
202
|
+
if (state || item['type'] === 'function_call') {
|
|
203
|
+
if (!state || !state.done || state.itemDone || !matches(item, state))
|
|
204
|
+
throw new LMError('OpenAI tool item completion mismatch.');
|
|
205
|
+
if (item['status'] !== undefined && item['status'] !== 'completed')
|
|
206
|
+
throw new IncompleteGenerationError('Incomplete OpenAI function item.');
|
|
207
|
+
state.itemDone = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (type === 'response.completed') {
|
|
211
|
+
const completed = object(event['response']);
|
|
212
|
+
if (!started || completed['id'] !== responseId)
|
|
213
|
+
throw new LMError('OpenAI stream response ID mismatch.');
|
|
214
|
+
const result = this.parse(completed), aggregated = result.samples[0].response;
|
|
215
|
+
const output = array(completed['output']);
|
|
216
|
+
if (aggregated.toolCalls.length !== tools.size)
|
|
217
|
+
throw new LMError('OpenAI completed tool count mismatch.');
|
|
218
|
+
for (const [index, state] of tools) {
|
|
219
|
+
if (!state.done || !state.itemDone || !output[index] || !matches(output[index], state))
|
|
220
|
+
throw new LMError('OpenAI final tool differs from streamed call.');
|
|
221
|
+
}
|
|
222
|
+
if (aggregated.text !== text)
|
|
223
|
+
throw new LMError('OpenAI completed text differs from streamed deltas.');
|
|
224
|
+
yield { delta: new AIMessage(''), aggregated, index: 0, isFinal: true, finishReason: 'completed', ...(result.usage ? { usage: result.usage } : {}) };
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
else if (typeof type !== 'string')
|
|
228
|
+
throw new LMError('Missing OpenAI event type.');
|
|
229
|
+
// Other progress/reasoning events do not contribute visible text.
|
|
230
|
+
}
|
|
231
|
+
throw new IncompleteGenerationError('OpenAI stream ended without response.completed.');
|
|
232
|
+
}
|
|
233
|
+
parse(value) {
|
|
234
|
+
const data = object(value);
|
|
235
|
+
if (data['error'] != null)
|
|
236
|
+
throw failure(object(data['error'])['code']);
|
|
237
|
+
if (data['status'] === 'incomplete') {
|
|
238
|
+
if (object(data['incomplete_details'])['reason'] === 'content_filter')
|
|
239
|
+
throw new ContentFilteredError('OpenAI filtered the response.');
|
|
240
|
+
throw new IncompleteGenerationError('OpenAI generation was incomplete.');
|
|
241
|
+
}
|
|
242
|
+
if (data['status'] !== 'completed')
|
|
243
|
+
throw new LMError('OpenAI response did not complete.');
|
|
244
|
+
const output = array(data['output']);
|
|
245
|
+
const { text, calls } = this.parseOutput(output);
|
|
246
|
+
if (!text && !calls.length)
|
|
247
|
+
throw new EmptyGenerationError('OpenAI returned no text or tool calls.');
|
|
248
|
+
const response = new AIMessage(text, { metadata: freeze({ toolCalls: calls, openai: { model: this.modelId, endpoint: this.endpoint, output } }) });
|
|
249
|
+
const tokens = usage(data['usage']);
|
|
250
|
+
return { samples: [{ response }], ...(tokens ? { usage: tokens } : {}) };
|
|
251
|
+
}
|
|
252
|
+
parseOutput(output) {
|
|
253
|
+
let text = '';
|
|
254
|
+
const calls = [], ids = new Set();
|
|
255
|
+
for (const item of output) {
|
|
256
|
+
if (item['status'] !== undefined && item['status'] !== 'completed')
|
|
257
|
+
throw new IncompleteGenerationError('Incomplete OpenAI output item.');
|
|
258
|
+
if (item['type'] === 'message') {
|
|
259
|
+
if (item['role'] !== 'assistant')
|
|
260
|
+
throw new LMError('Invalid OpenAI output role.');
|
|
261
|
+
for (const part of array(item['content'])) {
|
|
262
|
+
if (part['type'] === 'refusal')
|
|
263
|
+
throw new ContentFilteredError('OpenAI refused the request.');
|
|
264
|
+
if (part['type'] !== 'output_text')
|
|
265
|
+
throw new UnsupportedCapabilityError('Unsupported OpenAI output content.');
|
|
266
|
+
text += string(part['text']);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else if (item['type'] === 'function_call') {
|
|
270
|
+
let args;
|
|
271
|
+
try {
|
|
272
|
+
args = object(JSON.parse(string(item['arguments'])));
|
|
273
|
+
}
|
|
274
|
+
catch (cause) {
|
|
275
|
+
throw new LMError('Invalid OpenAI function arguments.', { cause });
|
|
276
|
+
}
|
|
277
|
+
const call = new ToolCall(string(item['call_id']), string(item['name']), args);
|
|
278
|
+
if (ids.has(call.id))
|
|
279
|
+
throw new LMError('Duplicate OpenAI call_id.');
|
|
280
|
+
ids.add(call.id);
|
|
281
|
+
calls.push(call);
|
|
282
|
+
}
|
|
283
|
+
else if (item['type'] === 'reasoning') {
|
|
284
|
+
if (typeof item['encrypted_content'] !== 'string' || !item['encrypted_content'])
|
|
285
|
+
throw new UnsupportedCapabilityError('Stateless OpenAI continuation requires encrypted reasoning content.');
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
throw new UnsupportedCapabilityError('Unsupported OpenAI output item.');
|
|
289
|
+
}
|
|
290
|
+
return { text, calls };
|
|
291
|
+
}
|
|
292
|
+
async body(prompt, context, stream) {
|
|
293
|
+
const input = [], pending = new Set();
|
|
294
|
+
for (const section of prompt.sections) {
|
|
295
|
+
validateImageRole(section);
|
|
296
|
+
if (section.role === 'tool') {
|
|
297
|
+
const id = section.metadata['toolCallId'];
|
|
298
|
+
if (typeof id !== 'string' || !pending.delete(id))
|
|
299
|
+
throw new LMError('Unmatched OpenAI tool result.');
|
|
300
|
+
input.push({ type: 'function_call_output', call_id: id, output: section.text });
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (pending.size)
|
|
304
|
+
throw new LMError('Missing OpenAI tool results.');
|
|
305
|
+
if (section.toolCalls.length && section.role !== 'assistant')
|
|
306
|
+
throw new LMError('Tool calls require an assistant message.');
|
|
307
|
+
const continuation = section.metadata['openai'];
|
|
308
|
+
let calls = section.toolCalls;
|
|
309
|
+
if (continuation !== undefined) {
|
|
310
|
+
const data = object(continuation);
|
|
311
|
+
if (section.role !== 'assistant' || data['model'] !== this.modelId || data['endpoint'] !== this.endpoint)
|
|
312
|
+
throw new LMError('OpenAI continuation belongs to another model or endpoint.');
|
|
313
|
+
const output = array(data['output']);
|
|
314
|
+
calls = this.parseOutput(output).calls;
|
|
315
|
+
input.push(...output);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
if (section.parts.some(part => part instanceof Image)) {
|
|
319
|
+
const content = [];
|
|
320
|
+
for (const part of section.parts) {
|
|
321
|
+
if (typeof part === 'string')
|
|
322
|
+
content.push({ type: 'input_text', text: part });
|
|
323
|
+
else {
|
|
324
|
+
const image = await encodeImage(part, context.signal);
|
|
325
|
+
content.push({ type: 'input_image', image_url: 'url' in image ? image.url : `data:${image.mimeType};base64,${image.data}`, detail: 'auto' });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
input.push({ role: section.role, content });
|
|
329
|
+
}
|
|
330
|
+
else if (section.text || !calls.length)
|
|
331
|
+
input.push({ role: section.role, content: section.text });
|
|
332
|
+
for (const call of calls)
|
|
333
|
+
input.push({ type: 'function_call', call_id: call.id, name: call.name, arguments: JSON.stringify(call.args) });
|
|
334
|
+
}
|
|
335
|
+
for (const call of calls) {
|
|
336
|
+
if (pending.has(call.id))
|
|
337
|
+
throw new LMError('Duplicate OpenAI tool-call ID.');
|
|
338
|
+
pending.add(call.id);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (pending.size)
|
|
342
|
+
throw new LMError('Missing OpenAI tool results.');
|
|
343
|
+
const body = { model: this.modelId, input, stream, store: false, include: ['reasoning.encrypted_content'] };
|
|
344
|
+
if (context.maxTokens !== undefined)
|
|
345
|
+
body['max_output_tokens'] = context.maxTokens;
|
|
346
|
+
if (context.temperature !== undefined)
|
|
347
|
+
body['temperature'] = context.temperature;
|
|
348
|
+
if (context.responseSchema) {
|
|
349
|
+
if (context.responseSchema['type'] !== 'object' || context.responseSchema['anyOf'] !== undefined)
|
|
350
|
+
throw new UnsupportedCapabilityError('OpenAI native output requires an object root without anyOf.');
|
|
351
|
+
body['text'] = { format: { type: 'json_schema', name: 'response', strict: true, schema: strictSchema(context.responseSchema) } };
|
|
352
|
+
}
|
|
353
|
+
if (context.tools?.length)
|
|
354
|
+
body['tools'] = context.tools.map(tool => ({ type: 'function', name: tool.name, description: tool.description, parameters: tool.inputSchema, strict: false }));
|
|
355
|
+
if (context.toolChoice !== undefined) {
|
|
356
|
+
const choice = context.toolChoice;
|
|
357
|
+
if (typeof choice === 'object' && !context.tools?.some(tool => tool.name === choice.name))
|
|
358
|
+
throw new TypeError('Unknown OpenAI toolChoice.');
|
|
359
|
+
body['tool_choice'] = typeof choice === 'object' ? { type: 'function', name: choice.name } : choice === 'any' ? 'required' : choice;
|
|
360
|
+
}
|
|
361
|
+
return body;
|
|
362
|
+
}
|
|
363
|
+
async request(prompt, context, stream) {
|
|
364
|
+
const body = JSON.stringify(await this.body(prompt, context, stream));
|
|
365
|
+
checkCancelled(context.signal);
|
|
366
|
+
const headers = { 'content-type': 'application/json' };
|
|
367
|
+
const key = typeof this.apiKey === 'function' ? await abortable(Promise.resolve(this.apiKey(context.signal)), context.signal) : this.apiKey;
|
|
368
|
+
if (key !== undefined) {
|
|
369
|
+
if (!key)
|
|
370
|
+
throw new AuthenticationError('Empty OpenAI API key.');
|
|
371
|
+
headers['Authorization'] = `Bearer ${key}`;
|
|
372
|
+
}
|
|
373
|
+
checkCancelled(context.signal);
|
|
374
|
+
const response = await abortable(this.transport(`${this.endpoint}/responses`, { method: 'POST', headers, body, signal: context.signal }), context.signal);
|
|
375
|
+
if (!response.ok) {
|
|
376
|
+
try {
|
|
377
|
+
await response.body?.cancel();
|
|
378
|
+
}
|
|
379
|
+
catch { /* Preserve classified error. */ }
|
|
380
|
+
if (response.status === 401 || response.status === 403)
|
|
381
|
+
throw new AuthenticationError('OpenAI authentication failed.');
|
|
382
|
+
if (response.status === 429)
|
|
383
|
+
throw new RateLimitError('OpenAI rate limit.');
|
|
384
|
+
if (response.status >= 500)
|
|
385
|
+
throw new TemporaryLMError('OpenAI temporarily unavailable.');
|
|
386
|
+
throw new LMError(`OpenAI HTTP ${response.status}.`);
|
|
387
|
+
}
|
|
388
|
+
if (stream && !response.headers.get('content-type')?.includes('text/event-stream')) {
|
|
389
|
+
try {
|
|
390
|
+
await response.body?.cancel();
|
|
391
|
+
}
|
|
392
|
+
catch { /* Preserve error. */ }
|
|
393
|
+
throw new LMError('Expected OpenAI SSE response.');
|
|
394
|
+
}
|
|
395
|
+
return response;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llms/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Transport = (url: string, init: RequestInit) => Promise<Response>;
|
|
2
|
+
/** UTF-8 SSE framing independent of network chunk and line-ending boundaries. */
|
|
3
|
+
export declare function sse(response: Response, signal: AbortSignal, maxEventChars?: number): AsyncIterable<string>;
|
|
4
|
+
export declare function readJson(response: Response, signal: AbortSignal): Promise<unknown>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { abortable, checkCancelled } from '../cancellation.js';
|
|
2
|
+
import { LMError } from '../errors.js';
|
|
3
|
+
/** UTF-8 SSE framing independent of network chunk and line-ending boundaries. */
|
|
4
|
+
export async function* sse(response, signal, maxEventChars = 1_048_576) {
|
|
5
|
+
if (!response.body)
|
|
6
|
+
throw new LMError('Streaming response has no body.');
|
|
7
|
+
const reader = response.body.getReader();
|
|
8
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
9
|
+
let buffer = '', size = 0;
|
|
10
|
+
let data = [];
|
|
11
|
+
try {
|
|
12
|
+
while (true) {
|
|
13
|
+
checkCancelled(signal);
|
|
14
|
+
const { value, done } = await abortable(reader.read(), signal);
|
|
15
|
+
buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
|
|
16
|
+
if (done && buffer && !/[\r\n]$/.test(buffer))
|
|
17
|
+
buffer += '\n';
|
|
18
|
+
while (true) {
|
|
19
|
+
const match = /\r\n|\r|\n/.exec(buffer);
|
|
20
|
+
if (!match || (!done && match[0] === '\r' && match.index === buffer.length - 1))
|
|
21
|
+
break;
|
|
22
|
+
const line = buffer.slice(0, match.index);
|
|
23
|
+
buffer = buffer.slice(match.index + match[0].length);
|
|
24
|
+
if (line.length > maxEventChars)
|
|
25
|
+
throw new LMError('SSE line exceeded size limit.');
|
|
26
|
+
if (!line) {
|
|
27
|
+
if (data.length)
|
|
28
|
+
yield data.join('\n');
|
|
29
|
+
data = [];
|
|
30
|
+
size = 0;
|
|
31
|
+
}
|
|
32
|
+
else if (line === 'data' || line.startsWith('data:')) {
|
|
33
|
+
const field = line === 'data' ? '' : line.slice(5).replace(/^ /, '');
|
|
34
|
+
size += field.length + 1;
|
|
35
|
+
if (size > maxEventChars)
|
|
36
|
+
throw new LMError('SSE event exceeded size limit.');
|
|
37
|
+
data.push(field);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (buffer.length > maxEventChars)
|
|
41
|
+
throw new LMError('SSE line exceeded size limit.');
|
|
42
|
+
if (done) {
|
|
43
|
+
if (data.length)
|
|
44
|
+
yield data.join('\n');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
try {
|
|
51
|
+
await reader.cancel();
|
|
52
|
+
}
|
|
53
|
+
catch { /* Preserve the original failure. */ }
|
|
54
|
+
reader.releaseLock();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function readJson(response, signal) {
|
|
58
|
+
if (!response.body)
|
|
59
|
+
throw new LMError('Response has no body.');
|
|
60
|
+
const reader = response.body.getReader();
|
|
61
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
62
|
+
let text = '', bytes = 0;
|
|
63
|
+
try {
|
|
64
|
+
while (true) {
|
|
65
|
+
const { value, done } = await abortable(reader.read(), signal);
|
|
66
|
+
checkCancelled(signal);
|
|
67
|
+
if (done)
|
|
68
|
+
break;
|
|
69
|
+
bytes += value.byteLength;
|
|
70
|
+
if (bytes > 16 * 1024 * 1024)
|
|
71
|
+
throw new LMError('JSON response exceeded 16 MiB.');
|
|
72
|
+
text += decoder.decode(value, { stream: true });
|
|
73
|
+
}
|
|
74
|
+
return JSON.parse(text + decoder.decode());
|
|
75
|
+
}
|
|
76
|
+
catch (cause) {
|
|
77
|
+
checkCancelled(signal);
|
|
78
|
+
if (cause instanceof LMError)
|
|
79
|
+
throw cause;
|
|
80
|
+
throw new LMError('Invalid provider JSON response.', { cause });
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
try {
|
|
84
|
+
await reader.cancel();
|
|
85
|
+
}
|
|
86
|
+
catch { /* Preserve the original failure. */ }
|
|
87
|
+
reader.releaseLock();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/llms/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,iFAAiF;AACjF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,QAAkB,EAAE,MAAmB,EAAE,aAAa,GAAG,SAAS;IAC3F,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,MAAM,IAAI,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,MAAM,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAa,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,IAAI,CAAC;YAC9D,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAAE,MAAM;gBACvF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACrD,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa;oBAAE,MAAM,IAAI,OAAO,CAAC,+BAA+B,CAAC,CAAC;gBACpF,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,IAAI,CAAC,MAAM;wBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,GAAG,EAAE,CAAC;oBAAC,IAAI,GAAG,CAAC,CAAC;gBACtB,CAAC;qBAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvD,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACrE,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;oBACzB,IAAI,IAAI,GAAG,aAAa;wBAAE,MAAM,IAAI,OAAO,CAAC,gCAAgC,CAAC,CAAC;oBAC9E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,aAAa;gBAAE,MAAM,IAAI,OAAO,CAAC,+BAA+B,CAAC,CAAC;YACtF,IAAI,IAAI,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;QAC/D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAkB,EAAE,MAAmB;IACpE,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,MAAM,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/D,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,IAAI;gBAAE,MAAM;YAChB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,OAAO,CAAC,gCAAgC,CAAC,CAAC;YAClF,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAY,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,KAAK,YAAY,OAAO;YAAE,MAAM,KAAK,CAAC;QAC1C,MAAM,IAAI,OAAO,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;QAC7E,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { OutputValidationError } from './errors.js';
|
|
2
|
+
import { LangFunc } from './langfunc.js';
|
|
3
|
+
import type { LangFuncCallOptions, LangFuncOptions } from './langfunc.js';
|
|
4
|
+
import type { LanguageModel } from './language-model.js';
|
|
5
|
+
import { Message } from './message.js';
|
|
6
|
+
import type { Schema, SchemaLike } from './schema.js';
|
|
7
|
+
import { Template } from './template.js';
|
|
8
|
+
import type { Prompt, Variables } from './template.js';
|
|
9
|
+
export declare class MappingError extends OutputValidationError {
|
|
10
|
+
readonly lmResponse: Message;
|
|
11
|
+
/** A failed eviction must not hide the original mapping failure. */
|
|
12
|
+
cacheInvalidationError?: unknown;
|
|
13
|
+
constructor(lmResponse: Message, cause: unknown);
|
|
14
|
+
}
|
|
15
|
+
export interface MappingExampleOptions {
|
|
16
|
+
readonly input: Prompt;
|
|
17
|
+
/** JSON input to the schema parser, not its transformed TypeScript output. */
|
|
18
|
+
readonly output?: unknown;
|
|
19
|
+
readonly schema?: SchemaLike<unknown>;
|
|
20
|
+
readonly context?: string;
|
|
21
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
22
|
+
}
|
|
23
|
+
export declare class MappingExample {
|
|
24
|
+
readonly input: Prompt;
|
|
25
|
+
readonly output: unknown;
|
|
26
|
+
readonly schema: SchemaLike<unknown> | undefined;
|
|
27
|
+
readonly context: string | undefined;
|
|
28
|
+
readonly metadata: Readonly<Record<string, unknown>>;
|
|
29
|
+
readonly hasOutput: boolean;
|
|
30
|
+
constructor(options: MappingExampleOptions);
|
|
31
|
+
}
|
|
32
|
+
export interface MappingOptions<T> extends LangFuncOptions {
|
|
33
|
+
readonly input: Prompt;
|
|
34
|
+
readonly templateStr?: string;
|
|
35
|
+
readonly preamble?: Template;
|
|
36
|
+
readonly protocol?: 'json' | 'python';
|
|
37
|
+
readonly schema: SchemaLike<T>;
|
|
38
|
+
readonly examples?: readonly MappingExample[];
|
|
39
|
+
readonly systemMessage?: Prompt;
|
|
40
|
+
}
|
|
41
|
+
/** Reusable JSON mapping pipeline. Local rendering/parsing hooks stay synchronous. */
|
|
42
|
+
export declare class Mapping<T> extends LangFunc {
|
|
43
|
+
static templateStr: string;
|
|
44
|
+
protected readonly preambleOverride: Template | undefined;
|
|
45
|
+
readonly input: Prompt;
|
|
46
|
+
readonly protocol: 'json' | 'python';
|
|
47
|
+
readonly schema: Schema<T>;
|
|
48
|
+
readonly examples: readonly MappingExample[];
|
|
49
|
+
readonly systemMessage: Prompt | undefined;
|
|
50
|
+
constructor(options: MappingOptions<T>);
|
|
51
|
+
get mappingRequest(): MappingExample;
|
|
52
|
+
get preamble(): Template;
|
|
53
|
+
get inputTitle(): string;
|
|
54
|
+
get outputTitle(): string;
|
|
55
|
+
get schemaTitle(): string;
|
|
56
|
+
protected renderWith(variables: Variables, stack: Set<Template>): Message;
|
|
57
|
+
renderExample(example: MappingExample, variables?: Variables): readonly Message[];
|
|
58
|
+
postprocessResponse(response: Message): Message;
|
|
59
|
+
parseResult(response: Message): T;
|
|
60
|
+
postprocessResult(result: T): T;
|
|
61
|
+
transformOutput(response: Message): Message<T>;
|
|
62
|
+
call(options?: LangFuncCallOptions): Promise<Message<T>>;
|
|
63
|
+
}
|
|
64
|
+
/** Query specialization for JSON and restricted Python constructor protocols. */
|
|
65
|
+
export declare class LfQuery<T> extends Mapping<T> {
|
|
66
|
+
get inputTitle(): string;
|
|
67
|
+
get outputTitle(): string;
|
|
68
|
+
get schemaTitle(): string;
|
|
69
|
+
get preamble(): Template;
|
|
70
|
+
}
|
|
71
|
+
export declare function failMapping(lm: LanguageModel, response: Message, cause: unknown): Promise<never>;
|