@cogitator-ai/openai-compat 19.0.16 → 20.0.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 (42) hide show
  1. package/README.md +74 -50
  2. package/dist/client/openai-adapter.d.ts +74 -37
  3. package/dist/client/openai-adapter.d.ts.map +1 -1
  4. package/dist/client/openai-adapter.js +416 -137
  5. package/dist/client/openai-adapter.js.map +1 -1
  6. package/dist/client/storage.d.ts +4 -0
  7. package/dist/client/storage.d.ts.map +1 -1
  8. package/dist/client/storage.js +80 -60
  9. package/dist/client/storage.js.map +1 -1
  10. package/dist/client/thread-manager.d.ts +45 -31
  11. package/dist/client/thread-manager.d.ts.map +1 -1
  12. package/dist/client/thread-manager.js +157 -115
  13. package/dist/client/thread-manager.js.map +1 -1
  14. package/dist/index.d.ts +3 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/server/api-server.d.ts +23 -1
  19. package/dist/server/api-server.d.ts.map +1 -1
  20. package/dist/server/api-server.js +42 -23
  21. package/dist/server/api-server.js.map +1 -1
  22. package/dist/server/middleware/auth.d.ts +2 -0
  23. package/dist/server/middleware/auth.d.ts.map +1 -1
  24. package/dist/server/middleware/auth.js +25 -2
  25. package/dist/server/middleware/auth.js.map +1 -1
  26. package/dist/server/routes/assistants.d.ts.map +1 -1
  27. package/dist/server/routes/assistants.js +16 -26
  28. package/dist/server/routes/assistants.js.map +1 -1
  29. package/dist/server/routes/files.d.ts.map +1 -1
  30. package/dist/server/routes/files.js +60 -56
  31. package/dist/server/routes/files.js.map +1 -1
  32. package/dist/server/routes/runs.d.ts.map +1 -1
  33. package/dist/server/routes/runs.js +102 -105
  34. package/dist/server/routes/runs.js.map +1 -1
  35. package/dist/server/routes/shared.d.ts +27 -0
  36. package/dist/server/routes/shared.d.ts.map +1 -0
  37. package/dist/server/routes/shared.js +54 -0
  38. package/dist/server/routes/shared.js.map +1 -0
  39. package/dist/server/routes/threads.d.ts.map +1 -1
  40. package/dist/server/routes/threads.js +29 -16
  41. package/dist/server/routes/threads.js.map +1 -1
  42. package/package.json +18 -6
@@ -3,148 +3,145 @@
3
3
  *
4
4
  * Implements OpenAI Runs API endpoints.
5
5
  */
