@cogitator-ai/openai-compat 21.1.13 → 21.2.1

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 (44) hide show
  1. package/README.md +183 -46
  2. package/dist/client/openai-adapter.d.ts +35 -7
  3. package/dist/client/openai-adapter.d.ts.map +1 -1
  4. package/dist/client/openai-adapter.js +139 -57
  5. package/dist/client/openai-adapter.js.map +1 -1
  6. package/dist/client/thread-manager.d.ts +4 -3
  7. package/dist/client/thread-manager.d.ts.map +1 -1
  8. package/dist/client/thread-manager.js +7 -5
  9. package/dist/client/thread-manager.js.map +1 -1
  10. package/dist/index.d.ts +7 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/server/agents/agent-turn.d.ts +134 -0
  15. package/dist/server/agents/agent-turn.d.ts.map +1 -0
  16. package/dist/server/agents/agent-turn.js +340 -0
  17. package/dist/server/agents/agent-turn.js.map +1 -0
  18. package/dist/server/agents/shared.d.ts +62 -0
  19. package/dist/server/agents/shared.d.ts.map +1 -0
  20. package/dist/server/agents/shared.js +136 -0
  21. package/dist/server/agents/shared.js.map +1 -0
  22. package/dist/server/api-server.d.ts +50 -10
  23. package/dist/server/api-server.d.ts.map +1 -1
  24. package/dist/server/api-server.js +61 -24
  25. package/dist/server/api-server.js.map +1 -1
  26. package/dist/server/routes/chat-completions.d.ts +15 -0
  27. package/dist/server/routes/chat-completions.d.ts.map +1 -0
  28. package/dist/server/routes/chat-completions.js +305 -0
  29. package/dist/server/routes/chat-completions.js.map +1 -0
  30. package/dist/server/routes/models.d.ts +8 -0
  31. package/dist/server/routes/models.d.ts.map +1 -0
  32. package/dist/server/routes/models.js +27 -0
  33. package/dist/server/routes/models.js.map +1 -0
  34. package/dist/server/routes/responses.d.ts +229 -0
  35. package/dist/server/routes/responses.d.ts.map +1 -0
  36. package/dist/server/routes/responses.js +484 -0
  37. package/dist/server/routes/responses.js.map +1 -0
  38. package/dist/server/routes/runs.d.ts +5 -1
  39. package/dist/server/routes/runs.d.ts.map +1 -1
  40. package/dist/server/routes/runs.js +16 -6
  41. package/dist/server/routes/runs.js.map +1 -1
  42. package/dist/types/openai-types.d.ts +3 -1
  43. package/dist/types/openai-types.d.ts.map +1 -1
  44. package/package.json +11 -7
