model-mux 1.0.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 +42 -0
  3. package/dist/eslint.config.d.ts +3 -0
  4. package/dist/eslint.config.d.ts.map +1 -0
  5. package/dist/eslint.config.js +52 -0
  6. package/dist/eslint.config.js.map +1 -0
  7. package/dist/src/adapter-factory.d.ts +5 -0
  8. package/dist/src/adapter-factory.d.ts.map +1 -0
  9. package/dist/src/adapter-factory.js +11 -0
  10. package/dist/src/adapter-factory.js.map +1 -0
  11. package/dist/src/adapter.d.ts +19 -0
  12. package/dist/src/adapter.d.ts.map +1 -0
  13. package/dist/src/adapter.js +19 -0
  14. package/dist/src/adapter.js.map +1 -0
  15. package/dist/src/anthropic/anthropic-adapter.d.ts +8 -0
  16. package/dist/src/anthropic/anthropic-adapter.d.ts.map +1 -0
  17. package/dist/src/anthropic/anthropic-adapter.js +17 -0
  18. package/dist/src/anthropic/anthropic-adapter.js.map +1 -0
  19. package/dist/src/index.d.ts +15 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +22 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/openai/openai-adapter.d.ts +10 -0
  24. package/dist/src/openai/openai-adapter.d.ts.map +1 -0
  25. package/dist/src/openai/openai-adapter.js +75 -0
  26. package/dist/src/openai/openai-adapter.js.map +1 -0
  27. package/dist/test/integration/openai/openai.it.spec.d.ts +2 -0
  28. package/dist/test/integration/openai/openai.it.spec.d.ts.map +1 -0
  29. package/dist/test/integration/openai/openai.it.spec.js +91 -0
  30. package/dist/test/integration/openai/openai.it.spec.js.map +1 -0
  31. package/dist/test/unit/adapter-factory.spec.d.ts +2 -0
  32. package/dist/test/unit/adapter-factory.spec.d.ts.map +1 -0
  33. package/dist/test/unit/adapter-factory.spec.js +89 -0
  34. package/dist/test/unit/adapter-factory.spec.js.map +1 -0
  35. package/dist/test/unit/adapter.spec.d.ts +2 -0
  36. package/dist/test/unit/adapter.spec.d.ts.map +1 -0
  37. package/dist/test/unit/adapter.spec.js +136 -0
  38. package/dist/test/unit/adapter.spec.js.map +1 -0
  39. package/dist/test/unit/index.spec.d.ts +2 -0
  40. package/dist/test/unit/index.spec.d.ts.map +1 -0
  41. package/dist/test/unit/index.spec.js +193 -0
  42. package/dist/test/unit/index.spec.js.map +1 -0
  43. package/dist/test/unit/openai/openai-adapter.spec.d.ts +2 -0
  44. package/dist/test/unit/openai/openai-adapter.spec.d.ts.map +1 -0
  45. package/dist/test/unit/openai/openai-adapter.spec.js +314 -0
  46. package/dist/test/unit/openai/openai-adapter.spec.js.map +1 -0
  47. package/package.json +70 -0
