@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.
- package/README.md +74 -50
- package/dist/client/openai-adapter.d.ts +74 -37
- package/dist/client/openai-adapter.d.ts.map +1 -1
- package/dist/client/openai-adapter.js +416 -137
- package/dist/client/openai-adapter.js.map +1 -1
- package/dist/client/storage.d.ts +4 -0
- package/dist/client/storage.d.ts.map +1 -1
- package/dist/client/storage.js +80 -60
- package/dist/client/storage.js.map +1 -1
- package/dist/client/thread-manager.d.ts +45 -31
- package/dist/client/thread-manager.d.ts.map +1 -1
- package/dist/client/thread-manager.js +157 -115
- package/dist/client/thread-manager.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server/api-server.d.ts +23 -1
- package/dist/server/api-server.d.ts.map +1 -1
- package/dist/server/api-server.js +42 -23
- package/dist/server/api-server.js.map +1 -1
- package/dist/server/middleware/auth.d.ts +2 -0
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js +25 -2
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/server/routes/assistants.d.ts.map +1 -1
- package/dist/server/routes/assistants.js +16 -26
- package/dist/server/routes/assistants.js.map +1 -1
- package/dist/server/routes/files.d.ts.map +1 -1
- package/dist/server/routes/files.js +60 -56
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/runs.d.ts.map +1 -1
- package/dist/server/routes/runs.js +102 -105
- package/dist/server/routes/runs.js.map +1 -1
- package/dist/server/routes/shared.d.ts +27 -0
- package/dist/server/routes/shared.d.ts.map +1 -0
- package/dist/server/routes/shared.js +54 -0
- package/dist/server/routes/shared.js.map +1 -0
- package/dist/server/routes/threads.d.ts.map +1 -1
- package/dist/server/routes/threads.js +29 -16
- package/dist/server/routes/threads.js.map +1 -1
- 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.
|
|
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
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
*
|
|
115
|
+
* Stream run events as OpenAI-style server-sent events until the run
|
|
116
|
+
* finishes or pauses for tool outputs.
|
|
115
117
|
*/
|
|
116
|
-
function
|
|
117
|
-
reply.
|
|
118
|
-
reply.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE9F,MAAM,UAAU,iBAAiB,CAAC,OAAwB,EAAE,OAAsB;IAChF,OAAO,CAAC,IAAI,CACV,6BAA6B,EAC7B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YAChC,OAAO,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,cAAc,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,IAAI,CAIT,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YAChC,OAAO,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,cAAc,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,kBAAkB,CAAC,KAAK,EAAE,aAAa,OAAO,CAAC,IAAI,CAAC,YAAY,YAAY,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzE,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACtD,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAGR,6BAA6B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,IAAI;YAChB,OAAO,kBAAkB,CAAC,KAAK,EAAE,iCAAiC,EAAE,OAAO,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,kBAAkB,CAAC,KAAK,EAAE,+BAA+B,EAAE,OAAO,CAAC,CAAC;QAE/F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC7B,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;YAC1B,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CACT,qCAAqC,EACrC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,IAAI,CACV,4CAA4C,EAC5C,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,GAAoB,CAAC;QACzB,IAAI,CAAC;YACH,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,IAAI,CAGT,yDAAyD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrF,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,GAAoB,CAAC;QACzB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,iBAAiB,CACnC,OAAO,CAAC,MAAM,CAAC,SAAS,EACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EACrB,OAAO,CAAC,IAAI,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CACrC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,QAAgB;IACpD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS,CACtB,KAAmB,EACnB,OAAsB,EACtB,KAAa,EACb,SAAiB;IAEjB,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;QACxB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YAC3C,IAAI,MAAM,IAAI,GAAG,CAAC,aAAa;gBAAE,MAAM;YACvC,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvE,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,OAAO,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -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;
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
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":"AAAA;;;;GAIG;
|
|
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": "
|
|
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
|
-
"
|
|
23
|
-
"@cogitator-ai/
|
|
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/
|
|
33
|
-
"@cogitator-ai/
|
|
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",
|