@xandout/libra-harness 0.1.128 → 0.1.129

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 (30) hide show
  1. package/README.md +13 -114
  2. package/package.json +12 -68
  3. package/dist/extensions/code-tools/extension.test.d.ts +0 -2
  4. package/dist/extensions/code-tools/extension.test.d.ts.map +0 -1
  5. package/dist/extensions/code-tools/extension.test.js +0 -544
  6. package/dist/extensions/code-tools/extension.test.js.map +0 -1
  7. package/dist/extensions/disk-session/extension.test.d.ts +0 -2
  8. package/dist/extensions/disk-session/extension.test.d.ts.map +0 -1
  9. package/dist/extensions/disk-session/extension.test.js +0 -1101
  10. package/dist/extensions/disk-session/extension.test.js.map +0 -1
  11. package/dist/extensions/index.d.ts +0 -3
  12. package/dist/extensions/index.d.ts.map +0 -1
  13. package/dist/extensions/index.js +0 -2
  14. package/dist/extensions/index.js.map +0 -1
  15. package/dist/extensions/loader.d.ts +0 -205
  16. package/dist/extensions/loader.d.ts.map +0 -1
  17. package/dist/extensions/loader.js +0 -315
  18. package/dist/extensions/loader.js.map +0 -1
  19. package/dist/extensions/skills/extension.test.d.ts +0 -2
  20. package/dist/extensions/skills/extension.test.d.ts.map +0 -1
  21. package/dist/extensions/skills/extension.test.js +0 -184
  22. package/dist/extensions/skills/extension.test.js.map +0 -1
  23. package/dist/openai-provider/index.d.ts +0 -3
  24. package/dist/openai-provider/index.d.ts.map +0 -1
  25. package/dist/openai-provider/index.js +0 -2
  26. package/dist/openai-provider/index.js.map +0 -1
  27. package/dist/openai-provider/server.d.ts +0 -34
  28. package/dist/openai-provider/server.d.ts.map +0 -1
  29. package/dist/openai-provider/server.js +0 -335
  30. package/dist/openai-provider/server.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=extension.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.test.d.ts","sourceRoot":"","sources":["../../../src/extensions/skills/extension.test.ts"],"names":[],"mappings":""}
