@amodalai/runtime 0.3.24 → 0.3.25

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amodalai/runtime",
3
- "version": "0.3.24",
3
+ "version": "0.3.25",
4
4
  "description": "Agent Runtime Platform — HTTP server for repo and platform modes",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,7 +21,6 @@
21
21
  "@ai-sdk/anthropic": "^3.0.66",
22
22
  "@ai-sdk/google": "^3.0.58",
23
23
  "@ai-sdk/openai": "^3.0.50",
24
- "@anthropic-ai/sdk": "^0.39.0",
25
24
  "@mozilla/readability": "^0.6.0",
26
25
  "ai": "^6.0.145",
27
26
  "drizzle-orm": "^0.45.2",
@@ -34,9 +33,9 @@
34
33
  "pg": "^8.13.1",
35
34
  "zod": "^3.25.0",
36
35
  "zod-to-json-schema": "^3.25.2",
37
- "@amodalai/core": "0.3.24",
38
- "@amodalai/db": "0.3.24",
39
- "@amodalai/types": "0.3.24"
36
+ "@amodalai/core": "0.3.25",
37
+ "@amodalai/db": "0.3.25",
38
+ "@amodalai/types": "0.3.25"
40
39
  },
41
40
  "devDependencies": {
42
41
  "@types/express": "^4.17.21",
@@ -1,6 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- export {};
@@ -1,209 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../../src/__tests__/providers.test.ts"],"names":[],"mappings":"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"}