6
+ import { paginate, parseLimit, parseOrder, sendInvalidRequest, sendNotFound } from './shared.js';
6
7
  export function registerRunRoutes(fastify, adapter) {
7
8
  fastify.post('/v1/threads/:thread_id/runs', async (request, reply) => {
8
9
  const thread = await adapter.getThread(request.params.thread_id);
9
10
  if (!thread) {
10
- return reply.status(404).send({
11
- error: {
12
- message: `No thread found with id '${request.params.thread_id}'`,
13
- type: 'invalid_request_error',
14
- code: 'not_found',
15
- },
16
- });
11
+ return sendNotFound(reply, 'thread', request.params.thread_id);
17
12
  }
13
+ if (!request.body?.assistant_id) {
14
+ return sendInvalidRequest(reply, 'assistant_id is required', 'assistant_id');
15
+ }
16
+ let run;
18
17
  try {
19
- const run = await adapter.createRun(request.params.thread_id, request.body);
20
- if (request.body.stream) {
21
- return handleStreamingRun(reply, adapter, request.params.thread_id, run.id);
22
- }
23
- return reply.status(201).send(run);
18
+ run = await adapter.createRun(request.params.thread_id, request.body);
24
19
  }
25
20
  catch (error) {
26
- return reply.status(400).send({
27
- error: {
28
- message: error instanceof Error ? error.message : 'Failed to create run',
29
- type: 'invalid_request_error',
30
- code: 'invalid_request',
31
- },
32
- });
21
+ return sendInvalidRequest(reply, errorMessage(error, 'Failed to create run'));
22
+ }
23
+ if (request.body.stream) {
24
+ return streamRun(reply, adapter, run.id, 0);
33
25
  }
26
+ return reply.status(201).send(run);
34
27
  });
35
28
  fastify.post('/v1/threads/runs', async (request, reply) => {
36
- const thread = await adapter.createThread();
37
- if (request.body.thread?.messages) {
38
- for (const msg of request.body.thread.messages) {
39
- await adapter.addMessage(thread.id, msg);
40
- }
29
+ if (!request.body?.assistant_id) {
30
+ return sendInvalidRequest(reply, 'assistant_id is required', 'assistant_id');
31
+ }
32
+ if (!(await adapter.getAssistant(request.body.assistant_id))) {
33
+ return sendInvalidRequest(reply, `Assistant ${request.body.assistant_id} not found`);
34
+ }
35
+ const thread = await adapter.createThread(request.body.thread?.metadata);
36
+ for (const msg of request.body.thread?.messages ?? []) {
37
+ await adapter.addMessage(thread.id, msg);
41
38
  }
39
+ let run;
42
40
  try {
43
- const run = await adapter.createRun(thread.id, request.body);
44
- if (request.body.stream) {
45
- return handleStreamingRun(reply, adapter, thread.id, run.id);
46
- }
47
- return reply.status(201).send(run);
41
+ run = await adapter.createRun(thread.id, request.body);
48
42
  }
49
43
  catch (error) {
50
- return reply.status(400).send({
51
- error: {
52
- message: error instanceof Error ? error.message : 'Failed to create run',
53
- type: 'invalid_request_error',
54
- code: 'invalid_request',
55
- },
56
- });
44
+ await adapter.deleteThread(thread.id);
45
+ return sendInvalidRequest(reply, errorMessage(error, 'Failed to create run'));
57
46
  }
47
+ if (request.body.stream) {
48
+ return streamRun(reply, adapter, run.id, 0);
49
+ }
50
+ return reply.status(201).send(run);
51
+ });
52
+ fastify.get('/v1/threads/:thread_id/runs', async (request, reply) => {
53
+ const thread = await adapter.getThread(request.params.thread_id);
54
+ if (!thread) {
55
+ return sendNotFound(reply, 'thread', request.params.thread_id);
56
+ }
57
+ const limit = parseLimit(request.query.limit);
58
+ if (limit === null)
59
+ return sendInvalidRequest(reply, 'limit must be between 1 and 100', 'limit');
60
+ const order = parseOrder(request.query.order);
61
+ if (order === null)
62
+ return sendInvalidRequest(reply, "order must be 'asc' or 'desc'", 'order');
63
+ const runs = adapter.listRuns(request.params.thread_id);
64
+ const ordered = order === 'asc' ? runs.reverse() : runs;
65
+ const page = paginate(ordered, {
66
+ limit,
67
+ after: request.query.after,
68
+ before: request.query.before,
69
+ });
70
+ const response = { object: 'list', ...page };
71
+ return reply.send(response);
58
72
  });
59
73
  fastify.get('/v1/threads/:thread_id/runs/:run_id', async (request, reply) => {
60
74
  const run = adapter.getRun(request.params.thread_id, request.params.run_id);
61
75
  if (!run) {
62
- return reply.status(404).send({
63
- error: {
64
- message: `No run found with id '${request.params.run_id}'`,
65
- type: 'invalid_request_error',
66
- code: 'not_found',
67
- },
68
- });
76
+ return sendNotFound(reply, 'run', request.params.run_id);
69
77
  }
70
78
  return reply.send(run);
71
79
  });
72
80
  fastify.post('/v1/threads/:thread_id/runs/:run_id/cancel', async (request, reply) => {
73
- const run = adapter.cancelRun(request.params.thread_id, request.params.run_id);
81
+ let run;
82
+ try {
83
+ run = adapter.cancelRun(request.params.thread_id, request.params.run_id);
84
+ }
85
+ catch (error) {
86
+ return sendInvalidRequest(reply, errorMessage(error, 'Failed to cancel run'));
87
+ }
74
88
  if (!run) {
75
- return reply.status(404).send({
76
- error: {
77
- message: `No run found with id '${request.params.run_id}'`,
78
- type: 'invalid_request_error',
79
- code: 'not_found',
80
- },
81
- });
89
+ return sendNotFound(reply, 'run', request.params.run_id);
82
90
  }
83
91
  return reply.send(run);
84
92
  });
85
93
  fastify.post('/v1/threads/:thread_id/runs/:run_id/submit_tool_outputs', async (request, reply) => {
94
+ const cursor = adapter.getRunEventCursor(request.params.run_id);
95
+ let run;
86
96
  try {
87
- const run = await adapter.submitToolOutputs(request.params.thread_id, request.params.run_id, request.body);
88
- if (!run) {
89
- return reply.status(404).send({
90
- error: {
91
- message: `No run found with id '${request.params.run_id}'`,
92
- type: 'invalid_request_error',
93
- code: 'not_found',
94
- },
95
- });
96
- }
97
- if (request.body.stream) {
98
- return handleStreamingRun(reply, adapter, request.params.thread_id, run.id);
99
- }
100
- return reply.send(run);
97
+ run = await adapter.submitToolOutputs(request.params.thread_id, request.params.run_id, request.body ?? { tool_outputs: [] });
101
98
  }
102
99
  catch (error) {
103
- return reply.status(400).send({
104
- error: {
105
- message: error instanceof Error ? error.message : 'Failed to submit tool outputs',
106
- type: 'invalid_request_error',
107
- code: 'invalid_request',
108
- },
109
- });
100
+ return sendInvalidRequest(reply, errorMessage(error, 'Failed to submit tool outputs'));
101
+ }
102
+ if (!run) {
103
+ return sendNotFound(reply, 'run', request.params.run_id);
110
104
  }
105
+ if (request.body?.stream) {
106
+ return streamRun(reply, adapter, run.id, cursor);
107
+ }
108
+ return reply.send(run);
111
109
  });
112
110
  }
111
+ function errorMessage(error, fallback) {
112
+ return error instanceof Error ? error.message : fallback;
113
+ }
113
114
  /**
114
- * Handle streaming run response using EventEmitter for real-time token delivery
115
+ * Stream run events as OpenAI-style server-sent events until the run
116
+ * finishes or pauses for tool outputs.
115
117
  */
116
- function handleStreamingRun(reply, adapter, _threadId, runId) {
117
- reply.header('Content-Type', 'text/event-stream');
118
- reply.header('Cache-Control', 'no-cache');
119
- reply.header('Connection', 'keep-alive');
120
- reply.header('X-Accel-Buffering', 'no');
121
- const sendEvent = (event, data) => {
122
- const dataStr = event === 'done' ? data : JSON.stringify(data);
123
- reply.raw.write(`event: ${event}\n`);
124
- reply.raw.write(`data: ${dataStr}\n\n`);
125
- };
126
- const emitter = adapter.getStreamEmitter(runId);
127
- if (!emitter) {
128
- sendEvent('error', {
129
- error: { message: 'No stream available for this run', type: 'server_error' },
130
- });
131
- sendEvent('done', '[DONE]');
132
- reply.raw.end();
133
- return;
134
- }
135
- const eventHandler = (type, data) => {
136
- sendEvent(type, data);
137
- };
138
- const endHandler = () => {
139
- emitter.off('event', eventHandler);
140
- emitter.off('end', endHandler);
141
- reply.raw.end();
142
- };
143
- emitter.on('event', eventHandler);
144
- emitter.on('end', endHandler);
145
- reply.raw.on('close', () => {
146
- emitter.off('event', eventHandler);
147
- emitter.off('end', endHandler);
118
+ async function streamRun(reply, adapter, runId, fromIndex) {
119
+ reply.hijack();
120
+ const raw = reply.raw;
121
+ raw.writeHead(200, {
122
+ 'Content-Type': 'text/event-stream',
123
+ 'Cache-Control': 'no-cache',
124
+ Connection: 'keep-alive',
125
+ 'X-Accel-Buffering': 'no',
126
+ });
127
+ let closed = false;
128
+ raw.on('close', () => {
129
+ closed = true;
148
130
  });
131
+ const events = adapter.streamRunEvents(runId, fromIndex);
132
+ try {
133
+ for await (const { event, data } of events) {
134
+ if (closed || raw.writableEnded)
135
+ break;
136
+ const payload = typeof data === 'string' ? data : JSON.stringify(data);
137
+ raw.write(`event: ${event}\ndata: ${payload}\n\n`);
138
+ }
139
+ }
140
+ finally {
141
+ await events.return(undefined);
142
+ if (!raw.writableEnded)
143
+ raw.end();
144
+ }
145
+ return reply;
149
146
  }
150
147
  //# sourceMappingURL=runs.js.map
@@ -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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"}
@@ -0,0 +1,27 @@
1
+ import type { FastifyReply } from 'fastify';
2
+ export declare const MAX_LIST_LIMIT = 100;
3
+ export declare const DEFAULT_LIST_LIMIT = 20;
4
+ export declare function sendNotFound(reply: FastifyReply, resource: string, id: string): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
5
+ export declare function sendInvalidRequest(reply: FastifyReply, message: string, param?: string): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
6
+ /**
7
+ * Parse a `limit` query value (query strings arrive as strings). Returns
8
+ * null when the value is not an integer between 1 and MAX_LIST_LIMIT.
9
+ */
10
+ export declare function parseLimit(value: unknown): number | null;
11
+ export declare function parseOrder(value: unknown): 'asc' | 'desc' | null;
12
+ /**
13
+ * Apply OpenAI cursor pagination (`after` / `before` ids) to an ordered list.
14
+ */
15
+ export declare function paginate<T extends {
16
+ id: string;
17
+ }>(items: T[], options: {
18
+ limit: number;
19
+ after?: string;
20
+ before?: string;
21
+ }): {
22
+ data: T[];
23
+ has_more: boolean;
24
+ first_id?: string;
25
+ last_id?: string;
26
+ };
27
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/server/routes/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,4SAI7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,4SAItF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAKxD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC/C,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBvE"}
@@ -0,0 +1,54 @@
1
+ import { formatOpenAIError } from '../middleware/error-handler.js';
2
+ export const MAX_LIST_LIMIT = 100;
3
+ export const DEFAULT_LIST_LIMIT = 20;
4
+ export function sendNotFound(reply, resource, id) {
5
+ return reply
6
+ .status(404)
7
+ .send(formatOpenAIError('not_found', `No ${resource} found with id '${id}'`));
8
+ }
9
+ export function sendInvalidRequest(reply, message, param) {
10
+ return reply
11
+ .status(400)
12
+ .send(formatOpenAIError('invalid_request', message, 'invalid_request_error', param));
13
+ }
14
+ /**
15
+ * Parse a `limit` query value (query strings arrive as strings). Returns
16
+ * null when the value is not an integer between 1 and MAX_LIST_LIMIT.
17
+ */
18
+ export function parseLimit(value) {
19
+ if (value === undefined || value === '')
20
+ return DEFAULT_LIST_LIMIT;
21
+ const parsed = typeof value === 'number' ? value : Number(value);
22
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_LIST_LIMIT)
23
+ return null;
24
+ return parsed;
25
+ }
26
+ export function parseOrder(value) {
27
+ if (value === undefined || value === '')
28
+ return 'desc';
29
+ return value === 'asc' || value === 'desc' ? value : null;
30
+ }
31
+ /**
32
+ * Apply OpenAI cursor pagination (`after` / `before` ids) to an ordered list.
33
+ */
34
+ export function paginate(items, options) {
35
+ let list = items;
36
+ if (options.after) {
37
+ const idx = list.findIndex((item) => item.id === options.after);
38
+ if (idx !== -1)
39
+ list = list.slice(idx + 1);
40
+ }
41
+ if (options.before) {
42
+ const idx = list.findIndex((item) => item.id === options.before);
43
+ if (idx !== -1)
44
+ list = list.slice(0, idx);
45
+ }
46
+ const data = list.slice(0, options.limit);
47
+ return {
48
+ data,
49
+ has_more: list.length > options.limit,
50
+ first_id: data[0]?.id,
51
+ last_id: data[data.length - 1]?.id,
52
+ };
53
+ }
54
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/server/routes/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,QAAgB,EAAE,EAAU;IAC5E,OAAO,KAAK;SACT,MAAM,CAAC,GAAG,CAAC;SACX,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,MAAM,QAAQ,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,OAAe,EAAE,KAAc;IACrF,OAAO,KAAK;SACT,MAAM,CAAC,GAAG,CAAC;SACX,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,kBAAkB,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,cAAc;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IACvD,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAU,EACV,OAA2D;IAE3D,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK;QACrC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE;KACnC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/server/routes/threads.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAQjE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,QAkMpF"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/server/routes/threads.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAmBjE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,QAiMpF"}
@@ -3,16 +3,27 @@
3
3
  *
4
4
  * Implements OpenAI Threads API endpoints.
5
5
  */
6
+ import { parseLimit, parseOrder, sendInvalidRequest } from './shared.js';
7
+ function validateMessage(message) {
8
+ if (!message || (message.role !== 'user' && message.role !== 'assistant')) {
9
+ return "role must be 'user' or 'assistant'";
10
+ }
11
+ if (typeof message.content !== 'string' && !Array.isArray(message.content)) {
12
+ return 'content must be a string or an array of content parts';
13
+ }
14
+ return null;
15
+ }
6
16
  export function registerThreadRoutes(fastify, adapter) {
7
17
  fastify.post('/v1/threads', async (request, reply) => {
18
+ const messages = request.body?.messages ?? [];
19
+ for (const msg of messages) {
20
+ const problem = validateMessage(msg);
21
+ if (problem)
22
+ return sendInvalidRequest(reply, problem, 'messages');
23
+ }
8
24
  const thread = await adapter.createThread(request.body?.metadata);
9
- if (request.body?.messages) {
10
- for (const msg of request.body.messages) {
11
- const content = typeof msg.content === 'string'
12
- ? msg.content
13
- : msg.content.map((c) => (c.type === 'text' ? c.text : '')).join('');
14
- await adapter.addMessage(thread.id, { role: msg.role, content, metadata: msg.metadata });
15
- }
25
+ for (const msg of messages) {
26
+ await adapter.addMessage(thread.id, msg);
16
27
  }
17
28
  return reply.status(201).send(thread);
18
29
  });
@@ -72,14 +83,10 @@ export function registerThreadRoutes(fastify, adapter) {
72
83
  },
73
84
  });
74
85
  }
75
- const content = typeof request.body.content === 'string'
76
- ? request.body.content
77
- : request.body.content.map((c) => (c.type === 'text' ? c.text : '')).join('');
78
- const message = await adapter.addMessage(request.params.thread_id, {
79
- role: request.body.role,
80
- content,
81
- metadata: request.body.metadata,
82
- });
86
+ const problem = validateMessage(request.body);
87
+ if (problem)
88
+ return sendInvalidRequest(reply, problem);
89
+ const message = await adapter.addMessage(request.params.thread_id, request.body);
83
90
  if (!message) {
84
91
  return reply.status(500).send({
85
92
  error: {
@@ -102,7 +109,13 @@ export function registerThreadRoutes(fastify, adapter) {
102
109
  },
103
110
  });
104
111
  }
105
- const { limit = 20, order = 'desc', after, before, run_id } = request.query;
112
+ const limit = parseLimit(request.query.limit);
113
+ if (limit === null)
114
+ return sendInvalidRequest(reply, 'limit must be between 1 and 100', 'limit');
115
+ const order = parseOrder(request.query.order);
116
+ if (order === null)
117
+ return sendInvalidRequest(reply, "order must be 'asc' or 'desc'", 'order');
118
+ const { after, before, run_id } = request.query;
106
119
  const messages = await adapter.listMessages(request.params.thread_id, {
107
120
  limit: limit + 1,
108
121
  order,
@@ -1 +1 @@
1
- {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/server/routes/threads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../src/server/routes/threads.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cogitator-ai/openai-compat",
3
- "version": "19.0.16",
3
+ "version": "20.0.0",
4
4
  "description": "OpenAI Assistants API compatibility layer for Cogitator",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,18 +19,30 @@
19
19
  "@fastify/multipart": "^9.3.0",
20
20
  "fastify": "^5.7.4",
21
21
  "nanoid": "^5.1.5",
22
- "@cogitator-ai/core": "0.19.3",
23
- "@cogitator-ai/types": "0.22.2"
22
+ "zod": "^4.3.6",
23
+ "@cogitator-ai/core": "0.20.0",
24
+ "@cogitator-ai/types": "0.23.0"
24
25
  },
25
26
  "devDependencies": {
26
27
  "@types/busboy": "^1.5.4",
27
28
  "@types/node": "^25.0.10",
29
+ "openai": "^6.22.0",
28
30
  "typescript": "^5.3.0",
29
31
  "vitest": "^4.0.18"
30
32
  },
31
33
  "peerDependencies": {
32
- "@cogitator-ai/types": "0.22.2",
33
- "@cogitator-ai/core": "0.19.3"
34
+ "@cogitator-ai/core": ">=0.20.0",
35
+ "@cogitator-ai/types": ">=0.23.0",
36
+ "ioredis": "^5.0.0",
37
+ "pg": "^8.0.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "ioredis": {
41
+ "optional": true
42
+ },
43
+ "pg": {
44
+ "optional": true
45
+ }
34
46
  },
35
47
  "engines": {
36
48
  "node": ">=20.0.0"
@@ -46,7 +58,7 @@
46
58
  },
47
59
  "license": "MIT",
48
60
  "scripts": {
49
- "build": "tsc",
61
+ "build": "tsc && tsx ../../scripts/fix-esm-imports.ts .",
50
62
  "dev": "tsc --watch",
51
63
  "test": "vitest run",
52
64
  "test:watch": "vitest",