@glexir/sdk 0.0.0-stage → 0.2.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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +292 -2
  3. package/dist/client.d.ts +61 -0
  4. package/dist/client.js +245 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/core/api-promise.d.ts +31 -0
  7. package/dist/core/api-promise.js +39 -0
  8. package/dist/core/api-promise.js.map +1 -0
  9. package/dist/core/errors.d.ts +70 -0
  10. package/dist/core/errors.js +118 -0
  11. package/dist/core/errors.js.map +1 -0
  12. package/dist/core/multipart.d.ts +16 -0
  13. package/dist/core/multipart.js +68 -0
  14. package/dist/core/multipart.js.map +1 -0
  15. package/dist/core/pagination.d.ts +41 -0
  16. package/dist/core/pagination.js +63 -0
  17. package/dist/core/pagination.js.map +1 -0
  18. package/dist/core/request-options.d.ts +29 -0
  19. package/dist/core/request-options.js +2 -0
  20. package/dist/core/request-options.js.map +1 -0
  21. package/dist/core/resource.d.ts +5 -0
  22. package/dist/core/resource.js +7 -0
  23. package/dist/core/resource.js.map +1 -0
  24. package/dist/core/retry.d.ts +13 -0
  25. package/dist/core/retry.js +65 -0
  26. package/dist/core/retry.js.map +1 -0
  27. package/dist/core/streaming.d.ts +44 -0
  28. package/dist/core/streaming.js +238 -0
  29. package/dist/core/streaming.js.map +1 -0
  30. package/dist/index.d.ts +20 -0
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/lib/chat-completion-stream.d.ts +26 -0
  34. package/dist/lib/chat-completion-stream.js +161 -0
  35. package/dist/lib/chat-completion-stream.js.map +1 -0
  36. package/dist/lib/output-text.d.ts +4 -0
  37. package/dist/lib/output-text.js +22 -0
  38. package/dist/lib/output-text.js.map +1 -0
  39. package/dist/lib/response-stream.d.ts +30 -0
  40. package/dist/lib/response-stream.js +122 -0
  41. package/dist/lib/response-stream.js.map +1 -0
  42. package/dist/lib/strict-schema.d.ts +11 -0
  43. package/dist/lib/strict-schema.js +116 -0
  44. package/dist/lib/strict-schema.js.map +1 -0
  45. package/dist/resources/audio.d.ts +46 -0
  46. package/dist/resources/audio.js +24 -0
  47. package/dist/resources/audio.js.map +1 -0
  48. package/dist/resources/batches.d.ts +20 -0
  49. package/dist/resources/batches.js +24 -0
  50. package/dist/resources/batches.js.map +1 -0
  51. package/dist/resources/chat.d.ts +63 -0
  52. package/dist/resources/chat.js +79 -0
  53. package/dist/resources/chat.js.map +1 -0
  54. package/dist/resources/conversations.d.ts +23 -0
  55. package/dist/resources/conversations.js +38 -0
  56. package/dist/resources/conversations.js.map +1 -0
  57. package/dist/resources/embeddings.d.ts +12 -0
  58. package/dist/resources/embeddings.js +34 -0
  59. package/dist/resources/embeddings.js.map +1 -0
  60. package/dist/resources/files.d.ts +15 -0
  61. package/dist/resources/files.js +27 -0
  62. package/dist/resources/files.js.map +1 -0
  63. package/dist/resources/models.d.ts +10 -0
  64. package/dist/resources/models.js +11 -0
  65. package/dist/resources/models.js.map +1 -0
  66. package/dist/resources/responses.d.ts +61 -0
  67. package/dist/resources/responses.js +85 -0
  68. package/dist/resources/responses.js.map +1 -0
  69. package/dist/types/audio.d.ts +172 -0
  70. package/dist/types/audio.js +2 -0
  71. package/dist/types/audio.js.map +1 -0
  72. package/dist/types/chat.d.ts +316 -0
  73. package/dist/types/chat.js +2 -0
  74. package/dist/types/chat.js.map +1 -0
  75. package/dist/types/conversations.d.ts +46 -0
  76. package/dist/types/conversations.js +2 -0
  77. package/dist/types/conversations.js.map +1 -0
  78. package/dist/types/platform.d.ts +151 -0
  79. package/dist/types/platform.js +2 -0
  80. package/dist/types/platform.js.map +1 -0
  81. package/dist/types/responses.d.ts +640 -0
  82. package/dist/types/responses.js +2 -0
  83. package/dist/types/responses.js.map +1 -0
  84. package/dist/types/shared.d.ts +108 -0
  85. package/dist/types/shared.js +2 -0
  86. package/dist/types/shared.js.map +1 -0
  87. package/dist/version.d.ts +1 -0
  88. package/dist/version.js +2 -0
  89. package/dist/version.js.map +1 -0
  90. package/package.json +37 -3
