@antseed/cli 0.1.4 → 0.1.6

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.
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { transformAnthropicMessagesRequestToOpenAIChat, transformOpenAIChatResponseToAnthropicMessage, } from './model-api-adapter.js';
3
+ const enc = new TextEncoder();
4
+ const dec = new TextDecoder();
5
+ function makeRequest(body, path = '/v1/messages') {
6
+ return {
7
+ requestId: 'r1',
8
+ method: 'POST',
9
+ path,
10
+ headers: { 'content-type': 'application/json', 'anthropic-version': '2023-06-01' },
11
+ body: enc.encode(JSON.stringify(body)),
12
+ };
13
+ }
14
+ describe('transformAnthropicMessagesRequestToOpenAIChat', () => {
15
+ it('preserves plain string message content', () => {
16
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({ model: 'claude-3-5-haiku-20241022', messages: [{ role: 'user', content: 'Hello' }], max_tokens: 100 }));
17
+ expect(result).not.toBeNull();
18
+ const body = JSON.parse(dec.decode(result.request.body));
19
+ expect(body.messages[0].content).toBe('Hello');
20
+ });
21
+ it('does NOT produce [object Object] for array content blocks', () => {
22
+ // This is the regression case: Claude Code sends content as [{type:'text', text:'...'}]
23
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({
24
+ model: 'claude-3-5-haiku-20241022',
25
+ messages: [
26
+ { role: 'user', content: [{ type: 'text', text: 'What is 2+2?' }] },
27
+ ],
28
+ max_tokens: 100,
29
+ }));
30
+ expect(result).not.toBeNull();
31
+ const body = JSON.parse(dec.decode(result.request.body));
32
+ const userMsg = body.messages.find((m) => m.role === 'user');
33
+ expect(userMsg.content).toBe('What is 2+2?');
34
+ expect(userMsg.content).not.toBe('[object Object]');
35
+ });
36
+ it('does NOT produce [object Object] for multi-block user messages', () => {
37
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({
38
+ model: 'claude-3-5-haiku-20241022',
39
+ messages: [
40
+ {
41
+ role: 'user',
42
+ content: [
43
+ { type: 'text', text: 'Line one' },
44
+ { type: 'text', text: 'Line two' },
45
+ ],
46
+ },
47
+ ],
48
+ max_tokens: 100,
49
+ }));
50
+ expect(result).not.toBeNull();
51
+ const body = JSON.parse(dec.decode(result.request.body));
52
+ const userMsg = body.messages.find((m) => m.role === 'user');
53
+ expect(userMsg.content).toBe('Line one\nLine two');
54
+ expect(userMsg.content).not.toContain('[object Object]');
55
+ });
56
+ it('does NOT produce [object Object] for assistant array content blocks', () => {
57
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({
58
+ model: 'claude-3-5-haiku-20241022',
59
+ messages: [
60
+ { role: 'user', content: 'Hi' },
61
+ { role: 'assistant', content: [{ type: 'text', text: 'Hello there!' }] },
62
+ { role: 'user', content: 'Good' },
63
+ ],
64
+ max_tokens: 100,
65
+ }));
66
+ expect(result).not.toBeNull();
67
+ const body = JSON.parse(dec.decode(result.request.body));
68
+ const assistantMsg = body.messages.find((m) => m.role === 'assistant');
69
+ expect(assistantMsg.content).toBe('Hello there!');
70
+ expect(assistantMsg.content).not.toBe('[object Object]');
71
+ });
72
+ it('removes anthropic-version and anthropic-beta headers', () => {
73
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({ messages: [{ role: 'user', content: 'hi' }], max_tokens: 10 }));
74
+ expect(result).not.toBeNull();
75
+ expect(result.request.headers['anthropic-version']).toBeUndefined();
76
+ });
77
+ it('rewrites path to /v1/chat/completions', () => {
78
+ const result = transformAnthropicMessagesRequestToOpenAIChat(makeRequest({ messages: [{ role: 'user', content: 'hi' }], max_tokens: 10 }));
79
+ expect(result.request.path).toBe('/v1/chat/completions');
80
+ });
81
+ it('returns null for non-messages paths', () => {
82
+ const req = makeRequest({ messages: [] }, '/v1/embeddings');
83
+ expect(transformAnthropicMessagesRequestToOpenAIChat(req)).toBeNull();
84
+ });
85
+ });
86
+ describe('transformOpenAIChatResponseToAnthropicMessage', () => {
87
+ function makeOAIResponse(body, statusCode = 200) {
88
+ return {
89
+ requestId: 'r1',
90
+ statusCode,
91
+ headers: { 'content-type': 'application/json' },
92
+ body: enc.encode(JSON.stringify(body)),
93
+ };
94
+ }
95
+ it('converts a basic OpenAI response to Anthropic format', () => {
96
+ const oaiBody = {
97
+ id: 'chatcmpl-abc',
98
+ model: 'gpt-4o',
99
+ choices: [{ message: { role: 'assistant', content: 'Hello!' }, finish_reason: 'stop' }],
100
+ usage: { prompt_tokens: 10, completion_tokens: 5 },
101
+ };
102
+ const result = transformOpenAIChatResponseToAnthropicMessage(makeOAIResponse(oaiBody), { streamRequested: false });
103
+ const body = JSON.parse(dec.decode(result.body));
104
+ expect(body.type).toBe('message');
105
+ expect(body.content[0].type).toBe('text');
106
+ expect(body.content[0].text).toBe('Hello!');
107
+ });
108
+ it('maps finish_reason stop → end_turn', () => {
109
+ const oaiBody = {
110
+ id: 'x',
111
+ model: 'gpt-4o',
112
+ choices: [{ message: { role: 'assistant', content: 'Hi' }, finish_reason: 'stop' }],
113
+ usage: { prompt_tokens: 1, completion_tokens: 1 },
114
+ };
115
+ const result = transformOpenAIChatResponseToAnthropicMessage(makeOAIResponse(oaiBody), { streamRequested: false });
116
+ const body = JSON.parse(dec.decode(result.body));
117
+ expect(body.stop_reason).toBe('end_turn');
118
+ });
119
+ });
120
+ //# sourceMappingURL=model-api-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-api-adapter.test.js","sourceRoot":"","sources":["../../src/proxy/model-api-adapter.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antseed/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Antseed Network CLI and Web Dashboard",
5
5
  "type": "module",
6
6
  "files": [
@@ -19,8 +19,8 @@
19
19
  "dotenv": "^16.6.1",
20
20
  "open": "^11.0.0",
21
21
  "ora": "^9.3.0",
22
- "@antseed/node": "0.1.3",
23
- "@antseed/dashboard": "0.1.3"
22
+ "@antseed/node": "0.1.5",
23
+ "@antseed/dashboard": "0.1.4"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^20.11.0",
@@ -36,6 +36,6 @@
36
36
  "start:connect": "node dist/cli/index.js connect",
37
37
  "start:dashboard": "node dist/cli/index.js dashboard",
38
38
  "typecheck": "tsc --noEmit",
39
- "test": "npm run build && node --test dist/config/*.test.js dist/cli/commands/*.test.js"
39
+ "test": "npm run build && node --test dist/config/*.test.js dist/cli/commands/*.test.js dist/proxy/*.test.js"
40
40
  }
41
41
  }