@salesforce/sfdx-agent-harness-openai 0.4.0 → 0.5.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 +5 -0
- package/README.md +10 -0
- package/dist/openai-agents-harness.d.ts +1 -0
- package/dist/openai-agents-harness.js +10 -0
- 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
|
@@ -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":"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"}
|