@cogitator-ai/openai-compat 0.1.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/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/client/openai-adapter.d.ts +107 -0
- package/dist/client/openai-adapter.d.ts.map +1 -0
- package/dist/client/openai-adapter.js +265 -0
- package/dist/client/openai-adapter.js.map +1 -0
- package/dist/client/thread-manager.d.ts +80 -0
- package/dist/client/thread-manager.d.ts.map +1 -0
- package/dist/client/thread-manager.js +213 -0
- package/dist/client/thread-manager.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/server/api-server.d.ts +85 -0
- package/dist/server/api-server.d.ts.map +1 -0
- package/dist/server/api-server.js +162 -0
- package/dist/server/api-server.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +17 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +46 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/middleware/error-handler.d.ts +20 -0
- package/dist/server/middleware/error-handler.d.ts.map +1 -0
- package/dist/server/middleware/error-handler.js +55 -0
- package/dist/server/middleware/error-handler.js.map +1 -0
- package/dist/server/routes/assistants.d.ts +9 -0
- package/dist/server/routes/assistants.d.ts.map +1 -0
- package/dist/server/routes/assistants.js +88 -0
- package/dist/server/routes/assistants.js.map +1 -0
- package/dist/server/routes/files.d.ts +9 -0
- package/dist/server/routes/files.d.ts.map +1 -0
- package/dist/server/routes/files.js +110 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/runs.d.ts +9 -0
- package/dist/server/routes/runs.d.ts.map +1 -0
- package/dist/server/routes/runs.js +150 -0
- package/dist/server/routes/runs.js.map +1 -0
- package/dist/server/routes/threads.d.ts +9 -0
- package/dist/server/routes/threads.d.ts.map +1 -0
- package/dist/server/routes/threads.js +149 -0
- package/dist/server/routes/threads.js.map +1 -0
- package/dist/types/openai-types.d.ts +489 -0
- package/dist/types/openai-types.d.ts.map +1 -0
- package/dist/types/openai-types.js +7 -0
- package/dist/types/openai-types.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the mapping between OpenAI threads and Cogitator internal state.
|
|
5
|
+
*/
|
|
6
|
+
import { nanoid } from 'nanoid';
|
|
7
|
+
/**
|
|
8
|
+
* Manages threads, messages, and assistants in memory
|
|
9
|
+
*
|
|
10
|
+
* In production, this should be backed by a database
|
|
11
|
+
*/
|
|
12
|
+
export class ThreadManager {
|
|
13
|
+
threads = new Map();
|
|
14
|
+
assistants = new Map();
|
|
15
|
+
files = new Map();
|
|
16
|
+
createAssistant(params) {
|
|
17
|
+
const id = `asst_${nanoid()}`;
|
|
18
|
+
const assistant = {
|
|
19
|
+
id,
|
|
20
|
+
name: params.name ?? null,
|
|
21
|
+
model: params.model,
|
|
22
|
+
instructions: params.instructions ?? null,
|
|
23
|
+
tools: params.tools ?? [],
|
|
24
|
+
metadata: params.metadata ?? {},
|
|
25
|
+
temperature: params.temperature,
|
|
26
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
27
|
+
};
|
|
28
|
+
this.assistants.set(id, assistant);
|
|
29
|
+
return assistant;
|
|
30
|
+
}
|
|
31
|
+
getAssistant(id) {
|
|
32
|
+
return this.assistants.get(id);
|
|
33
|
+
}
|
|
34
|
+
updateAssistant(id, updates) {
|
|
35
|
+
const assistant = this.assistants.get(id);
|
|
36
|
+
if (!assistant)
|
|
37
|
+
return undefined;
|
|
38
|
+
Object.assign(assistant, updates);
|
|
39
|
+
return assistant;
|
|
40
|
+
}
|
|
41
|
+
deleteAssistant(id) {
|
|
42
|
+
return this.assistants.delete(id);
|
|
43
|
+
}
|
|
44
|
+
listAssistants() {
|
|
45
|
+
return Array.from(this.assistants.values());
|
|
46
|
+
}
|
|
47
|
+
createThread(metadata) {
|
|
48
|
+
const id = `thread_${nanoid()}`;
|
|
49
|
+
const thread = {
|
|
50
|
+
id,
|
|
51
|
+
object: 'thread',
|
|
52
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
53
|
+
metadata: metadata ?? {},
|
|
54
|
+
};
|
|
55
|
+
this.threads.set(id, { thread, messages: [] });
|
|
56
|
+
return thread;
|
|
57
|
+
}
|
|
58
|
+
getThread(id) {
|
|
59
|
+
return this.threads.get(id)?.thread;
|
|
60
|
+
}
|
|
61
|
+
deleteThread(id) {
|
|
62
|
+
return this.threads.delete(id);
|
|
63
|
+
}
|
|
64
|
+
addMessage(threadId, request) {
|
|
65
|
+
const stored = this.threads.get(threadId);
|
|
66
|
+
if (!stored)
|
|
67
|
+
return undefined;
|
|
68
|
+
const id = `msg_${nanoid()}`;
|
|
69
|
+
const now = Math.floor(Date.now() / 1000);
|
|
70
|
+
const content = this.normalizeContent(request.content);
|
|
71
|
+
const message = {
|
|
72
|
+
id,
|
|
73
|
+
object: 'thread.message',
|
|
74
|
+
created_at: now,
|
|
75
|
+
thread_id: threadId,
|
|
76
|
+
status: 'completed',
|
|
77
|
+
completed_at: now,
|
|
78
|
+
incomplete_at: null,
|
|
79
|
+
role: request.role,
|
|
80
|
+
content,
|
|
81
|
+
assistant_id: null,
|
|
82
|
+
run_id: null,
|
|
83
|
+
attachments: request.attachments ?? null,
|
|
84
|
+
metadata: request.metadata ?? {},
|
|
85
|
+
};
|
|
86
|
+
stored.messages.push(message);
|
|
87
|
+
return message;
|
|
88
|
+
}
|
|
89
|
+
getMessage(threadId, messageId) {
|
|
90
|
+
const stored = this.threads.get(threadId);
|
|
91
|
+
return stored?.messages.find((m) => m.id === messageId);
|
|
92
|
+
}
|
|
93
|
+
listMessages(threadId, options) {
|
|
94
|
+
const stored = this.threads.get(threadId);
|
|
95
|
+
if (!stored)
|
|
96
|
+
return [];
|
|
97
|
+
let messages = [...stored.messages];
|
|
98
|
+
if (options?.run_id) {
|
|
99
|
+
messages = messages.filter((m) => m.run_id === options.run_id);
|
|
100
|
+
}
|
|
101
|
+
if (options?.order === 'asc') {
|
|
102
|
+
messages.sort((a, b) => a.created_at - b.created_at);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
messages.sort((a, b) => b.created_at - a.created_at);
|
|
106
|
+
}
|
|
107
|
+
if (options?.after) {
|
|
108
|
+
const idx = messages.findIndex((m) => m.id === options.after);
|
|
109
|
+
if (idx !== -1) {
|
|
110
|
+
messages = messages.slice(idx + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (options?.before) {
|
|
114
|
+
const idx = messages.findIndex((m) => m.id === options.before);
|
|
115
|
+
if (idx !== -1) {
|
|
116
|
+
messages = messages.slice(0, idx);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (options?.limit) {
|
|
120
|
+
messages = messages.slice(0, options.limit);
|
|
121
|
+
}
|
|
122
|
+
return messages;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get messages in Cogitator format for LLM calls
|
|
126
|
+
*/
|
|
127
|
+
getMessagesForLLM(threadId) {
|
|
128
|
+
const messages = this.listMessages(threadId, { order: 'asc' });
|
|
129
|
+
return messages.map((msg) => ({
|
|
130
|
+
role: msg.role,
|
|
131
|
+
content: this.extractTextContent(msg.content),
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Add an assistant message (from LLM response)
|
|
136
|
+
*/
|
|
137
|
+
addAssistantMessage(threadId, content, assistantId, runId) {
|
|
138
|
+
const stored = this.threads.get(threadId);
|
|
139
|
+
if (!stored)
|
|
140
|
+
return undefined;
|
|
141
|
+
const id = `msg_${nanoid()}`;
|
|
142
|
+
const now = Math.floor(Date.now() / 1000);
|
|
143
|
+
const message = {
|
|
144
|
+
id,
|
|
145
|
+
object: 'thread.message',
|
|
146
|
+
created_at: now,
|
|
147
|
+
thread_id: threadId,
|
|
148
|
+
status: 'completed',
|
|
149
|
+
completed_at: now,
|
|
150
|
+
incomplete_at: null,
|
|
151
|
+
role: 'assistant',
|
|
152
|
+
content: [
|
|
153
|
+
{
|
|
154
|
+
type: 'text',
|
|
155
|
+
text: {
|
|
156
|
+
value: content,
|
|
157
|
+
annotations: [],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
assistant_id: assistantId,
|
|
162
|
+
run_id: runId,
|
|
163
|
+
attachments: null,
|
|
164
|
+
metadata: {},
|
|
165
|
+
};
|
|
166
|
+
stored.messages.push(message);
|
|
167
|
+
return message;
|
|
168
|
+
}
|
|
169
|
+
addFile(content, filename) {
|
|
170
|
+
const id = `file_${nanoid()}`;
|
|
171
|
+
const created_at = Math.floor(Date.now() / 1000);
|
|
172
|
+
this.files.set(id, { id, content, filename, created_at });
|
|
173
|
+
return { id, filename, created_at };
|
|
174
|
+
}
|
|
175
|
+
getFile(id) {
|
|
176
|
+
return this.files.get(id);
|
|
177
|
+
}
|
|
178
|
+
deleteFile(id) {
|
|
179
|
+
return this.files.delete(id);
|
|
180
|
+
}
|
|
181
|
+
normalizeContent(content) {
|
|
182
|
+
if (typeof content === 'string') {
|
|
183
|
+
return [
|
|
184
|
+
{
|
|
185
|
+
type: 'text',
|
|
186
|
+
text: {
|
|
187
|
+
value: content,
|
|
188
|
+
annotations: [],
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
return content.map((part) => {
|
|
194
|
+
if (part.type === 'text' && typeof part.text === 'string') {
|
|
195
|
+
return {
|
|
196
|
+
type: 'text',
|
|
197
|
+
text: {
|
|
198
|
+
value: part.text,
|
|
199
|
+
annotations: [],
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return part;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
extractTextContent(content) {
|
|
207
|
+
return content
|
|
208
|
+
.filter((c) => c.type === 'text')
|
|
209
|
+
.map((c) => c.text.value)
|
|
210
|
+
.join('\n');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=thread-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-manager.js","sourceRoot":"","sources":["../../src/client/thread-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cogitator-ai/openai-compat - OpenAI Assistants API Compatibility
|
|
3
|
+
*
|
|
4
|
+
* This package provides:
|
|
5
|
+
* - OpenAI SDK adapter: Use OpenAI SDK to interact with Cogitator
|
|
6
|
+
* - REST API server: Expose Cogitator as OpenAI-compatible API
|
|
7
|
+
*/
|
|
8
|
+
export { OpenAIServer, createOpenAIServer } from './server/api-server';
|
|
9
|
+
export { OpenAIAdapter, createOpenAIAdapter } from './client/openai-adapter';
|
|
10
|
+
export { ThreadManager } from './client/thread-manager';
|
|
11
|
+
export type { OpenAIError, ListResponse, Assistant, AssistantTool, FunctionDefinition, ResponseFormat, CreateAssistantRequest, UpdateAssistantRequest, Thread, ToolResources, CreateThreadRequest, Message, MessageContent, TextContent, TextAnnotation, Attachment, CreateMessageRequest, MessageContentPart, Run, RunStatus, RequiredAction, ToolCall, RunError, Usage, ToolChoice, CreateRunRequest, SubmitToolOutputsRequest, ToolOutput, RunStep, StepDetails, StepToolCall, FileObject, FilePurpose, UploadFileRequest, StreamEvent, MessageDelta, RunStepDelta, } from './types/openai-types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,YAAY,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,GAAG,EACH,SAAS,EACT,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,wBAAwB,EACxB,UAAU,EACV,OAAO,EACP,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cogitator-ai/openai-compat - OpenAI Assistants API Compatibility
|
|
3
|
+
*
|
|
4
|
+
* This package provides:
|
|
5
|
+
* - OpenAI SDK adapter: Use OpenAI SDK to interact with Cogitator
|
|
6
|
+
* - REST API server: Expose Cogitator as OpenAI-compatible API
|
|
7
|
+
*/
|
|
8
|
+
export { OpenAIServer, createOpenAIServer } from './server/api-server';
|
|
9
|
+
export { OpenAIAdapter, createOpenAIAdapter } from './client/openai-adapter';
|
|
10
|
+
export { ThreadManager } from './client/thread-manager';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-Compatible REST API Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes Cogitator as an OpenAI Assistants API compatible server.
|
|
5
|
+
*/
|
|
6
|
+
import type { Cogitator } from '@cogitator-ai/core';
|
|
7
|
+
import type { Tool } from '@cogitator-ai/types';
|
|
8
|
+
import { OpenAIAdapter } from '../client/openai-adapter';
|
|
9
|
+
export interface OpenAIServerConfig {
|
|
10
|
+
/** Port to listen on */
|
|
11
|
+
port?: number;
|
|
12
|
+
/** Host to bind to */
|
|
13
|
+
host?: string;
|
|
14
|
+
/** API keys for authentication. Empty array disables auth. */
|
|
15
|
+
apiKeys?: string[];
|
|
16
|
+
/** Tools to make available */
|
|
17
|
+
tools?: Tool[];
|
|
18
|
+
/** Enable request logging */
|
|
19
|
+
logging?: boolean;
|
|
20
|
+
/** CORS configuration */
|
|
21
|
+
cors?: {
|
|
22
|
+
origin?: string | string[] | boolean;
|
|
23
|
+
methods?: string[];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* OpenAI-Compatible API Server
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { Cogitator } from '@cogitator-ai/core';
|
|
32
|
+
* import { createOpenAIServer } from '@cogitator-ai/openai-compat';
|
|
33
|
+
*
|
|
34
|
+
* const cogitator = new Cogitator({ ... });
|
|
35
|
+
* const server = createOpenAIServer(cogitator, {
|
|
36
|
+
* port: 8080,
|
|
37
|
+
* tools: [calculator, datetime],
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* await server.start();
|
|
41
|
+
* // Server is now available at http://localhost:8080
|
|
42
|
+
* // Use with OpenAI SDK:
|
|
43
|
+
* // const openai = new OpenAI({ baseURL: 'http://localhost:8080/v1' });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class OpenAIServer {
|
|
47
|
+
private fastify;
|
|
48
|
+
private config;
|
|
49
|
+
private adapter;
|
|
50
|
+
private started;
|
|
51
|
+
constructor(cogitator: Cogitator, config?: OpenAIServerConfig);
|
|
52
|
+
/**
|
|
53
|
+
* Set up the Fastify server
|
|
54
|
+
*/
|
|
55
|
+
private setupServer;
|
|
56
|
+
/**
|
|
57
|
+
* Start the server
|
|
58
|
+
*/
|
|
59
|
+
start(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Stop the server
|
|
62
|
+
*/
|
|
63
|
+
stop(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the server URL
|
|
66
|
+
*/
|
|
67
|
+
getUrl(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Get the OpenAI-compatible base URL
|
|
70
|
+
*/
|
|
71
|
+
getBaseUrl(): string;
|
|
72
|
+
/**
|
|
73
|
+
* Check if server is running
|
|
74
|
+
*/
|
|
75
|
+
isRunning(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Get the underlying adapter
|
|
78
|
+
*/
|
|
79
|
+
getAdapter(): OpenAIAdapter;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create an OpenAI-compatible server
|
|
83
|
+
*/
|
|
84
|
+
export declare function createOpenAIServer(cogitator: Cogitator, config?: OpenAIServerConfig): OpenAIServer;
|
|
85
|
+
//# sourceMappingURL=api-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-server.d.ts","sourceRoot":"","sources":["../../src/server/api-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAQzD,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IAEf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,yBAAyB;IACzB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;QACrC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAS;gBAEZ,SAAS,EAAE,SAAS,EAAE,MAAM,GAAE,kBAAuB;IA8BjE;;OAEG;YACW,WAAW;IA2CzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,IAAI,aAAa;CAG5B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,YAAY,CAEd"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-Compatible REST API Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes Cogitator as an OpenAI Assistants API compatible server.
|
|
5
|
+
*/
|
|
6
|
+
import Fastify from 'fastify';
|
|
7
|
+
import fastifyCors from '@fastify/cors';
|
|
8
|
+
import { OpenAIAdapter } from '../client/openai-adapter';
|
|
9
|
+
import { createAuthMiddleware } from './middleware/auth';
|
|
10
|
+
import { errorHandler, notFoundHandler } from './middleware/error-handler';
|
|
11
|
+
import { registerAssistantRoutes } from './routes/assistants';
|
|
12
|
+
import { registerThreadRoutes } from './routes/threads';
|
|
13
|
+
import { registerRunRoutes } from './routes/runs';
|
|
14
|
+
import { registerFileRoutes } from './routes/files';
|
|
15
|
+
/**
|
|
16
|
+
* OpenAI-Compatible API Server
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { Cogitator } from '@cogitator-ai/core';
|
|
21
|
+
* import { createOpenAIServer } from '@cogitator-ai/openai-compat';
|
|
22
|
+
*
|
|
23
|
+
* const cogitator = new Cogitator({ ... });
|
|
24
|
+
* const server = createOpenAIServer(cogitator, {
|
|
25
|
+
* port: 8080,
|
|
26
|
+
* tools: [calculator, datetime],
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* await server.start();
|
|
30
|
+
* // Server is now available at http://localhost:8080
|
|
31
|
+
* // Use with OpenAI SDK:
|
|
32
|
+
* // const openai = new OpenAI({ baseURL: 'http://localhost:8080/v1' });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class OpenAIServer {
|
|
36
|
+
fastify;
|
|
37
|
+
config;
|
|
38
|
+
adapter;
|
|
39
|
+
started = false;
|
|
40
|
+
constructor(cogitator, config = {}) {
|
|
41
|
+
this.config = {
|
|
42
|
+
port: config.port ?? 8080,
|
|
43
|
+
host: config.host ?? '0.0.0.0',
|
|
44
|
+
apiKeys: config.apiKeys ?? [],
|
|
45
|
+
tools: config.tools ?? [],
|
|
46
|
+
logging: config.logging ?? false,
|
|
47
|
+
cors: config.cors ?? { origin: true },
|
|
48
|
+
};
|
|
49
|
+
this.adapter = new OpenAIAdapter(cogitator, { tools: this.config.tools });
|
|
50
|
+
this.fastify = Fastify({
|
|
51
|
+
logger: this.config.logging
|
|
52
|
+
? {
|
|
53
|
+
level: 'info',
|
|
54
|
+
transport: {
|
|
55
|
+
target: 'pino-pretty',
|
|
56
|
+
options: {
|
|
57
|
+
translateTime: 'HH:MM:ss Z',
|
|
58
|
+
ignore: 'pid,hostname',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
: false,
|
|
63
|
+
});
|
|
64
|
+
this.setupServer();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Set up the Fastify server
|
|
68
|
+
*/
|
|
69
|
+
async setupServer() {
|
|
70
|
+
await this.fastify.register(fastifyCors, {
|
|
71
|
+
origin: this.config.cors.origin,
|
|
72
|
+
methods: this.config.cors.methods ?? ['GET', 'POST', 'DELETE', 'OPTIONS'],
|
|
73
|
+
});
|
|
74
|
+
await this.fastify.register(import('@fastify/multipart'), {
|
|
75
|
+
limits: {
|
|
76
|
+
fileSize: 512 * 1024 * 1024,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (this.config.apiKeys.length > 0) {
|
|
80
|
+
const authConfig = {
|
|
81
|
+
apiKeys: this.config.apiKeys,
|
|
82
|
+
required: true,
|
|
83
|
+
};
|
|
84
|
+
this.fastify.addHook('preHandler', createAuthMiddleware(authConfig));
|
|
85
|
+
}
|
|
86
|
+
this.fastify.setErrorHandler(errorHandler);
|
|
87
|
+
this.fastify.setNotFoundHandler(notFoundHandler);
|
|
88
|
+
this.fastify.get('/health', async () => ({ status: 'ok' }));
|
|
89
|
+
this.fastify.get('/v1/models', async () => ({
|
|
90
|
+
object: 'list',
|
|
91
|
+
data: [
|
|
92
|
+
{
|
|
93
|
+
id: 'cogitator',
|
|
94
|
+
object: 'model',
|
|
95
|
+
created: Math.floor(Date.now() / 1000),
|
|
96
|
+
owned_by: 'cogitator',
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
}));
|
|
100
|
+
registerAssistantRoutes(this.fastify, this.adapter);
|
|
101
|
+
registerThreadRoutes(this.fastify, this.adapter);
|
|
102
|
+
registerRunRoutes(this.fastify, this.adapter);
|
|
103
|
+
registerFileRoutes(this.fastify, this.adapter);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Start the server
|
|
107
|
+
*/
|
|
108
|
+
async start() {
|
|
109
|
+
if (this.started) {
|
|
110
|
+
throw new Error('Server already started');
|
|
111
|
+
}
|
|
112
|
+
await this.fastify.listen({
|
|
113
|
+
port: this.config.port,
|
|
114
|
+
host: this.config.host,
|
|
115
|
+
});
|
|
116
|
+
this.started = true;
|
|
117
|
+
console.log(`[OpenAI Server] Listening on http://${this.config.host}:${this.config.port}`);
|
|
118
|
+
console.log(`[OpenAI Server] Use with OpenAI SDK: baseURL = "http://localhost:${this.config.port}/v1"`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Stop the server
|
|
122
|
+
*/
|
|
123
|
+
async stop() {
|
|
124
|
+
if (!this.started) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
await this.fastify.close();
|
|
128
|
+
this.started = false;
|
|
129
|
+
console.log('[OpenAI Server] Stopped');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the server URL
|
|
133
|
+
*/
|
|
134
|
+
getUrl() {
|
|
135
|
+
return `http://${this.config.host}:${this.config.port}`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the OpenAI-compatible base URL
|
|
139
|
+
*/
|
|
140
|
+
getBaseUrl() {
|
|
141
|
+
return `http://${this.config.host}:${this.config.port}/v1`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if server is running
|
|
145
|
+
*/
|
|
146
|
+
isRunning() {
|
|
147
|
+
return this.started;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get the underlying adapter
|
|
151
|
+
*/
|
|
152
|
+
getAdapter() {
|
|
153
|
+
return this.adapter;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Create an OpenAI-compatible server
|
|
158
|
+
*/
|
|
159
|
+
export function createOpenAIServer(cogitator, config) {
|
|
160
|
+
return new OpenAIServer(cogitator, config);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=api-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-server.js","sourceRoot":"","sources":["../../src/server/api-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Validates API keys for the OpenAI-compatible server.
|
|
5
|
+
*/
|
|
6
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
7
|
+
export interface AuthConfig {
|
|
8
|
+
/** List of valid API keys. If empty, auth is disabled. */
|
|
9
|
+
apiKeys: string[];
|
|
10
|
+
/** Whether to require authentication */
|
|
11
|
+
required: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create authentication middleware
|
|
15
|
+
*/
|
|
16
|
+
export declare function createAuthMiddleware(config: AuthConfig): (request: FastifyRequest, reply: FastifyReply) => Promise<undefined>;
|
|
17
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,wCAAwC;IACxC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,IACvC,SAAS,cAAc,EAAE,OAAO,YAAY,wBAwC3D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Validates API keys for the OpenAI-compatible server.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create authentication middleware
|
|
8
|
+
*/
|
|
9
|
+
export function createAuthMiddleware(config) {
|
|
10
|
+
return async (request, reply) => {
|
|
11
|
+
if (config.apiKeys.length === 0 && !config.required) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const authHeader = request.headers.authorization;
|
|
15
|
+
if (!authHeader) {
|
|
16
|
+
return reply.status(401).send({
|
|
17
|
+
error: {
|
|
18
|
+
message: 'Missing Authorization header',
|
|
19
|
+
type: 'invalid_request_error',
|
|
20
|
+
code: 'missing_api_key',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const match = /^Bearer\s+(.+)$/i.exec(authHeader);
|
|
25
|
+
if (!match) {
|
|
26
|
+
return reply.status(401).send({
|
|
27
|
+
error: {
|
|
28
|
+
message: 'Invalid Authorization header format. Expected: Bearer <api_key>',
|
|
29
|
+
type: 'invalid_request_error',
|
|
30
|
+
code: 'invalid_api_key',
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const apiKey = match[1];
|
|
35
|
+
if (config.apiKeys.length > 0 && !config.apiKeys.includes(apiKey)) {
|
|
36
|
+
return reply.status(401).send({
|
|
37
|
+
error: {
|
|
38
|
+
message: 'Invalid API key',
|
|
39
|
+
type: 'invalid_request_error',
|
|
40
|
+
code: 'invalid_api_key',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC5D,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE;oBACL,OAAO,EAAE,8BAA8B;oBACvC,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,iBAAiB;iBACxB;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE;oBACL,OAAO,EAAE,iEAAiE;oBAC1E,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,iBAAiB;iBACxB;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE;oBACL,OAAO,EAAE,iBAAiB;oBAC1B,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,iBAAiB;iBACxB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler Middleware
|
|
3
|
+
*
|
|
4
|
+
* Formats errors in OpenAI-compatible format.
|
|
5
|
+
*/
|
|
6
|
+
import type { FastifyError, FastifyReply, FastifyRequest } from 'fastify';
|
|
7
|
+
import type { OpenAIError } from '../../types/openai-types';
|
|
8
|
+
/**
|
|
9
|
+
* OpenAI-compatible error response
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatOpenAIError(code: string, message: string, type?: string, param?: string): OpenAIError;
|
|
12
|
+
/**
|
|
13
|
+
* Error handler for Fastify
|
|
14
|
+
*/
|
|
15
|
+
export declare function errorHandler(error: FastifyError, request: FastifyRequest, reply: FastifyReply): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Not found handler for Fastify
|
|
18
|
+
*/
|
|
19
|
+
export declare function notFoundHandler(request: FastifyRequest, reply: FastifyReply): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
|
|
20
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,SAA0B,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,WAAW,CASb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,6RAiCpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,6RASpB"}
|