@@ -0,0 +1,484 @@
1
+ /**
2
+ * Responses API (`/v1/responses`) over registered Cogitator agents: the request's `model` names
3
+ * the agent. Responses are kept in memory, so `previous_response_id` carries a conversation on.
4
+ */
5
+ import { nanoid } from 'nanoid';
6
+ import { z } from 'zod';
7
+ import { InvalidRequestError } from '../../client/errors.js';
8
+ import { toAgentResponseFormat } from '../../client/openai-adapter.js';
9
+ import { assertToolChoice, } from '../agents/agent-turn.js';
10
+ import { abortOnDisconnect, clientErrorMessage, openEventStream, parseRequestBody, responseUsage, sendModelNotFound, sendTurnError, toImageInput, } from '../agents/shared.js';
11
+ import { paginate, parseLimit, parseOrder, sendInvalidRequest, sendNotFound } from './shared.js';
12
+ const inputText = z.looseObject({ type: z.literal('input_text'), text: z.string() });
13
+ const inputImage = z.looseObject({
14
+ type: z.literal('input_image'),
15
+ image_url: z.string().min(1, 'input_image needs an image_url (file_id is not supported)'),
16
+ detail: z.enum(['low', 'high', 'auto']).optional(),
17
+ });
18
+ const outputText = z.looseObject({ type: z.literal('output_text'), text: z.string() });
19
+ const refusal = z.looseObject({ type: z.literal('refusal'), refusal: z.string() });
20
+ const contentPart = z.discriminatedUnion('type', [inputText, inputImage, outputText, refusal]);
21
+ const messageItem = z.looseObject({
22
+ type: z.literal('message').optional(),
23
+ id: z.string().optional(),
24
+ role: z.enum(['user', 'assistant', 'system', 'developer']),
25
+ content: z.union([z.string(), z.array(contentPart)]),
26
+ });
27
+ const functionCallItem = z.looseObject({
28
+ type: z.literal('function_call'),
29
+ id: z.string().optional(),
30
+ call_id: z.string().min(1),
31
+ name: z.string().min(1),
32
+ arguments: z.string(),
33
+ });
34
+ const functionCallOutputItem = z.looseObject({
35
+ type: z.literal('function_call_output'),
36
+ id: z.string().optional(),
37
+ call_id: z.string().min(1),
38
+ output: z.union([z.string(), z.array(z.discriminatedUnion('type', [inputText, outputText]))]),
39
+ });
40
+ const inputItem = z.union([functionCallItem, functionCallOutputItem, messageItem]);
41
+ const functionTool = z.looseObject({
42
+ type: z.literal('function'),
43
+ name: z.string().regex(/^[a-zA-Z0-9_-]{1,64}$/, 'must match ^[a-zA-Z0-9_-]{1,64}$'),
44
+ description: z.string().nullish(),
45
+ parameters: z.record(z.string(), z.unknown()).nullish(),
46
+ strict: z.boolean().nullish(),
47
+ });
48
+ const textFormat = z.discriminatedUnion('type', [
49
+ z.looseObject({ type: z.literal('text') }),
50
+ z.looseObject({ type: z.literal('json_object') }),
51
+ z.looseObject({
52
+ type: z.literal('json_schema'),
53
+ name: z.string().min(1),
54
+ description: z.string().optional(),
55
+ schema: z.record(z.string(), z.unknown()),
56
+ strict: z.boolean().nullish(),
57
+ }),
58
+ ]);
59
+ const requestSchema = z.looseObject({
60
+ model: z.string().min(1),
61
+ input: z.union([z.string(), z.array(inputItem)]),
62
+ instructions: z.string().nullish(),
63
+ previous_response_id: z.string().nullish(),
64
+ tools: z.array(functionTool).optional(),
65
+ tool_choice: z
66
+ .union([
67
+ z.enum(['none', 'auto', 'required']),
68
+ z.looseObject({ type: z.literal('function'), name: z.string().min(1) }),
69
+ ])
70
+ .optional(),
71
+ parallel_tool_calls: z.boolean().nullish(),
72
+ temperature: z.number().min(0).max(2).nullish(),
73
+ top_p: z.number().min(0).max(1).nullish(),
74
+ max_output_tokens: z.number().int().positive().nullish(),
75
+ store: z.boolean().nullish(),
76
+ metadata: z.record(z.string(), z.string()).nullish(),
77
+ stream: z.boolean().nullish(),
78
+ text: z.looseObject({ format: textFormat.optional() }).nullish(),
79
+ background: z.literal(false, { error: 'background responses are not supported' }).nullish(),
80
+ });
81
+ /** Responses kept in memory, the oldest dropped first beyond `maxSize`. */
82
+ export class ResponseStore {
83
+ maxSize;
84
+ responses = new Map();
85
+ constructor(maxSize = 1000) {
86
+ this.maxSize = maxSize;
87
+ }
88
+ get(id) {
89
+ return this.responses.get(id);
90
+ }
91
+ set(id, stored) {
92
+ this.responses.delete(id);
93
+ this.responses.set(id, stored);
94
+ while (this.responses.size > this.maxSize) {
95
+ const oldest = this.responses.keys().next().value;
96
+ if (oldest === undefined)
97
+ break;
98
+ this.responses.delete(oldest);
99
+ }
100
+ }
101
+ delete(id) {
102
+ return this.responses.delete(id);
103
+ }
104
+ }
105
+ function partsText(parts) {
106
+ if (typeof parts === 'string')
107
+ return parts;
108
+ return parts.map((part) => part.text ?? part.refusal ?? '').join('');
109
+ }
110
+ function toConversationItems(input) {
111
+ if (typeof input === 'string')
112
+ return [{ kind: 'user', text: input, images: [] }];
113
+ return input.map((item) => {
114
+ if (item.type === 'function_call') {
115
+ return {
116
+ kind: 'function_call',
117
+ callId: item.call_id,
118
+ name: item.name,
119
+ arguments: item.arguments,
120
+ };
121
+ }
122
+ if (item.type === 'function_call_output') {
123
+ return { kind: 'function_call_output', callId: item.call_id, output: partsText(item.output) };
124
+ }
125
+ switch (item.role) {
126
+ case 'system':
127
+ case 'developer':
128
+ return { kind: 'system', text: partsText(item.content) };
129
+ case 'assistant':
130
+ return { kind: 'assistant', text: partsText(item.content) };
131
+ case 'user': {
132
+ if (typeof item.content === 'string')
133
+ return { kind: 'user', text: item.content, images: [] };
134
+ const text = item.content
135
+ .flatMap((part) => part.type === 'input_text' || part.type === 'output_text' ? [part.text] : [])
136
+ .join('\n');
137
+ const images = item.content.flatMap((part) => part.type === 'input_image' ? [toImageInput(part.image_url)] : []);
138
+ return { kind: 'user', text, images };
139
+ }
140
+ }
141
+ });
142
+ }
143
+ function toStoredInputItems(input) {
144
+ const items = typeof input === 'string' ? [{ type: 'message', role: 'user', content: input }] : input;
145
+ return items.map((item) => ({
146
+ ...item,
147
+ id: item.id ??
148
+ `${item.type === 'function_call' ? 'fc' : item.type === 'function_call_output' ? 'fco' : 'msg'}_${nanoid()}`,
149
+ }));
150
+ }
151
+ function toToolChoice(choice) {
152
+ if (choice === undefined)
153
+ return 'auto';
154
+ if (typeof choice === 'string')
155
+ return choice;
156
+ return { name: choice.name };
157
+ }
158
+ function toResponseFormat(format) {
159
+ if (!format)
160
+ return undefined;
161
+ if (format.type === 'json_schema') {
162
+ return toAgentResponseFormat({
163
+ type: 'json_schema',
164
+ json_schema: {
165
+ name: format.name,
166
+ schema: format.schema,
167
+ ...(format.description !== undefined && { description: format.description }),
168
+ },
169
+ });
170
+ }
171
+ return toAgentResponseFormat({ type: format.type });
172
+ }
173
+ /** What the turn added to the conversation, for the next response that builds on this one. */
174
+ function outputConversation(output) {
175
+ return output.flatMap((item) => {
176
+ if (item.type === 'function_call') {
177
+ return [
178
+ { kind: 'function_call', callId: item.call_id, name: item.name, arguments: item.arguments },
179
+ ];
180
+ }
181
+ const text = item.content
182
+ .map((part) => (part.type === 'output_text' ? part.text : part.refusal))
183
+ .join('');
184
+ return text ? [{ kind: 'assistant', text }] : [];
185
+ });
186
+ }
187
+ function finalStatus(result) {
188
+ if (result.finishReason === 'length') {
189
+ return { status: 'incomplete', incomplete: { reason: 'max_output_tokens' } };
190
+ }
191
+ if (result.finishReason === 'content_filter') {
192
+ return { status: 'incomplete', incomplete: { reason: 'content_filter' } };
193
+ }
194
+ return { status: 'completed', incomplete: null };
195
+ }
196
+ export function registerResponseRoutes(fastify, options) {
197
+ const { directory, runner, store, heartbeatMs, bodyLimit } = options;
198
+ fastify.post('/v1/responses', { bodyLimit }, async (request, reply) => {
199
+ let body;
200
+ let newItems;
201
+ try {
202
+ body = parseRequestBody(requestSchema, request.body);
203
+ newItems = toConversationItems(body.input);
204
+ }
205
+ catch (error) {
206
+ return sendTurnError(reply, error, 'response');
207
+ }
208
+ const agent = directory.get(body.model);
209
+ if (!agent)
210
+ return sendModelNotFound(reply, body.model);
211
+ let history = [];
212
+ if (body.previous_response_id) {
213
+ const previous = store.get(body.previous_response_id);
214
+ if (!previous) {
215
+ return sendInvalidRequest(reply, `Previous response with id '${body.previous_response_id}' not found.`, 'previous_response_id');
216
+ }
217
+ history = previous.conversation;
218
+ }
219
+ const conversation = [...history, ...newItems];
220
+ const items = [
221
+ ...(body.instructions ? [{ kind: 'system', text: body.instructions }] : []),
222
+ ...conversation,
223
+ ];
224
+ if (!items.some((item) => item.kind !== 'system')) {
225
+ return sendInvalidRequest(reply, 'input must contain a message', 'input');
226
+ }
227
+ const response = {
228
+ id: `resp_${nanoid()}`,
229
+ object: 'response',
230
+ created_at: Math.floor(Date.now() / 1000),
231
+ status: 'in_progress',
232
+ completed_at: null,
233
+ error: null,
234
+ incomplete_details: null,
235
+ instructions: body.instructions ?? null,
236
+ max_output_tokens: body.max_output_tokens ?? null,
237
+ model: body.model,
238
+ output: [],
239
+ parallel_tool_calls: body.parallel_tool_calls ?? true,
240
+ previous_response_id: body.previous_response_id ?? null,
241
+ reasoning: { effort: null, summary: null },
242
+ store: body.store ?? true,
243
+ temperature: body.temperature ?? null,
244
+ text: { format: body.text?.format ?? { type: 'text' } },
245
+ tool_choice: body.tool_choice ?? 'auto',
246
+ tools: body.tools ?? [],
247
+ top_p: body.top_p ?? null,
248
+ truncation: 'disabled',
249
+ usage: null,
250
+ user: null,
251
+ metadata: body.metadata ?? {},
252
+ };
253
+ const turn = (signal, onToken) => ({
254
+ agent,
255
+ items,
256
+ functions: (body.tools ?? []).map((tool) => ({
257
+ name: tool.name,
258
+ ...(tool.description != null && { description: tool.description }),
259
+ ...(tool.parameters != null && { parameters: tool.parameters }),
260
+ })),
261
+ toolChoice: toToolChoice(body.tool_choice),
262
+ ...(body.parallel_tool_calls != null && { parallelToolCalls: body.parallel_tool_calls }),
263
+ ...(body.temperature != null && { temperature: body.temperature }),
264
+ ...(body.top_p != null && { topP: body.top_p }),
265
+ ...(body.max_output_tokens != null && { maxTokens: body.max_output_tokens }),
266
+ ...(body.text?.format && { responseFormat: toResponseFormat(body.text.format) }),
267
+ signal,
268
+ ...(onToken && { onToken }),
269
+ });
270
+ const finish = (result, text, messageId, asRefusal) => {
271
+ const { status, incomplete } = finalStatus(result);
272
+ const output = [];
273
+ if (text || asRefusal) {
274
+ output.push({
275
+ type: 'message',
276
+ id: messageId,
277
+ status: status === 'incomplete' ? 'incomplete' : 'completed',
278
+ role: 'assistant',
279
+ content: [
280
+ asRefusal
281
+ ? { type: 'refusal', refusal: text }
282
+ : { type: 'output_text', text, annotations: [] },
283
+ ],
284
+ });
285
+ }
286
+ for (const call of result.functionCalls) {
287
+ output.push({
288
+ type: 'function_call',
289
+ id: `fc_${nanoid()}`,
290
+ call_id: call.callId,
291
+ name: call.name,
292
+ arguments: call.arguments,
293
+ status: 'completed',
294
+ });
295
+ }
296
+ response.status = status;
297
+ response.incomplete_details = incomplete;
298
+ response.completed_at = status === 'completed' ? Math.floor(Date.now() / 1000) : null;
299
+ response.output = output;
300
+ response.usage = responseUsage(result.usage);
301
+ if (response.store) {
302
+ store.set(response.id, {
303
+ response,
304
+ conversation: [...conversation, ...outputConversation(output)],
305
+ inputItems: toStoredInputItems(body.input),
306
+ });
307
+ }
308
+ };
309
+ try {
310
+ const check = turn(new AbortController().signal);
311
+ assertToolChoice(check.agent, check.functions, check.toolChoice);
312
+ }
313
+ catch (error) {
314
+ return sendTurnError(reply, error, 'request');
315
+ }
316
+ if (!body.stream) {
317
+ const signal = abortOnDisconnect(reply);
318
+ try {
319
+ const result = await runner.run(turn(signal));
320
+ finish(result, result.text, `msg_${nanoid()}`, result.refusal);
321
+ }
322
+ catch (error) {
323
+ return sendTurnError(reply, error, `Response ${response.id}`);
324
+ }
325
+ return reply.send(response);
326
+ }
327
+ const stream = openEventStream(reply, heartbeatMs);
328
+ let sequence = 0;
329
+ const emit = (type, data) => stream.write(`event: ${type}\ndata: ${JSON.stringify({ type, sequence_number: sequence++, ...data })}\n\n`);
330
+ const messageId = `msg_${nanoid()}`;
331
+ let streamed = '';
332
+ let messageOpen = false;
333
+ const openMessage = () => {
334
+ if (messageOpen)
335
+ return;
336
+ messageOpen = true;
337
+ emit('response.output_item.added', {
338
+ output_index: 0,
339
+ item: {
340
+ type: 'message',
341
+ id: messageId,
342
+ status: 'in_progress',
343
+ role: 'assistant',
344
+ content: [],
345
+ },
346
+ });
347
+ emit('response.content_part.added', {
348
+ item_id: messageId,
349
+ output_index: 0,
350
+ content_index: 0,
351
+ part: { type: 'output_text', text: '', annotations: [] },
352
+ });
353
+ };
354
+ const delta = (text) => {
355
+ openMessage();
356
+ streamed += text;
357
+ emit('response.output_text.delta', {
358
+ item_id: messageId,
359
+ output_index: 0,
360
+ content_index: 0,
361
+ delta: text,
362
+ logprobs: [],
363
+ });
364
+ };
365
+ emit('response.created', { response: { ...response } });
366
+ emit('response.in_progress', { response: { ...response } });
367
+ try {
368
+ const result = await runner.run(turn(stream.signal, delta));
369
+ const asRefusal = result.refusal && !messageOpen;
370
+ if (!asRefusal && !streamed && result.text)
371
+ delta(result.text);
372
+ finish(result, asRefusal ? result.text : streamed, messageId, asRefusal);
373
+ response.output.forEach((item, outputIndex) => {
374
+ if (item.type === 'message') {
375
+ const part = item.content[0];
376
+ if (part.type === 'refusal') {
377
+ emit('response.output_item.added', {
378
+ output_index: outputIndex,
379
+ item: { ...item, status: 'in_progress', content: [] },
380
+ });
381
+ emit('response.content_part.added', {
382
+ item_id: item.id,
383
+ output_index: outputIndex,
384
+ content_index: 0,
385
+ part: { type: 'refusal', refusal: '' },
386
+ });
387
+ emit('response.refusal.delta', {
388
+ item_id: item.id,
389
+ output_index: outputIndex,
390
+ content_index: 0,
391
+ delta: part.refusal,
392
+ });
393
+ emit('response.refusal.done', {
394
+ item_id: item.id,
395
+ output_index: outputIndex,
396
+ content_index: 0,
397
+ refusal: part.refusal,
398
+ });
399
+ }
400
+ else {
401
+ openMessage();
402
+ emit('response.output_text.done', {
403
+ item_id: item.id,
404
+ output_index: outputIndex,
405
+ content_index: 0,
406
+ text: part.text,
407
+ logprobs: [],
408
+ });
409
+ }
410
+ emit('response.content_part.done', {
411
+ item_id: item.id,
412
+ output_index: outputIndex,
413
+ content_index: 0,
414
+ part,
415
+ });
416
+ emit('response.output_item.done', { output_index: outputIndex, item });
417
+ return;
418
+ }
419
+ emit('response.output_item.added', {
420
+ output_index: outputIndex,
421
+ item: { ...item, arguments: '', status: 'in_progress' },
422
+ });
423
+ emit('response.function_call_arguments.delta', {
424
+ item_id: item.id,
425
+ output_index: outputIndex,
426
+ delta: item.arguments,
427
+ });
428
+ emit('response.function_call_arguments.done', {
429
+ item_id: item.id,
430
+ output_index: outputIndex,
431
+ name: item.name,
432
+ arguments: item.arguments,
433
+ });
434
+ emit('response.output_item.done', { output_index: outputIndex, item });
435
+ });
436
+ emit(response.status === 'incomplete' ? 'response.incomplete' : 'response.completed', {
437
+ response,
438
+ });
439
+ }
440
+ catch (error) {
441
+ if (!stream.signal.aborted) {
442
+ response.status = 'failed';
443
+ response.error = {
444
+ code: error instanceof InvalidRequestError ? 'invalid_request' : 'server_error',
445
+ message: clientErrorMessage(error, `Response ${response.id}`),
446
+ };
447
+ emit('response.failed', { response });
448
+ }
449
+ }
450
+ finally {
451
+ stream.end();
452
+ }
453
+ return reply;
454
+ });
455
+ fastify.get('/v1/responses/:id', async (request, reply) => {
456
+ const stored = store.get(request.params.id);
457
+ if (!stored)
458
+ return sendNotFound(reply, 'response', request.params.id);
459
+ return reply.send(stored.response);
460
+ });
461
+ fastify.delete('/v1/responses/:id', async (request, reply) => {
462
+ if (!store.delete(request.params.id)) {
463
+ return sendNotFound(reply, 'response', request.params.id);
464
+ }
465
+ return reply.send({ id: request.params.id, object: 'response', deleted: true });
466
+ });
467
+ fastify.get('/v1/responses/:id/input_items', async (request, reply) => {
468
+ const stored = store.get(request.params.id);
469
+ if (!stored)
470
+ return sendNotFound(reply, 'response', request.params.id);
471
+ const limit = parseLimit(request.query.limit);
472
+ if (limit === null)
473
+ return sendInvalidRequest(reply, 'limit must be between 1 and 100', 'limit');
474
+ const order = parseOrder(request.query.order);
475
+ if (order === null)
476
+ return sendInvalidRequest(reply, "order must be 'asc' or 'desc'", 'order');
477
+ const ordered = order === 'asc' ? stored.inputItems : [...stored.inputItems].reverse();
478
+ return reply.send({
479
+ object: 'list',
480
+ ...paginate(ordered, { limit, after: request.query.after, before: request.query.before }),
481
+ });
482
+ });
483
+ }
484
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/server/routes/responses.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,9 @@
5
5
  */