@@ -1,184 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { tmpdir } from 'node:os';
5
- import { Agent } from '../../agent.js';
6
- import { createSkillExtension } from './index.js';
7
- // ── Mock model ─────────────────────────────────────────────────────
8
- // Returns a fixed assistant message.
9
- function mockModel() {
10
- return {
11
- async generate() {
12
- return {
13
- message: { role: 'assistant', content: 'ok' },
14
- finishReason: 'stop',
15
- };
16
- },
17
- };
18
- }
19
- // ── Helpers ────────────────────────────────────────────────────────
20
- function makeSkill(dir, name, frontmatter = {}, body = 'Skill body') {
21
- const skillDir = join(dir, name);
22
- mkdirSync(skillDir, { recursive: true });
23
- const fmLines = Object.entries(frontmatter).map(([k, v]) => `${k}: ${v}`);
24
- const content = `---\nname: ${name}\n${fmLines.join('\n')}\n---\n${body}`;
25
- writeFileSync(join(skillDir, 'SKILL.md'), content);
26
- return skillDir;
27
- }
28
- // ── Test setup ─────────────────────────────────────────────────────
29
- let tmpDir;
30
- beforeEach(() => {
31
- tmpDir = mkdtempSync(join(tmpdir(), 'skills-test-'));
32
- });
33
- afterEach(() => {
34
- rmSync(tmpDir, { recursive: true, force: true });
35
- });
36
- // ── Tests ──────────────────────────────────────────────────────────
37
- describe('skills extension', () => {
38
- it('loads skills from a directory at startup', () => {
39
- makeSkill(tmpDir, 'code-review', { description: 'Review code' });
40
- makeSkill(tmpDir, 'summarize', { description: 'Summarize text' });
41
- const ext = createSkillExtension({ skillsDirs: tmpDir });
42
- expect(ext).toBeDefined();
43
- const agent = new Agent({ model: mockModel() });
44
- agent.use(ext);
45
- // list_skills should be registered as a tool
46
- expect(agent.getTools()).toContain('list_skills');
47
- expect(agent.getTools()).toContain('use_skill');
48
- });
49
- it('returns undefined when no skillsDirs provided', () => {
50
- const ext = createSkillExtension({});
51
- expect(ext).toBeUndefined();
52
- });
53
- it('list_skills returns skills present at startup', async () => {
54
- makeSkill(tmpDir, 'alpha', { description: 'Alpha skill' });
55
- makeSkill(tmpDir, 'beta', { description: 'Beta skill' });
56
- const ext = createSkillExtension({ skillsDirs: tmpDir });
57
- const agent = new Agent({ model: mockModel() });
58
- agent.use(ext);
59
- // Find the list_skills tool and call it directly.
60
- const tools = agent.getTools();
61
- expect(tools).toContain('list_skills');
62
- });
63
- it('list_skills discovers new skills added at runtime', async () => {
64
- // Start with one skill.
65
- makeSkill(tmpDir, 'existing', { description: 'Existing skill' });
66
- const ext = createSkillExtension({ skillsDirs: tmpDir });
67
- const agent = new Agent({ model: mockModel() });
68
- agent.use(ext);
69
- // Add a new skill directory after the extension is installed.
70
- makeSkill(tmpDir, 'runtime-added', { description: 'Added at runtime' });
71
- // Model that calls list_skills on first turn, then returns the
72
- // tool result as the final message so we can inspect it.
73
- let callCount = 0;
74
- let capturedToolResult = '';
75
- const callModel = {
76
- async generate(req) {
77
- callCount++;
78
- if (callCount === 1) {
79
- return {
80
- message: {
81
- role: 'assistant',
82
- content: '',
83
- toolCalls: [{
84
- id: 'call_1',
85
- name: 'list_skills',
86
- arguments: '{}',
87
- }],
88
- },
89
- finishReason: 'tool_calls',
90
- };
91
- }
92
- // Second call: capture the tool result and return it.
93
- const toolMsg = req.messages.find((m) => m.role === 'tool');
94
- capturedToolResult = toolMsg?.content ?? '';
95
- return {
96
- message: { role: 'assistant', content: capturedToolResult },
97
- finishReason: 'stop',
98
- };
99
- },
100
- };
101
- const agent2 = new Agent({ model: callModel });
102
- agent2.use(ext);
103
- const result = await agent2.run({ message: 'list skills' });
104
- expect(result.finishReason).toBe('stop');
105
- expect(result.toolCalls?.some((tc) => tc.name === 'list_skills')).toBe(true);
106
- // The tool result should include both the existing and runtime-added skills.
107
- expect(capturedToolResult).toContain('existing');
108
- expect(capturedToolResult).toContain('runtime-added');
109
- });
110
- it('use_skill can load a skill added at runtime', async () => {
111
- // Start with no skills.
112
- const ext = createSkillExtension({ skillsDirs: tmpDir });
113
- const agent = new Agent({ model: mockModel() });
114
- agent.use(ext);
115
- // Add a skill after install.
116
- makeSkill(tmpDir, 'late-skill', { description: 'Added late' }, 'Late skill content');
117
- // Model that calls use_skill, then returns the result.
118
- let sawSkillContent = false;
119
- const callModel = {
120
- async generate(req) {
121
- const hasUseSkill = req.tools?.some((t) => t.function.name === 'use_skill');
122
- if (hasUseSkill && !req.messages.some((m) => m.role === 'tool')) {
123
- return {
124
- message: {
125
- role: 'assistant',
126
- content: '',
127
- toolCalls: [{
128
- id: 'call_1',
129
- name: 'use_skill',
130
- arguments: JSON.stringify({ skill: 'late-skill' }),
131
- }],
132
- },
133
- finishReason: 'tool_calls',
134
- };
135
- }
136
- // Check if the tool result contains the late skill content
137
- const toolMsg = req.messages.find((m) => m.role === 'tool');
138
- if (toolMsg && toolMsg.content.includes('Late skill content')) {
139
- sawSkillContent = true;
140
- }
141
- return {
142
- message: { role: 'assistant', content: 'done' },
143
- finishReason: 'stop',
144
- };
145
- },
146
- };
147
- const agent2 = new Agent({ model: callModel });
148
- agent2.use(ext);
149
- await agent2.run({ message: 'use the late skill' });
150
- expect(sawSkillContent).toBe(true);
151
- });
152
- it('autoLoad skills are appended to system prompt at install time', () => {
153
- makeSkill(tmpDir, 'always-on', { autoLoad: 'true', description: 'Always active' }, 'Always-on content');
154
- let seenSystemPrompt = '';
155
- const model = {
156
- async generate(req) {
157
- seenSystemPrompt = req.systemPrompt ?? '';
158
- return {
159
- message: { role: 'assistant', content: 'ok' },
160
- finishReason: 'stop',
161
- };
162
- },
163
- };
164
- const ext = createSkillExtension({ skillsDirs: tmpDir });
165
- const agent = new Agent({ model: model, systemPrompt: 'Base prompt.' });
166
- agent.use(ext);
167
- return agent.run({ message: 'hi' }).then(() => {
168
- expect(seenSystemPrompt).toContain('Base prompt.');
169
- expect(seenSystemPrompt).toContain('Always-on content');
170
- });
171
- });
172
- it('supports multiple skills directories', () => {
173
- const dir2 = mkdtempSync(join(tmpdir(), 'skills-test-2-'));
174
- makeSkill(tmpDir, 'from-dir1', { description: 'First dir' });
175
- makeSkill(dir2, 'from-dir2', { description: 'Second dir' });
176
- const ext = createSkillExtension({ skillsDirs: [tmpDir, dir2] });
177
- const agent = new Agent({ model: mockModel() });
178
- agent.use(ext);
179
- expect(agent.getTools()).toContain('list_skills');
180
- // Clean up second dir
181
- rmSync(dir2, { recursive: true, force: true });
182
- });
183
- });
184
- //# sourceMappingURL=extension.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.test.js","sourceRoot":"","sources":["../../../src/extensions/skills/extension.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export { createOpenAICompatibleServer } from './server.js';
2
- export type { OpenAICompatibleProviderConfig } from './server.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openai-provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC"}
@@ -1,2 +0,0 @@
1
- export { createOpenAICompatibleServer } from './server.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openai-provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC"}
@@ -1,34 +0,0 @@
1
- import { type Server } from 'node:http';
2
- import { Agent } from '../agent.js';
3
- export interface OpenAICompatibleProviderConfig {
4
- agents: Readonly<Record<string, Agent>>;
5
- apiKeys: readonly string[];
6
- }
7
- /**
8
- * Create an OpenAI-compatible HTTP server that exposes Libra agents as models.
9
- *
10
- * Each agent in the `agents` record becomes an OpenAI model ID. The server
11
- * implements `GET /v1/models` and `POST /v1/chat/completions` with bearer/x-api-key
12
- * authentication, text and image content, SSE streaming, and client-defined
13
- * (external) tool calling.
14
- *
15
- * The HTTP server stays out of the core agent — this is an adapter/extra, not
16
- * part of the agent harness itself. Use it when you want to expose Libra agents
17
- * to OpenAI-compatible frameworks and SDKs.
18
- *
19
- * @example
20
- * ```typescript
21
- * import { Agent } from '@xandout/libra-harness';
22
- * import { createOpenAICompatibleServer } from '@xandout/libra-harness/extras/openai-provider';
23
- *
24
- * const server = createOpenAICompatibleServer({
25
- * agents: {
26
- * 'my-agent': new Agent({ model, systemPrompt: 'You are helpful.' }),
27
- * },
28
- * apiKeys: ['your-provider-key'],
29
- * });
30
- * server.listen(8787, '127.0.0.1');
31
- * ```
32
- */
33
- export declare function createOpenAICompatibleServer(config: OpenAICompatibleProviderConfig): Server;
34
- //# sourceMappingURL=server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/openai-provider/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA8CpC,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACxC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAoSD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,8BAA8B,GAAG,MAAM,CAc3F"}
@@ -1,335 +0,0 @@
1
- import { randomUUID, timingSafeEqual } from 'node:crypto';
2
- import { createServer } from 'node:http';
3
- const HISTORY_KEY = 'openaiCompatibleProviderMessages';
4
- const MAX_BODY_BYTES = 10_485_760;
5
- const preparedAgents = new WeakSet();
6
- class ApiError extends Error {
7
- status;
8
- type;
9
- code;
10
- param;
11
- constructor(status, message, type = 'invalid_request_error', code = null, param = null) {
12
- super(message);
13
- this.status = status;
14
- this.type = type;
15
- this.code = code;
16
- this.param = param;
17
- }
18
- }
19
- function prepareAgent(agent) {
20
- if (preparedAgents.has(agent))
21
- return;
22
- agent.hook('beforeContext', 'openai-compatible-provider', async (ctx) => {
23
- const messages = ctx.turn.metadata[HISTORY_KEY];
24
- if (!Array.isArray(messages))
25
- return;
26
- ctx.turn.messages.splice(0, ctx.turn.messages.length, ...messages);
27
- });
28
- preparedAgents.add(agent);
29
- }
30
- const DATA_URL_RE = /^data:([^;,]+)?(;base64)?,(.*)$/s;
31
- const EXT_TO_MEDIA = {
32
- png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',
33
- webp: 'image/webp', bmp: 'image/bmp', svg: 'image/svg+xml',
34
- };
35
- function mediaTypeFromUrl(url) {
36
- try {
37
- const ext = new URL(url).pathname.split('.').pop()?.toLowerCase() ?? '';
38
- return EXT_TO_MEDIA[ext] ?? 'image/png';
39
- }
40
- catch {
41
- return 'image/png';
42
- }
43
- }
44
- function toFileData(imageUrl) {
45
- const match = imageUrl.match(DATA_URL_RE);
46
- if (match) {
47
- const mediaType = match[1] || 'image/png';
48
- const isBase64 = Boolean(match[2]);
49
- const payload = match[3];
50
- if (isBase64)
51
- return { mediaType, data: { type: 'data', data: payload } };
52
- return { mediaType, data: { type: 'data', data: decodeURIComponent(payload) } };
53
- }
54
- return { mediaType: mediaTypeFromUrl(imageUrl), data: { type: 'url', url: imageUrl } };
55
- }
56
- function toLibraContent(content, param) {
57
- if (typeof content === 'string')
58
- return content;
59
- if (content === null)
60
- return '';
61
- if (!Array.isArray(content))
62
- throw new ApiError(400, 'Message content must be a string or content-part array.', 'invalid_request_error', null, param);
63
- const parts = [];
64
- for (let i = 0; i < content.length; i++) {
65
- const part = content[i];
66
- const partParam = `${param}.${i}`;
67
- if (part.type === 'text') {
68
- if (typeof part.text !== 'string')
69
- throw new ApiError(400, 'text part must include a string "text".', 'invalid_request_error', null, partParam);
70
- parts.push({ type: 'text', text: part.text });
71
- }
72
- else if (part.type === 'image_url') {
73
- const url = part.image_url?.url;
74
- if (typeof url !== 'string' || !url)
75
- throw new ApiError(400, 'image_url part must include image_url.url.', 'invalid_request_error', null, partParam);
76
- const { mediaType, data } = toFileData(url);
77
- parts.push({ type: 'file', mediaType, data });
78
- }
79
- else {
80
- throw new ApiError(400, `Unsupported content part type: ${part.type}. Supported: text, image_url.`, 'invalid_request_error', null, partParam);
81
- }
82
- }
83
- return parts;
84
- }
85
- function contentToText(content, param) {
86
- const result = toLibraContent(content, param);
87
- if (typeof result === 'string')
88
- return result;
89
- return result.filter((p) => p.type === 'text').map((p) => p.text).join('');
90
- }
91
- function toLibraMessages(messages) {
92
- if (messages.length === 0)
93
- throw new ApiError(400, 'messages must not be empty.', 'invalid_request_error', null, 'messages');
94
- return messages.map((message, index) => {
95
- const param = `messages.${index}`;
96
- if (message.role === 'developer' || message.role === 'system') {
97
- return { role: 'system', content: contentToText(message.content, `${param}.content`) };
98
- }
99
- if (message.role === 'user') {
100
- return { role: 'user', content: toLibraContent(message.content, `${param}.content`) };
101
- }
102
- if (message.role === 'assistant') {
103
- const content = contentToText(message.content, `${param}.content`);
104
- const toolCalls = message.tool_calls?.map((tc) => ({
105
- id: tc.id,
106
- name: tc.function.name,
107
- arguments: tc.function.arguments,
108
- }));
109
- return { role: 'assistant', content, ...(toolCalls?.length && { toolCalls }) };
110
- }
111
- if (message.role === 'tool' && message.tool_call_id) {
112
- return { role: 'tool', content: contentToText(message.content, `${param}.content`), toolCallId: message.tool_call_id, name: message.name };
113
- }
114
- throw new ApiError(400, `Unsupported message role: ${message.role}`, 'invalid_request_error', null, `${param}.role`);
115
- });
116
- }
117
- function toExternalTools(tools) {
118
- return tools.map((tool) => {
119
- if (tool.type !== 'function' || !tool.function?.name) {
120
- throw new ApiError(400, 'Each tool must be type "function" with a function.name.', 'invalid_request_error', null, 'tools');
121
- }
122
- return {
123
- name: tool.function.name,
124
- ...(tool.function.description && { description: tool.function.description }),
125
- parameters: tool.function.parameters ?? { type: 'object', properties: {} },
126
- external: true,
127
- // Never called — external tools are returned to the caller.
128
- async execute() {
129
- return { toolCallId: '', content: 'External tool — executed by the caller.' };
130
- },
131
- };
132
- });
133
- }
134
- function safeEqual(actual, expected) {
135
- const actualBytes = Buffer.from(actual);
136
- const expectedBytes = Buffer.from(expected);
137
- return actualBytes.length === expectedBytes.length && timingSafeEqual(actualBytes, expectedBytes);
138
- }
139
- function requestApiKey(req) {
140
- const authorization = req.headers.authorization;
141
- if (authorization?.startsWith('Bearer '))
142
- return authorization.slice(7);
143
- const header = req.headers['x-api-key'];
144
- return Array.isArray(header) ? header[0] : header;
145
- }
146
- function authenticate(req, apiKeys) {
147
- const candidate = requestApiKey(req);
148
- return candidate !== undefined && apiKeys.some((key) => safeEqual(candidate, key));
149
- }
150
- async function readJson(req) {
151
- req.setEncoding('utf8');
152
- let body = '';
153
- for await (const chunk of req) {
154
- body += chunk;
155
- if (Buffer.byteLength(body) > MAX_BODY_BYTES)
156
- throw new ApiError(413, 'Request body is too large.', 'invalid_request_error');
157
- }
158
- try {
159
- return JSON.parse(body || '{}');
160
- }
161
- catch {
162
- throw new ApiError(400, 'Request body must be valid JSON.', 'invalid_request_error');
163
- }
164
- }
165
- function sendJson(res, status, body, headers = {}) {
166
- res.writeHead(status, {
167
- 'content-type': 'application/json; charset=utf-8',
168
- 'cache-control': 'no-store',
169
- ...headers,
170
- });
171
- res.end(JSON.stringify(body));
172
- }
173
- function sendError(res, error) {
174
- sendJson(res, error.status, {
175
- error: {
176
- message: error.message,
177
- type: error.type,
178
- param: error.param,
179
- code: error.code,
180
- },
181
- }, error.status === 401 ? { 'www-authenticate': 'Bearer' } : {});
182
- }
183
- function completionId() {
184
- return `chatcmpl-${randomUUID().replaceAll('-', '')}`;
185
- }
186
- function openAICompletion(id, created, model, content, finishReason, toolCalls) {
187
- const message = { role: 'assistant', content };
188
- if (toolCalls?.length) {
189
- message.tool_calls = toolCalls.map((tc) => ({
190
- id: tc.id,
191
- type: 'function',
192
- function: { name: tc.name, arguments: tc.arguments },
193
- }));
194
- }
195
- return {
196
- id,
197
- object: 'chat.completion',
198
- created,
199
- model,
200
- choices: [{ index: 0, message, finish_reason: finishReason }],
201
- };
202
- }
203
- function sendStream(res, id, created, model, content, finishReason, toolCalls) {
204
- res.writeHead(200, {
205
- 'content-type': 'text/event-stream; charset=utf-8',
206
- 'cache-control': 'no-cache, no-transform',
207
- connection: 'keep-alive',
208
- });
209
- const chunk = (delta, finish_reason) => {
210
- res.write(`data: ${JSON.stringify({
211
- id,
212
- object: 'chat.completion.chunk',
213
- created,
214
- model,
215
- choices: [{ index: 0, delta, finish_reason }],
216
- })}\n\n`);
217
- };
218
- chunk({ role: 'assistant' }, null);
219
- if (content)
220
- chunk({ content }, null);
221
- if (toolCalls?.length) {
222
- for (const tc of toolCalls) {
223
- chunk({ tool_calls: [{ index: 0, id: tc.id, type: 'function', function: { name: tc.name, arguments: tc.arguments } }] }, null);
224
- }
225
- }
226
- chunk({}, finishReason);
227
- res.end('data: [DONE]\n\n');
228
- }
229
- async function handleRequest(req, res, agents, apiKeys) {
230
- const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
231
- if (!authenticate(req, apiKeys)) {
232
- sendError(res, new ApiError(401, 'Invalid or missing API key.', 'authentication_error', 'invalid_api_key'));
233
- return;
234
- }
235
- if (req.method === 'GET' && pathname === '/v1/models') {
236
- sendJson(res, 200, {
237
- object: 'list',
238
- data: Object.keys(agents).map((id) => ({ id, object: 'model', created: 0, owned_by: 'libra-provider' })),
239
- });
240
- return;
241
- }
242
- if (req.method !== 'POST' || pathname !== '/v1/chat/completions') {
243
- throw new ApiError(404, 'Not found.', 'invalid_request_error', 'not_found');
244
- }
245
- const body = await readJson(req);
246
- if (typeof body.model !== 'string')
247
- throw new ApiError(400, 'model is required.', 'invalid_request_error', null, 'model');
248
- const agent = agents[body.model];
249
- if (!agent)
250
- throw new ApiError(404, `Unknown model: ${body.model}`, 'invalid_request_error', 'model_not_found', 'model');
251
- if (!Array.isArray(body.messages))
252
- throw new ApiError(400, 'messages must be an array.', 'invalid_request_error', null, 'messages');
253
- if (body.n !== undefined && body.n !== 1)
254
- throw new ApiError(400, 'Only n=1 is supported.', 'invalid_request_error', null, 'n');
255
- // Convert client-defined OpenAI tools to external Libra tools.
256
- // External tools are not executed by the agent — their calls are returned
257
- // to the caller as tool_calls in the response.
258
- const externalTools = body.tools ? toExternalTools(body.tools) : undefined;
259
- const messages = toLibraMessages(body.messages);
260
- const latestUserMessage = [...messages].reverse().find((message) => message.role === 'user');
261
- if (!latestUserMessage)
262
- throw new ApiError(400, 'At least one user message is required.', 'invalid_request_error', null, 'messages');
263
- const abort = new AbortController();
264
- req.once('aborted', () => abort.abort());
265
- res.once('close', () => {
266
- if (!res.writableEnded)
267
- abort.abort();
268
- });
269
- const result = await agent.run({
270
- message: latestUserMessage.content,
271
- metadata: { [HISTORY_KEY]: messages },
272
- ...(externalTools?.length && { tools: externalTools }),
273
- signal: abort.signal,
274
- });
275
- if (result.finishReason === 'error')
276
- throw new ApiError(502, 'The Libra agent failed to complete the request.', 'server_error');
277
- const id = completionId();
278
- const created = Math.floor(Date.now() / 1000);
279
- const pendingCalls = result.pendingToolCalls;
280
- const finishReason = result.finishReason === 'max_iterations'
281
- ? 'length'
282
- : result.finishReason === 'tool_calls'
283
- ? 'tool_calls'
284
- : 'stop';
285
- if (body.stream === true)
286
- sendStream(res, id, created, body.model, result.message, finishReason, pendingCalls);
287
- else
288
- sendJson(res, 200, openAICompletion(id, created, body.model, result.message, finishReason, pendingCalls));
289
- }
290
- /**
291
- * Create an OpenAI-compatible HTTP server that exposes Libra agents as models.
292
- *
293
- * Each agent in the `agents` record becomes an OpenAI model ID. The server
294
- * implements `GET /v1/models` and `POST /v1/chat/completions` with bearer/x-api-key
295
- * authentication, text and image content, SSE streaming, and client-defined
296
- * (external) tool calling.
297
- *
298
- * The HTTP server stays out of the core agent — this is an adapter/extra, not
299
- * part of the agent harness itself. Use it when you want to expose Libra agents
300
- * to OpenAI-compatible frameworks and SDKs.
301
- *
302
- * @example
303
- * ```typescript
304
- * import { Agent } from '@xandout/libra-harness';
305
- * import { createOpenAICompatibleServer } from '@xandout/libra-harness/extras/openai-provider';
306
- *
307
- * const server = createOpenAICompatibleServer({
308
- * agents: {
309
- * 'my-agent': new Agent({ model, systemPrompt: 'You are helpful.' }),
310
- * },
311
- * apiKeys: ['your-provider-key'],
312
- * });
313
- * server.listen(8787, '127.0.0.1');
314
- * ```
315
- */
316
- export function createOpenAICompatibleServer(config) {
317
- const apiKeys = [...new Set(config.apiKeys.map((key) => key.trim()).filter(Boolean))];
318
- if (apiKeys.length === 0)
319
- throw new Error('At least one provider API key is required.');
320
- const agents = { ...config.agents };
321
- if (Object.keys(agents).length === 0)
322
- throw new Error('At least one Libra agent is required.');
323
- Object.values(agents).forEach(prepareAgent);
324
- return createServer((req, res) => {
325
- void handleRequest(req, res, agents, apiKeys).catch((error) => {
326
- if (res.writableEnded)
327
- return;
328
- if (error instanceof ApiError)
329
- sendError(res, error);
330
- else
331
- sendError(res, new ApiError(500, 'Internal server error.', 'server_error'));
332
- });
333
- });
334
- }
335
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/openai-provider/server.ts"],"names":[],"mappings":"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"}