@@ -0,0 +1,238 @@
1
+ import { APIError, GlexirError } from './errors.js';
2
+ /**
3
+ * Splits a byte stream into lines, handling `\n`, `\r` and `\r\n` endings even when
4
+ * a line ending is split across chunks.
5
+ */
6
+ export class LineDecoder {
7
+ buffer = '';
8
+ trailingCR = false;
9
+ decoder = new TextDecoder();
10
+ decode(chunk) {
11
+ let text = typeof chunk === 'string' ? chunk : this.decoder.decode(chunk, { stream: true });
12
+ if (this.trailingCR) {
13
+ // A `\r` ended the previous chunk; a leading `\n` here belongs to it.
14
+ if (text.startsWith('\n'))
15
+ text = text.slice(1);
16
+ this.trailingCR = false;
17
+ }
18
+ if (text.endsWith('\r')) {
19
+ this.trailingCR = true;
20
+ }
21
+ this.buffer += text;
22
+ const lines = [];
23
+ let match;
24
+ const pattern = /\r\n|\r|\n/g;
25
+ let start = 0;
26
+ while ((match = pattern.exec(this.buffer)) !== null) {
27
+ lines.push(this.buffer.slice(start, match.index));
28
+ start = match.index + match[0].length;
29
+ }
30
+ this.buffer = this.buffer.slice(start);
31
+ return lines;
32
+ }
33
+ flush() {
34
+ const rest = this.buffer + this.decoder.decode();
35
+ this.buffer = '';
36
+ this.trailingCR = false;
37
+ return rest ? [rest] : [];
38
+ }
39
+ }
40
+ /** Assembles SSE lines into events per the WHATWG EventSource parsing rules (only `event` and `data` are used). */
41
+ export class SSEDecoder {
42
+ data = [];
43
+ event = null;
44
+ chunks = [];
45
+ decode(line) {
46
+ if (line === '') {
47
+ if (!this.event && this.data.length === 0)
48
+ return null;
49
+ const sse = { event: this.event, data: this.data.join('\n'), raw: this.chunks };
50
+ this.event = null;
51
+ this.data = [];
52
+ this.chunks = [];
53
+ return sse;
54
+ }
55
+ this.chunks.push(line);
56
+ if (line.startsWith(':'))
57
+ return null;
58
+ const colon = line.indexOf(':');
59
+ const field = colon === -1 ? line : line.slice(0, colon);
60
+ let value = colon === -1 ? '' : line.slice(colon + 1);
61
+ if (value.startsWith(' '))
62
+ value = value.slice(1);
63
+ if (field === 'event')
64
+ this.event = value;
65
+ else if (field === 'data')
66
+ this.data.push(value);
67
+ return null;
68
+ }
69
+ }
70
+ async function* iterBytes(body) {
71
+ const reader = body.getReader();
72
+ try {
73
+ while (true) {
74
+ const { done, value } = await reader.read();
75
+ if (done)
76
+ return;
77
+ if (value)
78
+ yield value;
79
+ }
80
+ }
81
+ finally {
82
+ reader.releaseLock();
83
+ }
84
+ }
85
+ export async function* iterSSEMessages(body) {
86
+ const lines = new LineDecoder();
87
+ const sse = new SSEDecoder();
88
+ for await (const chunk of iterBytes(body)) {
89
+ for (const line of lines.decode(chunk)) {
90
+ const event = sse.decode(line);
91
+ if (event)
92
+ yield event;
93
+ }
94
+ }
95
+ for (const line of lines.flush()) {
96
+ const event = sse.decode(line);
97
+ if (event)
98
+ yield event;
99
+ }
100
+ // An event with no terminating blank line is still delivered at EOF.
101
+ const last = sse.decode('');
102
+ if (last)
103
+ yield last;
104
+ }
105
+ function parseEventData(sse) {
106
+ try {
107
+ return JSON.parse(sse.data);
108
+ }
109
+ catch {
110
+ throw new GlexirError(`Could not parse server-sent event data as JSON: ${sse.data.slice(0, 200)}`);
111
+ }
112
+ }
113
+ /** An async-iterable stream of parsed events. Breaking out of the loop aborts the HTTP request. */
114
+ export class Stream {
115
+ iterator;
116
+ controller;
117
+ response;
118
+ consumed = false;
119
+ constructor(iterator, controller,
120
+ /** The underlying HTTP response, if this stream came from one. */
121
+ response) {
122
+ this.iterator = iterator;
123
+ this.controller = controller;
124
+ this.response = response;
125
+ }
126
+ static fromSSEResponse(response, controller) {
127
+ async function* iterator() {
128
+ if (!response.body) {
129
+ controller.abort();
130
+ throw new GlexirError('Attempted to iterate over a response with no body');
131
+ }
132
+ let done = false;
133
+ try {
134
+ for await (const sse of iterSSEMessages(response.body)) {
135
+ if (done)
136
+ continue;
137
+ if (sse.data.startsWith('[DONE]')) {
138
+ done = true;
139
+ continue;
140
+ }
141
+ if (sse.event === 'error') {
142
+ const data = parseEventData(sse);
143
+ throw new APIError(undefined, data?.error ?? data, undefined, response.headers);
144
+ }
145
+ if (sse.data === '')
146
+ continue;
147
+ const data = parseEventData(sse);
148
+ // Errors can also arrive as a data payload: nested `{ error: {...} }` or flat `{ type: "error", ... }`.
149
+ if (data && typeof data === 'object' && (data.error || data.type === 'error')) {
150
+ throw new APIError(undefined, data.error ?? data, undefined, response.headers);
151
+ }
152
+ yield data;
153
+ }
154
+ done = true;
155
+ }
156
+ catch (err) {
157
+ if (isAbortError(err))
158
+ return;
159
+ throw err;
160
+ }
161
+ finally {
162
+ if (!done)
163
+ controller.abort();
164
+ }
165
+ }
166
+ return new Stream(() => iterator()[Symbol.asyncIterator](), controller, response);
167
+ }
168
+ /** Re-hydrates a stream produced by {@link Stream.toReadableStream} (newline-delimited JSON). */
169
+ static fromReadableStream(readable, controller = new AbortController()) {
170
+ async function* iterator() {
171
+ const lines = new LineDecoder();
172
+ for await (const chunk of iterBytes(readable)) {
173
+ for (const line of lines.decode(chunk))
174
+ if (line)
175
+ yield JSON.parse(line);
176
+ }
177
+ for (const line of lines.flush())
178
+ if (line)
179
+ yield JSON.parse(line);
180
+ }
181
+ return new Stream(() => iterator()[Symbol.asyncIterator](), controller);
182
+ }
183
+ [Symbol.asyncIterator]() {
184
+ if (this.consumed)
185
+ throw new GlexirError('Cannot iterate over a consumed stream; use `.tee()` to split it.');
186
+ this.consumed = true;
187
+ return this.iterator();
188
+ }
189
+ /** Splits the stream into two independent streams that each see every event. */
190
+ tee() {
191
+ const queues = [[], []];
192
+ let source;
193
+ const makeIterator = (own) => () => ({
194
+ next: () => {
195
+ const queue = queues[own];
196
+ if (queue.length === 0) {
197
+ source ??= this[Symbol.asyncIterator]();
198
+ const result = source.next();
199
+ queues[0].push(result);
200
+ queues[1].push(result);
201
+ }
202
+ return queue.shift();
203
+ },
204
+ });
205
+ return [new Stream(makeIterator(0), this.controller, this.response), new Stream(makeIterator(1), this.controller, this.response)];
206
+ }
207
+ /** Converts to a byte stream of newline-delimited JSON, e.g. to relay to a browser. */
208
+ toReadableStream() {
209
+ const encoder = new TextEncoder();
210
+ let iter;
211
+ return new ReadableStream({
212
+ start: () => {
213
+ iter = this[Symbol.asyncIterator]();
214
+ },
215
+ pull: async (ctrl) => {
216
+ try {
217
+ const { value, done } = await iter.next();
218
+ if (done)
219
+ return ctrl.close();
220
+ ctrl.enqueue(encoder.encode(JSON.stringify(value) + '\n'));
221
+ }
222
+ catch (err) {
223
+ ctrl.error(err);
224
+ }
225
+ },
226
+ cancel: async () => {
227
+ await iter.return?.();
228
+ },
229
+ });
230
+ }
231
+ }
232
+ export function isAbortError(err) {
233
+ return (typeof err === 'object' &&
234
+ err !== null &&
235
+ (('name' in err && err.name === 'AbortError') ||
236
+ ('message' in err && String(err.message).includes('FetchRequestCanceledException'))));
237
+ }
238
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/core/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export { Glexir, Glexir as default, DEFAULT_BASE_URL, type ClientOptions } from './client.js';
2
+ export { VERSION } from './version.js';
3
+ export { APIPromise, type WithRawResponse } from './core/api-promise.js';
4
+ export { GlexirError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, AuthenticationError, BadRequestError, ConflictError, ContentFilterFinishReasonError, InternalServerError, LengthFinishReasonError, NotFoundError, PermissionDeniedError, RateLimitError, UnprocessableEntityError, type APIErrorBody, } from './core/errors.js';
5
+ export { toFile, type Uploadable } from './core/multipart.js';
6
+ export { CursorPage, PagePromise, type CursorPageParams } from './core/pagination.js';
7
+ export type { RequestOptions } from './core/request-options.js';
8
+ export { Stream, type ServerSentEvent } from './core/streaming.js';
9
+ export { ChatCompletionStream } from './lib/chat-completion-stream.js';
10
+ export { ResponseStream } from './lib/response-stream.js';
11
+ export { StrictSchemaError, toStrictJsonSchema } from './lib/strict-schema.js';
12
+ export type { ParsedChatCompletion, ParsedChatCompletionMessage, ParsedFunctionToolCall } from './resources/chat.js';
13
+ export type { ParseOptions, ParsedResponse, ResponseStreamParams, ResponseStreamResumeParams } from './resources/responses.js';
14
+ export { toBatchJSONL } from './resources/batches.js';
15
+ export type * from './types/shared.js';
16
+ export type * from './types/responses.js';
17
+ export type * from './types/conversations.js';
18
+ export type * from './types/chat.js';
19
+ export type * from './types/audio.js';
20
+ export type * from './types/platform.js';
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { Glexir, Glexir as default, DEFAULT_BASE_URL } from './client.js';
2
+ export { VERSION } from './version.js';
3
+ export { APIPromise } from './core/api-promise.js';
4
+ export { GlexirError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, AuthenticationError, BadRequestError, ConflictError, ContentFilterFinishReasonError, InternalServerError, LengthFinishReasonError, NotFoundError, PermissionDeniedError, RateLimitError, UnprocessableEntityError, } from './core/errors.js';
5
+ export { toFile } from './core/multipart.js';
6
+ export { CursorPage, PagePromise } from './core/pagination.js';
7
+ export { Stream } from './core/streaming.js';
8
+ export { ChatCompletionStream } from './lib/chat-completion-stream.js';
9
+ export { ResponseStream } from './lib/response-stream.js';
10
+ export { StrictSchemaError, toStrictJsonSchema } from './lib/strict-schema.js';
11
+ export { toBatchJSONL } from './resources/batches.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO,EAAE,gBAAgB,EAAsB,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,8BAA8B,EAC9B,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,wBAAwB,GAEzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAmB,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAwB,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAI/E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Stream } from '../core/streaming.js';
2
+ import type { ChatCompletion, ChatCompletionChunk } from '../types/chat.js';
3
+ /**
4
+ * Wraps a Chat Completions SSE stream and accumulates chunks into a `ChatCompletion`,
5
+ * merging tool-call fragments by `index` (ids and names only arrive on the first fragment).
6
+ */
7
+ export declare class ChatCompletionStream implements AsyncIterable<ChatCompletionChunk> {
8
+ private readonly streamPromise;
9
+ private base;
10
+ private readonly choices;
11
+ private usage;
12
+ private started;
13
+ private readonly done;
14
+ private resolveDone;
15
+ private rejectDone;
16
+ private stream;
17
+ constructor(streamPromise: PromiseLike<Stream<ChatCompletionChunk>>);
18
+ abort(): void;
19
+ [Symbol.asyncIterator](): AsyncGenerator<ChatCompletionChunk>;
20
+ finalChatCompletion(): Promise<ChatCompletion>;
21
+ /** Content of the first choice once the stream finishes. */
22
+ finalContent(): Promise<string | null>;
23
+ /** The completion assembled from the chunks received so far. */
24
+ snapshot(): ChatCompletion;
25
+ private accumulate;
26
+ }
@@ -0,0 +1,161 @@
1
+ import { GlexirError } from '../core/errors.js';
2
+ const MAX_CHOICES = 128;
3
+ const MAX_TOOL_CALLS = 128;
4
+ /**
5
+ * Wraps a Chat Completions SSE stream and accumulates chunks into a `ChatCompletion`,
6
+ * merging tool-call fragments by `index` (ids and names only arrive on the first fragment).
7
+ */
8
+ export class ChatCompletionStream {
9
+ streamPromise;
10
+ base;
11
+ choices = [];
12
+ usage;
13
+ started = false;
14
+ done;
15
+ resolveDone;
16
+ rejectDone;
17
+ stream;
18
+ constructor(streamPromise) {
19
+ this.streamPromise = streamPromise;
20
+ this.done = new Promise((resolve, reject) => {
21
+ this.resolveDone = resolve;
22
+ this.rejectDone = reject;
23
+ });
24
+ this.done.catch(() => { });
25
+ }
26
+ abort() {
27
+ this.stream?.controller.abort();
28
+ }
29
+ async *[Symbol.asyncIterator]() {
30
+ if (this.started)
31
+ throw new GlexirError('A ChatCompletionStream can only be iterated once.');
32
+ this.started = true;
33
+ try {
34
+ this.stream = await this.streamPromise;
35
+ for await (const chunk of this.stream) {
36
+ this.accumulate(chunk);
37
+ yield chunk;
38
+ }
39
+ this.resolveDone(this.snapshot());
40
+ }
41
+ catch (err) {
42
+ this.rejectDone(err);
43
+ throw err;
44
+ }
45
+ }
46
+ async finalChatCompletion() {
47
+ if (!this.started) {
48
+ for await (const _ of this) {
49
+ // drain
50
+ }
51
+ }
52
+ return this.done;
53
+ }
54
+ /** Content of the first choice once the stream finishes. */
55
+ async finalContent() {
56
+ return (await this.finalChatCompletion()).choices[0]?.message.content ?? null;
57
+ }
58
+ /** The completion assembled from the chunks received so far. */
59
+ snapshot() {
60
+ if (!this.base)
61
+ throw new GlexirError('No chunks received yet.');
62
+ return {
63
+ id: this.base.id,
64
+ object: 'chat.completion',
65
+ created: this.base.created,
66
+ model: this.base.model,
67
+ ...(this.base.service_tier !== undefined && { service_tier: this.base.service_tier }),
68
+ ...(this.base.system_fingerprint !== undefined && { system_fingerprint: this.base.system_fingerprint }),
69
+ ...(this.usage && { usage: this.usage }),
70
+ choices: this.choices.filter(Boolean).map((choice) => ({
71
+ index: choice.index,
72
+ finish_reason: choice.finish_reason ?? 'stop',
73
+ logprobs: choice.logprobs,
74
+ message: {
75
+ role: 'assistant',
76
+ content: choice.content,
77
+ refusal: choice.refusal,
78
+ ...(choice.tool_calls.length > 0 && {
79
+ tool_calls: choice.tool_calls.filter(Boolean).map((tc) => finalizeToolCall(tc, choice.index)),
80
+ }),
81
+ },
82
+ })),
83
+ };
84
+ }
85
+ accumulate(chunk) {
86
+ this.base ??= { id: chunk.id, created: chunk.created, model: chunk.model };
87
+ if (chunk.service_tier !== undefined)
88
+ this.base.service_tier = chunk.service_tier;
89
+ if (chunk.system_fingerprint !== undefined)
90
+ this.base.system_fingerprint = chunk.system_fingerprint;
91
+ if (chunk.usage)
92
+ this.usage = chunk.usage;
93
+ for (const delta of chunk.choices ?? []) {
94
+ if (!Number.isInteger(delta.index) || delta.index < 0 || delta.index >= MAX_CHOICES) {
95
+ throw new GlexirError(`Invalid choice index ${delta.index} in stream chunk.`);
96
+ }
97
+ const choice = (this.choices[delta.index] ??= {
98
+ index: delta.index,
99
+ content: null,
100
+ refusal: null,
101
+ tool_calls: [],
102
+ finish_reason: null,
103
+ logprobs: null,
104
+ });
105
+ // The API may omit finish_reason; treat it as null until a value arrives.
106
+ if (delta.finish_reason)
107
+ choice.finish_reason = delta.finish_reason;
108
+ if (delta.delta?.role)
109
+ choice.role = delta.delta.role;
110
+ if (delta.delta?.content)
111
+ choice.content = (choice.content ?? '') + delta.delta.content;
112
+ if (delta.delta?.refusal)
113
+ choice.refusal = (choice.refusal ?? '') + delta.delta.refusal;
114
+ if (delta.logprobs) {
115
+ choice.logprobs ??= { content: null, refusal: null };
116
+ if (delta.logprobs.content)
117
+ choice.logprobs.content = [...(choice.logprobs.content ?? []), ...delta.logprobs.content];
118
+ if (delta.logprobs.refusal)
119
+ choice.logprobs.refusal = [...(choice.logprobs.refusal ?? []), ...delta.logprobs.refusal];
120
+ }
121
+ for (const fragment of delta.delta?.tool_calls ?? []) {
122
+ if (!Number.isInteger(fragment.index) || fragment.index < 0 || fragment.index >= MAX_TOOL_CALLS) {
123
+ throw new GlexirError(`Invalid tool call index ${fragment.index} in stream chunk.`);
124
+ }
125
+ const call = (choice.tool_calls[fragment.index] ??= {});
126
+ if (fragment.id)
127
+ call.id = fragment.id;
128
+ if (fragment.type)
129
+ call.type = fragment.type;
130
+ if (fragment.function) {
131
+ call.type ??= 'function';
132
+ const fn = (call.function ??= { name: '', arguments: '' });
133
+ if (fragment.function.name)
134
+ fn.name = fragment.function.name;
135
+ if (fragment.function.arguments)
136
+ fn.arguments += fragment.function.arguments;
137
+ }
138
+ if (fragment.custom) {
139
+ call.type ??= 'custom';
140
+ const custom = (call.custom ??= { name: '', input: '' });
141
+ if (fragment.custom.name)
142
+ custom.name = fragment.custom.name;
143
+ if (fragment.custom.input)
144
+ custom.input += fragment.custom.input;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ function finalizeToolCall(call, choiceIndex) {
151
+ if (!call.id)
152
+ throw new GlexirError(`Missing id for a tool call in choice ${choiceIndex}.`);
153
+ if (call.type === 'custom' && call.custom) {
154
+ return { id: call.id, type: 'custom', custom: { ...call.custom } };
155
+ }
156
+ if (call.function) {
157
+ return { id: call.id, type: 'function', function: { ...call.function } };
158
+ }
159
+ throw new GlexirError(`Incomplete tool call ${call.id} in choice ${choiceIndex}.`);
160
+ }
161
+ //# sourceMappingURL=chat-completion-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-completion-stream.js","sourceRoot":"","sources":["../../src/lib/chat-completion-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Response } from '../types/responses.js';
2
+ /** Concatenates every `output_text` part across assistant messages (the API does not send this field). */
3
+ export declare function computeOutputText(output: Response['output'] | undefined): string;
4
+ export declare function addOutputText<T extends Response>(response: T): T;
@@ -0,0 +1,22 @@
1
+ /** Concatenates every `output_text` part across assistant messages (the API does not send this field). */
2
+ export function computeOutputText(output) {
3
+ const texts = [];
4
+ for (const item of output ?? []) {
5
+ if (item.type !== 'message')
6
+ continue;
7
+ for (const part of item.content)
8
+ if (part.type === 'output_text')
9
+ texts.push(part.text);
10
+ }
11
+ return texts.join('');
12
+ }
13
+ export function addOutputText(response) {
14
+ Object.defineProperty(response, 'output_text', {
15
+ value: computeOutputText(response.output),
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ });
20
+ return response;
21
+ }
22
+ //# sourceMappingURL=output-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-text.js","sourceRoot":"","sources":["../../src/lib/output-text.ts"],"names":[],"mappings":"AAEA,0GAA0G;AAC1G,MAAM,UAAU,iBAAiB,CAAC,MAAsC;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAqB,QAAW;IAC3D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE;QAC7C,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzC,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Stream } from '../core/streaming.js';
2
+ import type { Response, ResponseStreamEvent } from '../types/responses.js';
3
+ /**
4
+ * Wraps a Responses SSE stream. Iterate it for typed events while it accumulates a
5
+ * snapshot, or just `await stream.finalResponse()`.
6
+ */
7
+ export declare class ResponseStream implements AsyncIterable<ResponseStreamEvent> {
8
+ private readonly streamPromise;
9
+ private snapshot;
10
+ private final;
11
+ private text;
12
+ private started;
13
+ private readonly done;
14
+ private resolveDone;
15
+ private rejectDone;
16
+ private stream;
17
+ constructor(streamPromise: PromiseLike<Stream<ResponseStreamEvent>>);
18
+ /** Text accumulated from `response.output_text.delta` events so far. */
19
+ get outputText(): string;
20
+ /** The latest accumulated response snapshot (undefined before `response.created`). */
21
+ currentResponse(): Response | undefined;
22
+ /** Stops the stream and cancels the HTTP request. */
23
+ abort(): void;
24
+ [Symbol.asyncIterator](): AsyncGenerator<ResponseStreamEvent>;
25
+ /** Waits for the stream to finish and returns the final response (consuming it if nobody else is). */
26
+ finalResponse(): Promise<Response>;
27
+ /** Waits for the stream to finish and returns the concatenated output text. */
28
+ finalText(): Promise<string>;
29
+ private accumulate;
30
+ }