@amodalai/runtime 0.1.25 → 0.1.26
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/dist/src/__tests__/providers.test.d.ts +6 -0
- package/dist/src/__tests__/providers.test.js +209 -0
- package/dist/src/__tests__/providers.test.js.map +1 -0
- package/dist/src/__tests__/sse-contract.test.d.ts +6 -0
- package/dist/src/__tests__/sse-contract.test.js +464 -0
- package/dist/src/__tests__/sse-contract.test.js.map +1 -0
- package/dist/src/__tests__/tools.test.d.ts +6 -0
- package/dist/src/__tests__/tools.test.js +583 -0
- package/dist/src/__tests__/tools.test.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +2 -2
- package/dist/src/agent/config-watcher.test.js +18 -14
- package/dist/src/agent/config-watcher.test.js.map +1 -1
- package/dist/src/agent/local-server.test.js +17 -13
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.js +6 -1
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.js +1 -0
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +2 -0
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.js +1 -0
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +3 -0
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.js +4 -1
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/stores.js +4 -0
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.js +1 -0
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +1 -0
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- package/dist/src/config.d.ts +96 -0
- package/dist/src/config.js +221 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/config.test.d.ts +6 -0
- package/dist/src/config.test.js +235 -0
- package/dist/src/config.test.js.map +1 -0
- package/dist/src/errors.d.ts +145 -0
- package/dist/src/errors.js +218 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/errors.test.d.ts +6 -0
- package/dist/src/errors.test.js +203 -0
- package/dist/src/errors.test.js.map +1 -0
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/logger.d.ts +15 -31
- package/dist/src/logger.js +19 -78
- package/dist/src/logger.js.map +1 -1
- package/dist/src/logger.test.d.ts +6 -0
- package/dist/src/logger.test.js +198 -0
- package/dist/src/logger.test.js.map +1 -0
- package/dist/src/routes/ai-stream.js +4 -1
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-stream.js +3 -1
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.js +1 -0
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/webhooks.js +3 -1
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/server.test.js +66 -62
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/session-manager.test.js +28 -24
- package/dist/src/session/session-manager.test.js.map +1 -1
- package/dist/src/session/session-runner.test.js +22 -18
- package/dist/src/session/session-runner.test.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.js +6 -0
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Provider round-trip integration tests.
|
|
8
|
+
*
|
|
9
|
+
* These make REAL API calls and require provider API keys.
|
|
10
|
+
* Run manually or in CI with secrets configured.
|
|
11
|
+
*
|
|
12
|
+
* Required env vars:
|
|
13
|
+
* ANTHROPIC_API_KEY — for Anthropic tests
|
|
14
|
+
* OPENAI_API_KEY — for OpenAI tests
|
|
15
|
+
* GOOGLE_API_KEY — for Google tests
|
|
16
|
+
* DEEPSEEK_API_KEY — for DeepSeek tests
|
|
17
|
+
*
|
|
18
|
+
* Run a single provider:
|
|
19
|
+
* pnpm --filter @amodalai/runtime vitest run src/__tests__/providers.test.ts -t "Anthropic"
|
|
20
|
+
*/
|
|
21
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
22
|
+
import { createRuntimeProvider } from '@amodalai/core';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Shared test tool: a simple calculator the model can call
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
const calculatorTool = {
|
|
27
|
+
name: 'calculate',
|
|
28
|
+
description: 'Perform basic arithmetic. Returns the numeric result.',
|
|
29
|
+
parameters: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
operation: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
enum: ['add', 'subtract', 'multiply', 'divide'],
|
|
35
|
+
description: 'The arithmetic operation to perform',
|
|
36
|
+
},
|
|
37
|
+
a: { type: 'number', description: 'First operand' },
|
|
38
|
+
b: { type: 'number', description: 'Second operand' },
|
|
39
|
+
},
|
|
40
|
+
required: ['operation', 'a', 'b'],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Helpers
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
const TIMEOUT = 60_000;
|
|
47
|
+
function makeTextRequest(model, prompt) {
|
|
48
|
+
return {
|
|
49
|
+
model,
|
|
50
|
+
systemPrompt: 'You are a helpful assistant. Be concise.',
|
|
51
|
+
messages: [{ role: 'user', content: prompt }],
|
|
52
|
+
tools: [],
|
|
53
|
+
maxTokens: 256,
|
|
54
|
+
signal: AbortSignal.timeout(TIMEOUT),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function makeToolRequest(model) {
|
|
58
|
+
return {
|
|
59
|
+
model,
|
|
60
|
+
systemPrompt: 'You are a helpful assistant. When asked to calculate something, ALWAYS use the calculate tool. Do not compute the answer yourself.',
|
|
61
|
+
messages: [
|
|
62
|
+
{
|
|
63
|
+
role: 'user',
|
|
64
|
+
content: 'What is 7 multiplied by 6? Use the calculate tool.',
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
tools: [calculatorTool],
|
|
68
|
+
maxTokens: 256,
|
|
69
|
+
signal: AbortSignal.timeout(TIMEOUT),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function collectStreamEvents(provider, request) {
|
|
73
|
+
const events = [];
|
|
74
|
+
if (!provider.chatStream) {
|
|
75
|
+
throw new Error('Provider does not support chatStream');
|
|
76
|
+
}
|
|
77
|
+
for await (const event of provider.chatStream(request)) {
|
|
78
|
+
events.push(event);
|
|
79
|
+
}
|
|
80
|
+
return events;
|
|
81
|
+
}
|
|
82
|
+
function assertTextResponse(response) {
|
|
83
|
+
const textBlocks = response.content.filter((b) => b.type === 'text');
|
|
84
|
+
expect(textBlocks.length).toBeGreaterThan(0);
|
|
85
|
+
const fullText = textBlocks.map((b) => b.type === 'text' ? b.text : '').join('');
|
|
86
|
+
expect(fullText.length).toBeGreaterThan(0);
|
|
87
|
+
}
|
|
88
|
+
function assertToolCallResponse(response) {
|
|
89
|
+
const toolBlocks = response.content.filter((b) => b.type === 'tool_use');
|
|
90
|
+
expect(toolBlocks.length).toBeGreaterThan(0);
|
|
91
|
+
const calcCall = toolBlocks.find((b) => b.type === 'tool_use' && b.name === 'calculate');
|
|
92
|
+
expect(calcCall).toBeDefined();
|
|
93
|
+
if (calcCall && calcCall.type === 'tool_use') {
|
|
94
|
+
expect(calcCall.input).toBeDefined();
|
|
95
|
+
expect(calcCall.input['operation']).toBe('multiply');
|
|
96
|
+
expect(calcCall.input['a']).toBe(7);
|
|
97
|
+
expect(calcCall.input['b']).toBe(6);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function assertStreamHasText(events) {
|
|
101
|
+
const textDeltas = events.filter((e) => e.type === 'text_delta');
|
|
102
|
+
expect(textDeltas.length).toBeGreaterThan(0);
|
|
103
|
+
const fullText = textDeltas
|
|
104
|
+
.map((e) => (e.type === 'text_delta' ? e.text : ''))
|
|
105
|
+
.join('');
|
|
106
|
+
expect(fullText.length).toBeGreaterThan(0);
|
|
107
|
+
}
|
|
108
|
+
function assertStreamHasToolCall(events) {
|
|
109
|
+
const toolStarts = events.filter((e) => e.type === 'tool_use_start');
|
|
110
|
+
expect(toolStarts.length).toBeGreaterThan(0);
|
|
111
|
+
const calcStart = toolStarts.find((e) => e.type === 'tool_use_start' && e.name === 'calculate');
|
|
112
|
+
expect(calcStart).toBeDefined();
|
|
113
|
+
const toolEnds = events.filter((e) => e.type === 'tool_use_end');
|
|
114
|
+
expect(toolEnds.length).toBeGreaterThan(0);
|
|
115
|
+
const calcEnd = toolEnds.find((e) => e.type === 'tool_use_end' && e.input['operation'] === 'multiply');
|
|
116
|
+
expect(calcEnd).toBeDefined();
|
|
117
|
+
}
|
|
118
|
+
function assertStreamEndsCleanly(events) {
|
|
119
|
+
const endEvents = events.filter((e) => e.type === 'message_end');
|
|
120
|
+
expect(endEvents.length).toBe(1);
|
|
121
|
+
const end = endEvents[0];
|
|
122
|
+
if (end && end.type === 'message_end') {
|
|
123
|
+
expect(['end_turn', 'tool_use']).toContain(end.stopReason);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function assertUsage(response) {
|
|
127
|
+
expect(response.usage).toBeDefined();
|
|
128
|
+
if (response.usage) {
|
|
129
|
+
expect(response.usage.inputTokens).toBeGreaterThan(0);
|
|
130
|
+
expect(response.usage.outputTokens).toBeGreaterThan(0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Provider test suite factory
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
function describeProvider(name, providerName, model, envVar) {
|
|
137
|
+
const apiKey = process.env[envVar];
|
|
138
|
+
const fn = apiKey ? describe : describe.skip;
|
|
139
|
+
fn(`${name} (${model})`, () => {
|
|
140
|
+
let provider;
|
|
141
|
+
beforeAll(() => {
|
|
142
|
+
const credentials = {};
|
|
143
|
+
// OpenAI-compatible providers (deepseek, groq, etc.) need the key as OPENAI_API_KEY
|
|
144
|
+
// because the OpenAI provider constructor reads that field.
|
|
145
|
+
// The factory normally handles this, but we pass credentials explicitly here.
|
|
146
|
+
const openaiCompatible = ['deepseek', 'groq', 'mistral', 'xai'];
|
|
147
|
+
if (openaiCompatible.includes(providerName)) {
|
|
148
|
+
credentials['OPENAI_API_KEY'] = apiKey ?? '';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
credentials[envVar] = apiKey ?? '';
|
|
152
|
+
}
|
|
153
|
+
provider = createRuntimeProvider({
|
|
154
|
+
provider: providerName,
|
|
155
|
+
model,
|
|
156
|
+
credentials,
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('chat() — text response', () => {
|
|
160
|
+
it('returns a text response', async () => {
|
|
161
|
+
const response = await provider.chat(makeTextRequest(model, 'What is the capital of France? Answer in one word.'));
|
|
162
|
+
assertTextResponse(response);
|
|
163
|
+
assertUsage(response);
|
|
164
|
+
const text = response.content
|
|
165
|
+
.filter((b) => b.type === 'text')
|
|
166
|
+
.map((b) => (b.type === 'text' ? b.text : ''))
|
|
167
|
+
.join('');
|
|
168
|
+
expect(text.toLowerCase()).toContain('paris');
|
|
169
|
+
}, TIMEOUT);
|
|
170
|
+
});
|
|
171
|
+
describe('chat() — tool call', () => {
|
|
172
|
+
it('calls the calculate tool with correct arguments', async () => {
|
|
173
|
+
const response = await provider.chat(makeToolRequest(model));
|
|
174
|
+
assertToolCallResponse(response);
|
|
175
|
+
}, TIMEOUT);
|
|
176
|
+
});
|
|
177
|
+
describe('chatStream() — streaming text', () => {
|
|
178
|
+
it('streams text deltas and ends cleanly', async () => {
|
|
179
|
+
if (!provider.chatStream) {
|
|
180
|
+
return; // skip if no streaming support
|
|
181
|
+
}
|
|
182
|
+
const events = await collectStreamEvents(provider, makeTextRequest(model, 'What is the capital of France? Answer in one word.'));
|
|
183
|
+
assertStreamHasText(events);
|
|
184
|
+
assertStreamEndsCleanly(events);
|
|
185
|
+
}, TIMEOUT);
|
|
186
|
+
});
|
|
187
|
+
describe('chatStream() — streaming tool call', () => {
|
|
188
|
+
it('streams tool_use events with correct arguments', async () => {
|
|
189
|
+
if (!provider.chatStream) {
|
|
190
|
+
return; // skip if no streaming support
|
|
191
|
+
}
|
|
192
|
+
const events = await collectStreamEvents(provider, makeToolRequest(model));
|
|
193
|
+
assertStreamHasToolCall(events);
|
|
194
|
+
assertStreamEndsCleanly(events);
|
|
195
|
+
}, TIMEOUT);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// Provider test suites
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
describe('Provider Round-Trip Tests', () => {
|
|
203
|
+
describeProvider('Anthropic', 'anthropic', 'claude-sonnet-4-20250514', 'ANTHROPIC_API_KEY');
|
|
204
|
+
describeProvider('OpenAI', 'openai', 'gpt-4o-mini', 'OPENAI_API_KEY');
|
|
205
|
+
describeProvider('Google', 'google', 'gemini-2.5-flash', 'GOOGLE_API_KEY');
|
|
206
|
+
describeProvider('DeepSeek', 'deepseek', 'deepseek-chat', 'DEEPSEEK_API_KEY');
|
|
207
|
+
describeProvider('Groq', 'groq', 'llama-3.3-70b-versatile', 'GROQ_API_KEY');
|
|
208
|
+
});
|
|
209
|
+
//# sourceMappingURL=providers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../../src/__tests__/providers.test.ts"],"names":[],"mappings":"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"}
|