@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.
@@ -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` after it resolves — or, on a
63
- * transport failure, an `llm-response` with `status: 0` + the captured error,
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
- wireHooks.emitWireCommunication({
99
- type: 'llm-response',
100
- timestamp: clock.now(),
101
- model,
102
- status: response.status,
103
- totalDurationMs: Math.round(performance.now() - requestStart),
104
- xClientTraceId: response.headers.get('x-client-trace-id') ?? undefined,
105
- });
106
- return response;
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":"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"}
1
+ {"version":3,"file":"openai-model-provider.js","sourceRoot":"","sources":["../src/openai-model-provider.ts"],"names":[],"mappings":"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"}