@salesforce/sfdx-agent-harness-openai 0.4.0 → 0.6.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/CHANGELOG.md +10 -0
- package/README.md +10 -0
- package/dist/openai-agents-harness.d.ts +6 -0
- package/dist/openai-agents-harness.js +90 -19
- package/dist/openai-agents-harness.js.map +1 -1
- package/dist/openai-approval-coordinator.d.ts +2 -0
- package/dist/openai-approval-coordinator.js +2 -1
- package/dist/openai-approval-coordinator.js.map +1 -1
- package/dist/openai-event-adapter.d.ts +17 -2
- package/dist/openai-event-adapter.js +60 -4
- package/dist/openai-event-adapter.js.map +1 -1
- package/dist/openai-model-provider.d.ts +22 -1
- package/dist/openai-model-provider.js +162 -14
- package/dist/openai-model-provider.js.map +1 -1
- package/dist/test/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright 2026, Salesforce, Inc. All rights reserved.
|
|
3
3
|
* See LICENSE.txt for license terms.
|
|
4
4
|
*/
|
|
5
|
+
import { AgentSDKError, AgentSDKErrorType } from '@salesforce/sfdx-agent-sdk';
|
|
5
6
|
/**
|
|
6
7
|
* Per-stream stateful mapper from `@openai/agents` `RunStreamEvent`s to the
|
|
7
8
|
* SDK's `ChatEvent` variants. A new instance is constructed per `stream()` call
|
|
@@ -23,6 +24,7 @@
|
|
|
23
24
|
*/
|
|
24
25
|
export class OpenAIEventAdapter {
|
|
25
26
|
mcpCatalog;
|
|
27
|
+
wireCommunication;
|
|
26
28
|
stepIndex = 0;
|
|
27
29
|
started = false;
|
|
28
30
|
lastStepUsage;
|
|
@@ -40,6 +42,7 @@ export class OpenAIEventAdapter {
|
|
|
40
42
|
deferredStepFinish;
|
|
41
43
|
/** Outstanding `tool_output`s for the deferred step; `step-finish` flushes at 0. */
|
|
42
44
|
pendingToolOutputs = 0;
|
|
45
|
+
pendingMcpToolCalls = new Map();
|
|
43
46
|
/**
|
|
44
47
|
* Optional MCP tool catalog (bare tool name → `{ serverName, annotations }`),
|
|
45
48
|
* used to enrich `tool-call` / `tool-result` events for MCP-sourced tools
|
|
@@ -47,8 +50,9 @@ export class OpenAIEventAdapter {
|
|
|
47
50
|
* discovery settle enriches later events. `undefined` (or a miss) leaves the
|
|
48
51
|
* fields unset — the contract for consumer / built-in tools.
|
|
49
52
|
*/
|
|
50
|
-
constructor(mcpCatalog) {
|
|
53
|
+
constructor(mcpCatalog, wireCommunication) {
|
|
51
54
|
this.mcpCatalog = mcpCatalog;
|
|
55
|
+
this.wireCommunication = wireCommunication;
|
|
52
56
|
}
|
|
53
57
|
/**
|
|
54
58
|
* Map one `RunStreamEvent` to zero or more `ChatEvent`s. Emits a synthetic
|
|
@@ -93,13 +97,16 @@ export class OpenAIEventAdapter {
|
|
|
93
97
|
const toolCallId = item.callId ?? raw.callId;
|
|
94
98
|
if (toolName === undefined || toolCallId === undefined)
|
|
95
99
|
return;
|
|
100
|
+
const args = parseArgs(raw.arguments);
|
|
101
|
+
const enrichment = this.enrich(toolName);
|
|
96
102
|
out.push({
|
|
97
103
|
type: 'tool-call',
|
|
98
104
|
toolCallId,
|
|
99
105
|
toolName,
|
|
100
|
-
args
|
|
101
|
-
...
|
|
106
|
+
args,
|
|
107
|
+
...enrichment,
|
|
102
108
|
});
|
|
109
|
+
this.recordMcpToolCall(toolCallId, toolName, args, enrichment);
|
|
103
110
|
}
|
|
104
111
|
else if (event.name === 'tool_output') {
|
|
105
112
|
const item = event.item;
|
|
@@ -108,13 +115,15 @@ export class OpenAIEventAdapter {
|
|
|
108
115
|
const toolName = raw.name;
|
|
109
116
|
if (toolName === undefined || toolCallId === undefined)
|
|
110
117
|
return;
|
|
118
|
+
const result = normalizeOutput(item.output ?? raw.output);
|
|
111
119
|
out.push({
|
|
112
120
|
type: 'tool-result',
|
|
113
121
|
toolCallId,
|
|
114
122
|
toolName,
|
|
115
|
-
result
|
|
123
|
+
result,
|
|
116
124
|
...this.enrich(toolName),
|
|
117
125
|
});
|
|
126
|
+
this.emitMcpToolCallCompleted(toolCallId, result);
|
|
118
127
|
// The tool-result is now emitted INSIDE its step. Once every tool
|
|
119
128
|
// output of the deferred step has drained, flush the held
|
|
120
129
|
// `step-finish` so it closes the step after its results.
|
|
@@ -156,6 +165,52 @@ export class OpenAIEventAdapter {
|
|
|
156
165
|
lastUsage() {
|
|
157
166
|
return this.lastStepUsage;
|
|
158
167
|
}
|
|
168
|
+
clearPendingMcpToolCalls() {
|
|
169
|
+
this.pendingMcpToolCalls.clear();
|
|
170
|
+
}
|
|
171
|
+
recordMcpToolCall(toolCallId, toolName, args, enrichment) {
|
|
172
|
+
if (enrichment.serverName === undefined || enrichment.bareToolName === undefined)
|
|
173
|
+
return;
|
|
174
|
+
if (this.wireCommunication?.hasSubscribers() !== true)
|
|
175
|
+
return;
|
|
176
|
+
this.pendingMcpToolCalls.set(toolCallId, {
|
|
177
|
+
serverName: enrichment.serverName,
|
|
178
|
+
toolName,
|
|
179
|
+
bareToolName: enrichment.bareToolName,
|
|
180
|
+
args,
|
|
181
|
+
startedAt: this.wireCommunication.clock.now(),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Emits adapter-observed call-to-output latency, not MCP RPC latency. The
|
|
186
|
+
* OpenAI run-item window can include approval parking, scheduling, and resume.
|
|
187
|
+
*/
|
|
188
|
+
emitMcpToolCallCompleted(toolCallId, result) {
|
|
189
|
+
const pending = this.pendingMcpToolCalls.get(toolCallId);
|
|
190
|
+
if (pending === undefined)
|
|
191
|
+
return;
|
|
192
|
+
this.pendingMcpToolCalls.delete(toolCallId);
|
|
193
|
+
if (this.wireCommunication?.hasSubscribers() !== true)
|
|
194
|
+
return;
|
|
195
|
+
const completedAt = this.wireCommunication.clock.now();
|
|
196
|
+
try {
|
|
197
|
+
this.wireCommunication.emit({
|
|
198
|
+
type: 'mcp-tool-call-completed',
|
|
199
|
+
timestamp: completedAt,
|
|
200
|
+
serverName: pending.serverName,
|
|
201
|
+
toolName: pending.toolName,
|
|
202
|
+
bareToolName: pending.bareToolName,
|
|
203
|
+
args: pending.args,
|
|
204
|
+
result,
|
|
205
|
+
durationMs: completedAt.getTime() - pending.startedAt.getTime(),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
if (error instanceof AgentSDKError && error.type === AgentSDKErrorType.DISPOSED)
|
|
210
|
+
return;
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
159
214
|
/**
|
|
160
215
|
* Emit a synthetic `start` if the stream produced no events at all (e.g. a
|
|
161
216
|
* turn that failed before the first delta). Called by the pump on the error
|
|
@@ -231,6 +286,7 @@ export class OpenAIEventAdapter {
|
|
|
231
286
|
drainDeferredStepFinish() {
|
|
232
287
|
const out = [];
|
|
233
288
|
this.flushDeferredStepFinish(out);
|
|
289
|
+
this.clearPendingMcpToolCalls();
|
|
234
290
|
return out;
|
|
235
291
|
}
|
|
236
292
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-event-adapter.js","sourceRoot":"","sources":["../src/openai-event-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"openai-event-adapter.js","sourceRoot":"","sources":["../src/openai-event-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ModelProvider } from '@openai/agents';
|
|
2
|
-
import { type Clock } from '@salesforce/agentic-common';
|
|
2
|
+
import { type Clock, type UniqueIDGenerator } from '@salesforce/agentic-common';
|
|
3
3
|
import type { ModelConnectivityInfo, WireCommunicationEvent } from '@salesforce/sfdx-agent-sdk';
|
|
4
4
|
/**
|
|
5
5
|
* Per-request wire-communication hooks. When supplied to
|
|
@@ -15,6 +15,12 @@ export type WireHooks = {
|
|
|
15
15
|
emitWireCommunication: (event: WireCommunicationEvent) => void;
|
|
16
16
|
/** Time source for the event `timestamp`s; defaults to a fresh `RealClock`. */
|
|
17
17
|
clock?: Clock;
|
|
18
|
+
/** ID source for pairing one fetch's request and terminal response events. */
|
|
19
|
+
idGenerator?: UniqueIDGenerator;
|
|
20
|
+
/** Whether the harness currently has wire subscribers (avoids a tee when it does not). */
|
|
21
|
+
hasWireCommunicationSubscribers?: () => boolean;
|
|
22
|
+
/** Aborted by harness shutdown so detached body observers cannot outlive their owner. */
|
|
23
|
+
disposeSignal?: AbortSignal;
|
|
18
24
|
};
|
|
19
25
|
/**
|
|
20
26
|
* Builds a `@openai/agents` {@link ModelProvider} bound to the live
|
|
@@ -44,3 +50,18 @@ export declare function buildOpenAIModelProvider(opts: {
|
|
|
44
50
|
/** Wire-communication emission hooks. Omit to disable emission. */
|
|
45
51
|
wireHooks?: WireHooks;
|
|
46
52
|
}): ModelProvider;
|
|
53
|
+
/**
|
|
54
|
+
* Returns a `fetch` that merges the resolver's fresh headers into every
|
|
55
|
+
* outbound request. `getHeaders()` is re-evaluated per call so JWT rotation /
|
|
56
|
+
* premium-rate-limit gate flips land on the next request without rebuilding the
|
|
57
|
+
* client. Delegates to the proxy-aware `innerFetch` when supplied (so
|
|
58
|
+
* `HTTPS_PROXY` is honored), else the global `fetch`.
|
|
59
|
+
*
|
|
60
|
+
* When `wireHooks` is supplied, every outbound call emits one `llm-request`
|
|
61
|
+
* event before the fetch and one `llm-response` when its HTTP body terminates —
|
|
62
|
+
* or, on a transport failure, an `llm-response` with `status: 0` + the captured
|
|
63
|
+
* error, then rethrows (a wire hook never swallows the underlying fetch). Body capture
|
|
64
|
+
* is best-effort and bounded ({@link TRACE_BODY_BYTE_BUDGET}); a decode failure
|
|
65
|
+
* never blocks the call.
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildGatewayFetch(getInfo: () => ModelConnectivityInfo, innerFetch?: typeof fetch, wireHooks?: WireHooks): typeof fetch;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import OpenAI from 'openai';
|
|
6
6
|
import { OpenAIProvider, setOpenAIResponsesTransport } from '@openai/agents';
|
|
7
|
-
import { RealClock } from '@salesforce/agentic-common';
|
|
7
|
+
import { RealClock, UUIDGenerator } from '@salesforce/agentic-common';
|
|
8
8
|
/**
|
|
9
9
|
* Builds a `@openai/agents` {@link ModelProvider} bound to the live
|
|
10
10
|
* {@link ModelConnectivityInfo} bag.
|
|
@@ -59,13 +59,13 @@ const TRACE_BODY_BYTE_BUDGET = 256 * 1024;
|
|
|
59
59
|
* `HTTPS_PROXY` is honored), else the global `fetch`.
|
|
60
60
|
*
|
|
61
61
|
* When `wireHooks` is supplied, every outbound call emits one `llm-request`
|
|
62
|
-
* event before the fetch and one `llm-response`
|
|
63
|
-
* transport failure, an `llm-response` with `status: 0` + the captured
|
|
64
|
-
* then rethrows (a wire hook never swallows the underlying fetch). Body capture
|
|
62
|
+
* event before the fetch and one `llm-response` when its HTTP body terminates —
|
|
63
|
+
* or, on a transport failure, an `llm-response` with `status: 0` + the captured
|
|
64
|
+
* error, then rethrows (a wire hook never swallows the underlying fetch). Body capture
|
|
65
65
|
* is best-effort and bounded ({@link TRACE_BODY_BYTE_BUDGET}); a decode failure
|
|
66
66
|
* never blocks the call.
|
|
67
67
|
*/
|
|
68
|
-
function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
68
|
+
export function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
69
69
|
const baseFetch = innerFetch ?? fetch;
|
|
70
70
|
return (async (input, init) => {
|
|
71
71
|
const info = getInfo();
|
|
@@ -79,10 +79,14 @@ function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
|
79
79
|
if (wireHooks === undefined) {
|
|
80
80
|
return baseFetch(input, finalInit);
|
|
81
81
|
}
|
|
82
|
+
if (!(wireHooks.hasWireCommunicationSubscribers?.() ?? true)) {
|
|
83
|
+
return baseFetch(input, finalInit);
|
|
84
|
+
}
|
|
82
85
|
const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
|
|
83
86
|
const method = (finalInit.method ?? 'GET').toUpperCase();
|
|
84
87
|
const model = info.nativeModelId;
|
|
85
88
|
const clock = wireHooks.clock ?? new RealClock();
|
|
89
|
+
const correlationId = (wireHooks.idGenerator ?? new UUIDGenerator()).getUniqueId();
|
|
86
90
|
const requestStart = performance.now();
|
|
87
91
|
const body = tryDecodeBody(finalInit.body);
|
|
88
92
|
wireHooks.emitWireCommunication({
|
|
@@ -91,19 +95,44 @@ function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
|
91
95
|
url,
|
|
92
96
|
method,
|
|
93
97
|
model,
|
|
98
|
+
correlationId,
|
|
94
99
|
...(body !== undefined ? { body } : {}),
|
|
95
100
|
});
|
|
96
101
|
try {
|
|
97
102
|
const response = await baseFetch(input, finalInit);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
if (response.body === null) {
|
|
104
|
+
wireHooks.emitWireCommunication({
|
|
105
|
+
type: 'llm-response',
|
|
106
|
+
timestamp: clock.now(),
|
|
107
|
+
model,
|
|
108
|
+
status: response.status,
|
|
109
|
+
totalDurationMs: Math.round(performance.now() - requestStart),
|
|
110
|
+
correlationId,
|
|
111
|
+
xClientTraceId: response.headers.get('x-client-trace-id') ?? undefined,
|
|
112
|
+
});
|
|
113
|
+
return response;
|
|
114
|
+
}
|
|
115
|
+
const [observerBody, sdkBody] = response.body.tee();
|
|
116
|
+
void observeResponseBody({
|
|
117
|
+
body: observerBody,
|
|
118
|
+
requestSignal: finalInit.signal ?? undefined,
|
|
119
|
+
disposeSignal: wireHooks.disposeSignal,
|
|
120
|
+
clock,
|
|
121
|
+
onComplete: ({ responseText, timeToFirstTokenMs }) => {
|
|
122
|
+
wireHooks.emitWireCommunication({
|
|
123
|
+
type: 'llm-response',
|
|
124
|
+
timestamp: clock.now(),
|
|
125
|
+
model,
|
|
126
|
+
status: response.status,
|
|
127
|
+
totalDurationMs: Math.round(performance.now() - requestStart),
|
|
128
|
+
correlationId,
|
|
129
|
+
xClientTraceId: response.headers.get('x-client-trace-id') ?? undefined,
|
|
130
|
+
...(responseText !== undefined ? { responseText } : {}),
|
|
131
|
+
...(timeToFirstTokenMs !== undefined ? { timeToFirstTokenMs } : {}),
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
}).catch(() => undefined);
|
|
135
|
+
return new Response(sdkBody, response);
|
|
107
136
|
}
|
|
108
137
|
catch (error) {
|
|
109
138
|
wireHooks.emitWireCommunication({
|
|
@@ -111,6 +140,7 @@ function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
|
111
140
|
timestamp: clock.now(),
|
|
112
141
|
model,
|
|
113
142
|
status: 0,
|
|
143
|
+
correlationId,
|
|
114
144
|
error: error instanceof Error ? error : new Error(String(error)),
|
|
115
145
|
totalDurationMs: Math.round(performance.now() - requestStart),
|
|
116
146
|
});
|
|
@@ -118,6 +148,124 @@ function buildGatewayFetch(getInfo, innerFetch, wireHooks) {
|
|
|
118
148
|
}
|
|
119
149
|
});
|
|
120
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Observes only this tee branch. Cancellation intentionally does not await
|
|
153
|
+
* `reader.cancel()`: WHATWG tee cancellation can wait for the SDK's unread
|
|
154
|
+
* branch and would otherwise let telemetry hang the request indefinitely.
|
|
155
|
+
*/
|
|
156
|
+
async function observeResponseBody(options) {
|
|
157
|
+
const reader = options.body.getReader();
|
|
158
|
+
const decoder = new TextDecoder();
|
|
159
|
+
const startedAt = options.clock.now();
|
|
160
|
+
const text = [];
|
|
161
|
+
let textBytes = 0;
|
|
162
|
+
let firstTokenAt;
|
|
163
|
+
let sawOutputText = false;
|
|
164
|
+
let sseBuffer = '';
|
|
165
|
+
let sseBufferBytes = 0;
|
|
166
|
+
let cancelled = false;
|
|
167
|
+
let resolveCancelled;
|
|
168
|
+
const cancellation = new Promise((resolve) => {
|
|
169
|
+
resolveCancelled = resolve;
|
|
170
|
+
});
|
|
171
|
+
const cancel = () => {
|
|
172
|
+
if (cancelled)
|
|
173
|
+
return;
|
|
174
|
+
cancelled = true;
|
|
175
|
+
void reader.cancel().catch(() => undefined);
|
|
176
|
+
try {
|
|
177
|
+
reader.releaseLock();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
String(error);
|
|
181
|
+
}
|
|
182
|
+
resolveCancelled?.();
|
|
183
|
+
};
|
|
184
|
+
const abort = () => cancel();
|
|
185
|
+
options.requestSignal?.addEventListener('abort', abort, { once: true });
|
|
186
|
+
options.disposeSignal?.addEventListener('abort', abort, { once: true });
|
|
187
|
+
if (options.requestSignal?.aborted || options.disposeSignal?.aborted)
|
|
188
|
+
cancel();
|
|
189
|
+
try {
|
|
190
|
+
while (!cancelled) {
|
|
191
|
+
const read = reader.read();
|
|
192
|
+
void read.catch(() => undefined);
|
|
193
|
+
const next = await Promise.race([read, cancellation.then(() => undefined)]);
|
|
194
|
+
if (cancelled || next === undefined || next.done)
|
|
195
|
+
break;
|
|
196
|
+
if (firstTokenAt === undefined)
|
|
197
|
+
firstTokenAt = options.clock.now().getTime() - startedAt.getTime();
|
|
198
|
+
if (sseBufferBytes + next.value.byteLength > TRACE_BODY_BYTE_BUDGET) {
|
|
199
|
+
cancel();
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
sseBuffer += decoder.decode(next.value, { stream: true });
|
|
203
|
+
const parsed = takeSseEvents(sseBuffer);
|
|
204
|
+
sseBuffer = parsed.remaining;
|
|
205
|
+
sseBufferBytes = Buffer.byteLength(sseBuffer, 'utf8');
|
|
206
|
+
for (const event of parsed.events) {
|
|
207
|
+
const delta = outputTextDelta(event);
|
|
208
|
+
if (delta === undefined)
|
|
209
|
+
continue;
|
|
210
|
+
const deltaBytes = Buffer.byteLength(delta, 'utf8');
|
|
211
|
+
if (textBytes + deltaBytes > TRACE_BODY_BYTE_BUDGET) {
|
|
212
|
+
cancel();
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
sawOutputText = true;
|
|
216
|
+
text.push(delta);
|
|
217
|
+
textBytes += deltaBytes;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
sawOutputText = false;
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
options.requestSignal?.removeEventListener('abort', abort);
|
|
226
|
+
options.disposeSignal?.removeEventListener('abort', abort);
|
|
227
|
+
if (!cancelled) {
|
|
228
|
+
try {
|
|
229
|
+
reader.releaseLock();
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
String(error);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
options.onComplete({
|
|
236
|
+
...(sawOutputText ? { responseText: text.join('') } : {}),
|
|
237
|
+
...(firstTokenAt !== undefined ? { timeToFirstTokenMs: firstTokenAt } : {}),
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function takeSseEvents(buffer) {
|
|
242
|
+
const complete = buffer.lastIndexOf('\n');
|
|
243
|
+
if (complete === -1)
|
|
244
|
+
return { events: [], remaining: buffer };
|
|
245
|
+
const events = [];
|
|
246
|
+
for (const line of buffer.slice(0, complete).split(/\r?\n/)) {
|
|
247
|
+
if (!line.startsWith('data:'))
|
|
248
|
+
continue;
|
|
249
|
+
const data = line.slice('data:'.length).trim();
|
|
250
|
+
if (data.length === 0 || data === '[DONE]')
|
|
251
|
+
continue;
|
|
252
|
+
try {
|
|
253
|
+
events.push(JSON.parse(data));
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
String(error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return { events, remaining: buffer.slice(complete + 1) };
|
|
260
|
+
}
|
|
261
|
+
function outputTextDelta(event) {
|
|
262
|
+
if (typeof event !== 'object' || event === null)
|
|
263
|
+
return undefined;
|
|
264
|
+
const candidate = event;
|
|
265
|
+
return candidate.type === 'response.output_text.delta' && typeof candidate.delta === 'string'
|
|
266
|
+
? candidate.delta
|
|
267
|
+
: undefined;
|
|
268
|
+
}
|
|
121
269
|
/**
|
|
122
270
|
* Best-effort decode of a request body for the `llm-request` event. Only string
|
|
123
271
|
* bodies are decoded (streams / FormData / Blob are skipped); a body over
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-model-provider.js","sourceRoot":"","sources":["../src/openai-model-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAkC,cAAc,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAc,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-model-provider.js","sourceRoot":"","sources":["../src/openai-model-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAkC,cAAc,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAc,SAAS,EAA0B,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAyB1G;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAMxC;IACG,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEhD,8EAA8E;IAC9E,4EAA4E;IAC5E,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO;QACH,QAAQ,CAAC,SAAkB;YACvB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,qEAAqE;gBACrE,oEAAoE;gBACpE,yEAAyE;gBACzE,MAAM,EAAE,gCAAgC;gBACxC,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC;aAC3D,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,kEAAkE;YAClE,oEAAoE;YACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;KACJ,CAAC;AACN,CAAC;AAED,+FAA+F;AAC/F,MAAM,sBAAsB,GAAG,GAAG,GAAG,IAAI,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC7B,OAAoC,EACpC,UAAyB,EACzB,SAAqB;IAErB,MAAM,SAAS,GAAG,UAAU,IAAI,KAAK,CAAC;IACtC,OAAO,CAAC,KAAK,EAAE,KAAkC,EAAE,IAAkC,EAAqB,EAAE;QACxG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;QAEvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,CAAC,SAAS,CAAC,+BAA+B,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QACpG,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,CAAC,SAAS,CAAC,WAAW,IAAI,IAAI,aAAa,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE3C,SAAS,CAAC,qBAAqB,CAAC;YAC5B,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE;YACtB,GAAG;YACH,MAAM;YACN,KAAK;YACL,aAAa;YACb,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzB,SAAS,CAAC,qBAAqB,CAAC;oBAC5B,IAAI,EAAE,cAAc;oBACpB,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE;oBACtB,KAAK;oBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;oBAC7D,aAAa;oBACb,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;iBACzE,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC;YACpB,CAAC;YAED,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACpD,KAAK,mBAAmB,CAAC;gBACrB,IAAI,EAAE,YAAY;gBAClB,aAAa,EAAE,SAAS,CAAC,MAAM,IAAI,SAAS;gBAC5C,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,KAAK;gBACL,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,EAAE,EAAE;oBACjD,SAAS,CAAC,qBAAqB,CAAC;wBAC5B,IAAI,EAAE,cAAc;wBACpB,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE;wBACtB,KAAK;wBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;wBAC7D,aAAa;wBACb,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;wBACtE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvD,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtE,CAAC,CAAC;gBACP,CAAC;aACJ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1B,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE;gBACtB,KAAK;gBACL,MAAM,EAAE,CAAC;gBACT,aAAa;gBACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;aAChE,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAiB,CAAC;AACvB,CAAC;AAUD;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAgC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,YAAgC,CAAC;IACrC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,gBAA0C,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC/C,gBAAgB,GAAG,OAAO,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,GAAS,EAAE;QACtB,IAAI,SAAS;YAAE,OAAO;QACtB,SAAS,GAAG,IAAI,CAAC;QACjB,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC;YACD,MAAM,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QACD,gBAAgB,EAAE,EAAE,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,MAAM,EAAE,CAAC;IACnC,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO;QAAE,MAAM,EAAE,CAAC;IAE/E,IAAI,CAAC;QACD,OAAO,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5E,IAAI,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YACxD,IAAI,YAAY,KAAK,SAAS;gBAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;YACnG,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,sBAAsB,EAAE,CAAC;gBAClE,MAAM,EAAE,CAAC;gBACT,MAAM;YACV,CAAC;YACD,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YACxC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACtD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACpD,IAAI,SAAS,GAAG,UAAU,GAAG,sBAAsB,EAAE,CAAC;oBAClD,MAAM,EAAE,CAAC;oBACT,MAAM;gBACV,CAAC;gBACD,aAAa,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjB,SAAS,IAAI,UAAU,CAAC;YAC5B,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,aAAa,GAAG,KAAK,CAAC;IAC1B,CAAC;YAAS,CAAC;QACP,OAAO,CAAC,aAAa,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,aAAa,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,IAAI,CAAC;gBACD,MAAM,CAAC,WAAW,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACL,CAAC;QACD,OAAO,CAAC,UAAU,CAAC;YACf,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrD,IAAI,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,SAAS,GAAG,KAA4C,CAAC;IAC/D,OAAO,SAAS,CAAC,IAAI,KAAK,4BAA4B,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;QACzF,CAAC,CAAC,SAAS,CAAC,KAAK;QACjB,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,IAAa;IAChC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,sBAAsB,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnH,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC"}
|