@@ -0,0 +1,314 @@
1
+ import Chance from 'chance';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import { OpenAIAdapter } from '../../../src/openai/openai-adapter.js';
4
+ const mockCreate = vi.fn();
5
+ vi.mock('openai', () => {
6
+ class MockOpenAI {
7
+ responses = { create: mockCreate };
8
+ constructor() { }
9
+ }
10
+ return { default: MockOpenAI };
11
+ });
12
+ describe('OpenAIAdapter', () => {
13
+ const chance = new Chance();
14
+ let model;
15
+ let baseUrl;
16
+ let headers;
17
+ let apiKey;
18
+ let adapter;
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ model = chance.word();
22
+ baseUrl = chance.url();
23
+ headers = { [chance.word()]: chance.string(), [chance.word()]: chance.string() };
24
+ apiKey = chance.string();
25
+ adapter = new OpenAIAdapter(model, baseUrl, headers, apiKey);
26
+ });
27
+ describe('generate', () => {
28
+ it('should pass model, mapped input, temperature, and max_output_tokens to client.responses.create', async () => {
29
+ // Arrange
30
+ const inputText = chance.sentence();
31
+ const temperature = chance.floating({ min: 0, max: 2 });
32
+ const maxOutputTokens = chance.integer({ min: 1, max: 4096 });
33
+ const llmRequest = {
34
+ contents: [{ parts: [{ text: inputText }] }],
35
+ config: { temperature, maxOutputTokens },
36
+ };
37
+ const outputText = chance.sentence();
38
+ mockCreate.mockResolvedValue({ output_text: outputText });
39
+ // Act
40
+ await adapter.generate(llmRequest);
41
+ // Assert
42
+ expect(mockCreate).toHaveBeenCalledOnce();
43
+ expect(mockCreate).toHaveBeenCalledWith({
44
+ model,
45
+ input: inputText,
46
+ temperature,
47
+ max_output_tokens: maxOutputTokens,
48
+ });
49
+ });
50
+ it('should pass undefined for temperature and max_output_tokens when config is missing', async () => {
51
+ // Arrange
52
+ const inputText = chance.sentence();
53
+ const llmRequest = {
54
+ contents: [{ parts: [{ text: inputText }] }],
55
+ };
56
+ mockCreate.mockResolvedValue({ output_text: chance.sentence() });
57
+ // Act
58
+ await adapter.generate(llmRequest);
59
+ // Assert
60
+ expect(mockCreate).toHaveBeenCalledWith({
61
+ model,
62
+ input: inputText,
63
+ temperature: undefined,
64
+ max_output_tokens: undefined,
65
+ });
66
+ });
67
+ it('should return response with text from output_text', async () => {
68
+ // Arrange
69
+ const outputText = chance.sentence();
70
+ const llmRequest = {
71
+ contents: [{ parts: [{ text: chance.sentence() }] }],
72
+ };
73
+ mockCreate.mockResolvedValue({ output_text: outputText });
74
+ // Act
75
+ const result = await adapter.generate(llmRequest);
76
+ // Assert
77
+ expect(result).toEqual({
78
+ content: {
79
+ role: 'model',
80
+ parts: [{ text: outputText }],
81
+ },
82
+ });
83
+ });
84
+ it('should wrap and rethrow errors from client.responses.create', async () => {
85
+ // Arrange
86
+ const errorMessage = chance.sentence();
87
+ const llmRequest = {
88
+ contents: [{ parts: [{ text: chance.sentence() }] }],
89
+ };
90
+ mockCreate.mockRejectedValue(new Error(errorMessage));
91
+ // Act & Assert
92
+ await expect(adapter.generate(llmRequest)).rejects.toThrow(`OpenAI response creation failed: ${errorMessage}`);
93
+ });
94
+ it('should stringify non-Error thrown values', async () => {
95
+ // Arrange
96
+ const errorValue = chance.sentence();
97
+ const llmRequest = {
98
+ contents: [{ parts: [{ text: chance.sentence() }] }],
99
+ };
100
+ mockCreate.mockRejectedValue(errorValue);
101
+ // Act & Assert
102
+ await expect(adapter.generate(llmRequest)).rejects.toThrow(`OpenAI response creation failed: ${errorValue}`);
103
+ });
104
+ it('should not include stream option in create call', async () => {
105
+ // Arrange
106
+ const llmRequest = {
107
+ contents: [{ parts: [{ text: chance.sentence() }] }],
108
+ };
109
+ mockCreate.mockResolvedValue({ output_text: chance.sentence() });
110
+ // Act
111
+ await adapter.generate(llmRequest);
112
+ // Assert
113
+ const callArgs = mockCreate.mock.calls[0][0];
114
+ expect(callArgs).not.toHaveProperty('stream');
115
+ });
116
+ });
117
+ describe('stream', () => {
118
+ it('should pass model, mapped input, temperature, max_output_tokens, and stream:true to client.responses.create', async () => {
119
+ // Arrange
120
+ const inputText = chance.sentence();
121
+ const temperature = chance.floating({ min: 0, max: 2 });
122
+ const maxOutputTokens = chance.integer({ min: 1, max: 4096 });
123
+ const llmRequest = {
124
+ contents: [{ parts: [{ text: inputText }] }],
125
+ config: { temperature, maxOutputTokens },
126
+ };
127
+ async function* emptyStream() { }
128
+ mockCreate.mockResolvedValue(emptyStream());
129
+ // Act
130
+ for await (const _ of adapter.stream(llmRequest)) {
131
+ // consume
132
+ }
133
+ // Assert
134
+ expect(mockCreate).toHaveBeenCalledOnce();
135
+ expect(mockCreate).toHaveBeenCalledWith({
136
+ model,
137
+ input: inputText,
138
+ temperature,
139
+ max_output_tokens: maxOutputTokens,
140
+ stream: true,
141
+ });
142
+ });
143
+ it('should pass undefined for temperature and max_output_tokens when config is missing', async () => {
144
+ // Arrange
145
+ const inputText = chance.sentence();
146
+ const llmRequest = {
147
+ contents: [{ parts: [{ text: inputText }] }],
148
+ };
149
+ async function* emptyStream() { }
150
+ mockCreate.mockResolvedValue(emptyStream());
151
+ // Act
152
+ for await (const _ of adapter.stream(llmRequest)) {
153
+ // consume
154
+ }
155
+ // Assert
156
+ expect(mockCreate).toHaveBeenCalledWith({
157
+ model,
158
+ input: inputText,
159
+ temperature: undefined,
160
+ max_output_tokens: undefined,
161
+ stream: true,
162
+ });
163
+ });
164
+ it('should yield responses for response.output_text.delta events', async () => {
165
+ // Arrange
166
+ const delta1 = chance.sentence();
167
+ const delta2 = chance.sentence();
168
+ const llmRequest = {
169
+ contents: [{ parts: [{ text: chance.sentence() }] }],
170
+ };
171
+ const event1 = { type: 'response.output_text.delta', delta: delta1 };
172
+ const event2 = { type: 'response.output_text.delta', delta: delta2 };
173
+ async function* fakeStream() {
174
+ yield event1;
175
+ yield event2;
176
+ }
177
+ mockCreate.mockResolvedValue(fakeStream());
178
+ const results = [];
179
+ // Act
180
+ for await (const chunk of adapter.stream(llmRequest)) {
181
+ results.push(chunk);
182
+ }
183
+ // Assert
184
+ expect(results).toHaveLength(2);
185
+ expect(results[0]).toEqual({
186
+ content: { role: 'model', parts: [{ text: delta1 }] },
187
+ partial: true,
188
+ });
189
+ expect(results[1]).toEqual({
190
+ content: { role: 'model', parts: [{ text: delta2 }] },
191
+ partial: true,
192
+ });
193
+ });
194
+ it('should stop yielding when response.completed event is received', async () => {
195
+ // Arrange
196
+ const delta = chance.sentence();
197
+ const llmRequest = {
198
+ contents: [{ parts: [{ text: chance.sentence() }] }],
199
+ };
200
+ async function* fakeStream() {
201
+ yield { type: 'response.output_text.delta', delta };
202
+ yield { type: 'response.completed' };
203
+ yield { type: 'response.output_text.delta', delta: chance.sentence() };
204
+ }
205
+ mockCreate.mockResolvedValue(fakeStream());
206
+ const results = [];
207
+ // Act
208
+ for await (const chunk of adapter.stream(llmRequest)) {
209
+ results.push(chunk);
210
+ }
211
+ // Assert
212
+ expect(results).toHaveLength(2);
213
+ expect(results[0]).toMatchObject({ partial: true });
214
+ expect(results[1]).toMatchObject({ partial: false });
215
+ });
216
+ it('should skip events that are not delta or completed', async () => {
217
+ // Arrange
218
+ const delta = chance.sentence();
219
+ const llmRequest = {
220
+ contents: [{ parts: [{ text: chance.sentence() }] }],
221
+ };
222
+ async function* fakeStream() {
223
+ yield { type: 'response.created' };
224
+ yield { type: 'response.output_text.delta', delta };
225
+ yield { type: 'response.in_progress' };
226
+ }
227
+ mockCreate.mockResolvedValue(fakeStream());
228
+ const results = [];
229
+ // Act
230
+ for await (const chunk of adapter.stream(llmRequest)) {
231
+ results.push(chunk);
232
+ }
233
+ // Assert
234
+ expect(results).toHaveLength(1);
235
+ expect(results[0]).toEqual({
236
+ content: { role: 'model', parts: [{ text: delta }] },
237
+ partial: true,
238
+ });
239
+ });
240
+ it('should not yield for delta events where delta is falsy', async () => {
241
+ // Arrange
242
+ const llmRequest = {
243
+ contents: [{ parts: [{ text: chance.sentence() }] }],
244
+ };
245
+ async function* fakeStream() {
246
+ yield { type: 'response.output_text.delta', delta: '' };
247
+ yield { type: 'response.output_text.delta', delta: null };
248
+ yield { type: 'response.output_text.delta' };
249
+ }
250
+ mockCreate.mockResolvedValue(fakeStream());
251
+ const results = [];
252
+ // Act
253
+ for await (const chunk of adapter.stream(llmRequest)) {
254
+ results.push(chunk);
255
+ }
256
+ // Assert
257
+ expect(results).toHaveLength(0);
258
+ });
259
+ it('should yield nothing when stream has no events', async () => {
260
+ // Arrange
261
+ const llmRequest = {
262
+ contents: [{ parts: [{ text: chance.sentence() }] }],
263
+ };
264
+ async function* emptyStream() { }
265
+ mockCreate.mockResolvedValue(emptyStream());
266
+ const results = [];
267
+ // Act
268
+ for await (const chunk of adapter.stream(llmRequest)) {
269
+ results.push(chunk);
270
+ }
271
+ // Assert
272
+ expect(results).toHaveLength(0);
273
+ });
274
+ it('should wrap and rethrow errors from client.responses.create', async () => {
275
+ // Arrange
276
+ const errorMessage = chance.sentence();
277
+ const llmRequest = {
278
+ contents: [{ parts: [{ text: chance.sentence() }] }],
279
+ };
280
+ mockCreate.mockRejectedValue(new Error(errorMessage));
281
+ // Act & Assert
282
+ await expect(async () => {
283
+ for await (const _ of adapter.stream(llmRequest)) {
284
+ // consume
285
+ }
286
+ }).rejects.toThrow(`OpenAI stream creation failed: ${errorMessage}`);
287
+ });
288
+ it('should stringify non-Error thrown values from create', async () => {
289
+ // Arrange
290
+ const errorValue = chance.sentence();
291
+ const llmRequest = {
292
+ contents: [{ parts: [{ text: chance.sentence() }] }],
293
+ };
294
+ mockCreate.mockRejectedValue(errorValue);
295
+ // Act & Assert
296
+ await expect(async () => {
297
+ for await (const _ of adapter.stream(llmRequest)) {
298
+ // consume
299
+ }
300
+ }).rejects.toThrow(`OpenAI stream creation failed: ${errorValue}`);
301
+ });
302
+ });
303
+ describe('connect', () => {
304
+ it('should throw a not implemented error', async () => {
305
+ // Arrange
306
+ const llmRequest = {
307
+ contents: [{ parts: [{ text: chance.sentence() }] }],
308
+ };
309
+ // Act & Assert
310
+ await expect(adapter.connect(llmRequest)).rejects.toThrow('Not implemented');
311
+ });
312
+ });
313
+ });
314
+ //# sourceMappingURL=openai-adapter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.spec.js","sourceRoot":"","sources":["../../../../test/unit/openai/openai-adapter.spec.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "model-mux",
3
+ "version": "1.0.0",
4
+ "description": "Basically Python LiteLLM for TypeScript Google ADK",
5
+ "keywords": [
6
+ "google-adk",
7
+ "typescript",
8
+ "litellm",
9
+ "openai",
10
+ "anthropic",
11
+ "chatgpt",
12
+ "claude",
13
+ "adapter",
14
+ "llm-gateway",
15
+ "ai-gateway",
16
+ "llm"
17
+ ],
18
+ "license": "MIT",
19
+ "author": "NickChecan",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/The-Nefarious-Developer/model-mux.git"
23
+ },
24
+ "type": "module",
25
+ "main": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "dev": "tsx --watch src/index.ts",
32
+ "build": "tsc",
33
+ "test:all": "vitest run",
34
+ "test:unit": "vitest run test/unit",
35
+ "test:integration": "vitest run test/integration",
36
+ "test:watch": "vitest --watch",
37
+ "test:coverage": "vitest run --coverage",
38
+ "lint": "eslint .",
39
+ "lint:fix": "eslint . --fix",
40
+ "format": "prettier . --write",
41
+ "format:check": "prettier . --check",
42
+ "verify": "npm run format:check && npm run lint && npm run test:all"
43
+ },
44
+ "devDependencies": {
45
+ "@eslint/js": "^9.39.4",
46
+ "@semantic-release/exec": "^7.1.0",
47
+ "@semantic-release/git": "^10.0.1",
48
+ "@semantic-release/npm": "^12.0.2",
49
+ "@types/chance": "^1.1.7",
50
+ "@types/node": "^25.3.5",
51
+ "@vitest/coverage-v8": "^4.0.18",
52
+ "chance": "^1.1.13",
53
+ "dotenv": "^17.3.1",
54
+ "eslint": "^9.39.4",
55
+ "eslint-config-prettier": "^10.1.8",
56
+ "eslint-plugin-import": "^2.32.0",
57
+ "globals": "^17.4.0",
58
+ "jiti": "^2.6.1",
59
+ "prettier": "^3.8.1",
60
+ "semantic-release": "^24.2.9",
61
+ "tsx": "^4.21.0",
62
+ "typescript": "^5.9.3",
63
+ "typescript-eslint": "^8.57.0",
64
+ "vitest": "^4.0.18"
65
+ },
66
+ "dependencies": {
67
+ "@google/adk": "^0.4.0",
68
+ "openai": "^6.25.0"
69
+ }
70
+ }