6
6
  import type { FastifyInstance } from 'fastify';
7
7
  import type { OpenAIAdapter } from '../../client/openai-adapter.js';
8
- export declare function registerRunRoutes(fastify: FastifyInstance, adapter: OpenAIAdapter): void;
8
+ export interface RunRouteOptions {
9
+ /** How often an open run stream writes a heartbeat comment; `0` for never. Default: 5000 */
10
+ heartbeatMs?: number;
11
+ }
12
+ export declare function registerRunRoutes(fastify: FastifyInstance, adapter: OpenAIAdapter, options?: RunRouteOptions): void;
9
13
  //# sourceMappingURL=runs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAWjE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,QAyIjF"}
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAWjE,MAAM,WAAW,eAAe;IAC9B,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,eAAoB,QA2I9B"}
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * Implements OpenAI Runs API endpoints.
5
5
  */
6
+ import { encodeHeartbeat, resolveSseHeartbeatMs, startHeartbeat, } from '@cogitator-ai/server-shared';
6
7
  import { InvalidRequestError } from '../../client/errors.js';
7
8
  import { paginate, parseLimit, parseOrder, sendInvalidRequest, sendNotFound } from './shared.js';
8
- export function registerRunRoutes(fastify, adapter) {
9
+ export function registerRunRoutes(fastify, adapter, options = {}) {
10
+ const heartbeatMs = resolveSseHeartbeatMs(options.heartbeatMs);
9
11
  fastify.post('/v1/threads/:thread_id/runs', async (request, reply) => {
10
12
  const thread = await adapter.getThread(request.params.thread_id);
11
13
  if (!thread) {
@@ -22,7 +24,7 @@ export function registerRunRoutes(fastify, adapter) {
22
24
  return sendRequestError(reply, error);
23
25
  }
24
26
  if (request.body.stream) {
25
- return streamRun(reply, adapter, run.id, 0);
27
+ return streamRun(reply, adapter, run.id, 0, heartbeatMs);
26
28
  }
27
29
  return reply.status(201).send(run);
28
30
  });
@@ -46,7 +48,7 @@ export function registerRunRoutes(fastify, adapter) {
46
48
  return sendRequestError(reply, error);
47
49
  }
48
50
  if (request.body.stream) {
49
- return streamRun(reply, adapter, run.id, 0);
51
+ return streamRun(reply, adapter, run.id, 0, heartbeatMs);
50
52
  }
51
53
  return reply.status(201).send(run);
52
54
  });
@@ -104,7 +106,7 @@ export function registerRunRoutes(fastify, adapter) {
104
106
  return sendNotFound(reply, 'run', request.params.run_id);
105
107
  }
106
108
  if (request.body?.stream) {
107
- return streamRun(reply, adapter, run.id, cursor);
109
+ return streamRun(reply, adapter, run.id, cursor, heartbeatMs);
108
110
  }
109
111
  return reply.send(run);
110
112
  });
