@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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -0
  3. package/dist/client/openai-adapter.d.ts +107 -0
  4. package/dist/client/openai-adapter.d.ts.map +1 -0
  5. package/dist/client/openai-adapter.js +265 -0
  6. package/dist/client/openai-adapter.js.map +1 -0
  7. package/dist/client/thread-manager.d.ts +80 -0
  8. package/dist/client/thread-manager.d.ts.map +1 -0
  9. package/dist/client/thread-manager.js +213 -0
  10. package/dist/client/thread-manager.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +11 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server/api-server.d.ts +85 -0
  16. package/dist/server/api-server.d.ts.map +1 -0
  17. package/dist/server/api-server.js +162 -0
  18. package/dist/server/api-server.js.map +1 -0
  19. package/dist/server/middleware/auth.d.ts +17 -0
  20. package/dist/server/middleware/auth.d.ts.map +1 -0
  21. package/dist/server/middleware/auth.js +46 -0
  22. package/dist/server/middleware/auth.js.map +1 -0
  23. package/dist/server/middleware/error-handler.d.ts +20 -0
  24. package/dist/server/middleware/error-handler.d.ts.map +1 -0
  25. package/dist/server/middleware/error-handler.js +55 -0
  26. package/dist/server/middleware/error-handler.js.map +1 -0
  27. package/dist/server/routes/assistants.d.ts +9 -0
  28. package/dist/server/routes/assistants.d.ts.map +1 -0
  29. package/dist/server/routes/assistants.js +88 -0
  30. package/dist/server/routes/assistants.js.map +1 -0
  31. package/dist/server/routes/files.d.ts +9 -0
  32. package/dist/server/routes/files.d.ts.map +1 -0
  33. package/dist/server/routes/files.js +110 -0
  34. package/dist/server/routes/files.js.map +1 -0
  35. package/dist/server/routes/runs.d.ts +9 -0
  36. package/dist/server/routes/runs.d.ts.map +1 -0
  37. package/dist/server/routes/runs.js +150 -0
  38. package/dist/server/routes/runs.js.map +1 -0
  39. package/dist/server/routes/threads.d.ts +9 -0
  40. package/dist/server/routes/threads.d.ts.map +1 -0
  41. package/dist/server/routes/threads.js +149 -0
  42. package/dist/server/routes/threads.js.map +1 -0
  43. package/dist/types/openai-types.d.ts +489 -0
  44. package/dist/types/openai-types.d.ts.map +1 -0
  45. package/dist/types/openai-types.js +7 -0
  46. package/dist/types/openai-types.js.map +1 -0
  47. 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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"}
@@ -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"}