@@ -121,9 +123,10 @@ function sendRequestError(reply, error) {
121
123
  }
122
124
  /**
123
125
  * Stream run events as OpenAI-style server-sent events until the run
124
- * finishes or pauses for tool outputs.
126
+ * finishes or pauses for tool outputs, with a heartbeat comment while the
127
+ * run is silent so idle timeouts of proxies do not cut it.
125
128
  */
126
- async function streamRun(reply, adapter, runId, fromIndex) {
129
+ async function streamRun(reply, adapter, runId, fromIndex, heartbeatMs) {
127
130
  reply.hijack();
128
131
  const raw = reply.raw;
129
132
  raw.writeHead(200, {
@@ -136,6 +139,12 @@ async function streamRun(reply, adapter, runId, fromIndex) {
136
139
  raw.on('close', () => {
137
140
  closed = true;
138
141
  });
142
+ const stopHeartbeat = startHeartbeat(() => {
143
+ if (closed || raw.writableEnded)
144
+ return false;
145
+ raw.write(encodeHeartbeat());
146
+ return true;
147
+ }, heartbeatMs);
139
148
  const events = adapter.streamRunEvents(runId, fromIndex);
140
149
  try {
141
150
  for await (const { event, data } of events) {
@@ -146,6 +155,7 @@ async function streamRun(reply, adapter, runId, fromIndex) {
146
155
  }
147
156
  }
148
157
  finally {
158
+ stopHeartbeat();
149
159
  await events.return(undefined);
150
160
  if (!raw.writableEnded)
151
161
  raw.end();
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"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"}