@appkit/llamacpp-cli 1.12.1 → 1.14.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.
- package/README.md +115 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/launch/claude.d.ts +6 -0
- package/dist/commands/launch/claude.d.ts.map +1 -0
- package/dist/commands/launch/claude.js +282 -0
- package/dist/commands/launch/claude.js.map +1 -0
- package/dist/lib/anthropic-converter.d.ts +15 -0
- package/dist/lib/anthropic-converter.d.ts.map +1 -0
- package/dist/lib/anthropic-converter.js +276 -0
- package/dist/lib/anthropic-converter.js.map +1 -0
- package/dist/lib/anthropic-stream-converter.d.ts +35 -0
- package/dist/lib/anthropic-stream-converter.d.ts.map +1 -0
- package/dist/lib/anthropic-stream-converter.js +227 -0
- package/dist/lib/anthropic-stream-converter.js.map +1 -0
- package/dist/lib/integration-checker.d.ts +26 -0
- package/dist/lib/integration-checker.d.ts.map +1 -0
- package/dist/lib/integration-checker.js +77 -0
- package/dist/lib/integration-checker.js.map +1 -0
- package/dist/lib/router-manager.d.ts +4 -0
- package/dist/lib/router-manager.d.ts.map +1 -1
- package/dist/lib/router-manager.js +10 -0
- package/dist/lib/router-manager.js.map +1 -1
- package/dist/lib/router-server.d.ts +21 -0
- package/dist/lib/router-server.d.ts.map +1 -1
- package/dist/lib/router-server.js +370 -7
- package/dist/lib/router-server.js.map +1 -1
- package/dist/types/anthropic-types.d.ts +198 -0
- package/dist/types/anthropic-types.d.ts.map +1 -0
- package/dist/types/anthropic-types.js +5 -0
- package/dist/types/anthropic-types.js.map +1 -0
- package/dist/types/integration-config.d.ts +32 -0
- package/dist/types/integration-config.d.ts.map +1 -0
- package/dist/types/integration-config.js +3 -0
- package/dist/types/integration-config.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fromMessagesRequest = fromMessagesRequest;
|
|
4
|
+
exports.toMessagesResponse = toMessagesResponse;
|
|
5
|
+
exports.generateMessageId = generateMessageId;
|
|
6
|
+
exports.generateRequestId = generateRequestId;
|
|
7
|
+
exports.estimateInputTokens = estimateInputTokens;
|
|
8
|
+
exports.createAnthropicError = createAnthropicError;
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Request Conversion: Anthropic → OpenAI
|
|
12
|
+
// ============================================================================
|
|
13
|
+
function fromMessagesRequest(req) {
|
|
14
|
+
const messages = [];
|
|
15
|
+
// Convert system prompt if present
|
|
16
|
+
if (req.system) {
|
|
17
|
+
const systemContent = typeof req.system === 'string'
|
|
18
|
+
? req.system
|
|
19
|
+
: extractTextFromContentBlocks(req.system);
|
|
20
|
+
if (systemContent) {
|
|
21
|
+
messages.push({ role: 'system', content: systemContent });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Convert messages
|
|
25
|
+
for (const msg of req.messages) {
|
|
26
|
+
const converted = convertAnthropicMessage(msg);
|
|
27
|
+
messages.push(...converted);
|
|
28
|
+
}
|
|
29
|
+
// Convert tools
|
|
30
|
+
const tools = req.tools?.length
|
|
31
|
+
? req.tools.map(convertAnthropicTool)
|
|
32
|
+
: undefined;
|
|
33
|
+
// Convert tool_choice
|
|
34
|
+
let toolChoice = undefined;
|
|
35
|
+
if (req.tool_choice) {
|
|
36
|
+
if (req.tool_choice.type === 'auto') {
|
|
37
|
+
toolChoice = 'auto';
|
|
38
|
+
}
|
|
39
|
+
else if (req.tool_choice.type === 'none') {
|
|
40
|
+
toolChoice = 'none';
|
|
41
|
+
}
|
|
42
|
+
else if (req.tool_choice.type === 'tool' && req.tool_choice.name) {
|
|
43
|
+
toolChoice = {
|
|
44
|
+
type: 'function',
|
|
45
|
+
function: { name: req.tool_choice.name },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
model: req.model,
|
|
51
|
+
messages,
|
|
52
|
+
temperature: req.temperature,
|
|
53
|
+
top_p: req.top_p,
|
|
54
|
+
max_tokens: req.max_tokens,
|
|
55
|
+
stop: req.stop_sequences,
|
|
56
|
+
stream: req.stream,
|
|
57
|
+
tools,
|
|
58
|
+
tool_choice: toolChoice,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function convertAnthropicMessage(msg) {
|
|
62
|
+
const messages = [];
|
|
63
|
+
const role = msg.role.toLowerCase();
|
|
64
|
+
// Simple string content
|
|
65
|
+
if (typeof msg.content === 'string') {
|
|
66
|
+
messages.push({ role, content: msg.content });
|
|
67
|
+
return messages;
|
|
68
|
+
}
|
|
69
|
+
// Complex content blocks
|
|
70
|
+
let textContent = '';
|
|
71
|
+
const toolCalls = [];
|
|
72
|
+
const toolResults = [];
|
|
73
|
+
for (const block of msg.content) {
|
|
74
|
+
switch (block.type) {
|
|
75
|
+
case 'text':
|
|
76
|
+
if (block.text) {
|
|
77
|
+
textContent += block.text;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'image':
|
|
81
|
+
// OpenAI doesn't support images in the same way
|
|
82
|
+
// Skip for now (would need to convert to base64 data URL)
|
|
83
|
+
break;
|
|
84
|
+
case 'tool_use':
|
|
85
|
+
if (block.id && block.name) {
|
|
86
|
+
toolCalls.push({
|
|
87
|
+
id: block.id,
|
|
88
|
+
type: 'function',
|
|
89
|
+
function: {
|
|
90
|
+
name: block.name,
|
|
91
|
+
arguments: JSON.stringify(block.input || {}),
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
96
|
+
case 'tool_result':
|
|
97
|
+
if (block.tool_use_id) {
|
|
98
|
+
const resultContent = typeof block.content === 'string'
|
|
99
|
+
? block.content
|
|
100
|
+
: extractTextFromContentBlocks(block.content || []);
|
|
101
|
+
toolResults.push({
|
|
102
|
+
role: 'tool',
|
|
103
|
+
content: resultContent,
|
|
104
|
+
tool_call_id: block.tool_use_id,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Add main message if there's text or tool calls
|
|
111
|
+
if (textContent || toolCalls.length > 0) {
|
|
112
|
+
const message = {
|
|
113
|
+
role,
|
|
114
|
+
content: textContent,
|
|
115
|
+
};
|
|
116
|
+
if (toolCalls.length > 0) {
|
|
117
|
+
message.tool_calls = toolCalls;
|
|
118
|
+
}
|
|
119
|
+
messages.push(message);
|
|
120
|
+
}
|
|
121
|
+
// Add tool result messages
|
|
122
|
+
messages.push(...toolResults);
|
|
123
|
+
return messages;
|
|
124
|
+
}
|
|
125
|
+
function convertAnthropicTool(tool) {
|
|
126
|
+
return {
|
|
127
|
+
type: 'function',
|
|
128
|
+
function: {
|
|
129
|
+
name: tool.name,
|
|
130
|
+
description: tool.description,
|
|
131
|
+
parameters: tool.input_schema,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function extractTextFromContentBlocks(blocks) {
|
|
136
|
+
return blocks
|
|
137
|
+
.filter(block => block.type === 'text' && block.text)
|
|
138
|
+
.map(block => block.text)
|
|
139
|
+
.join('');
|
|
140
|
+
}
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Response Conversion: OpenAI → Anthropic
|
|
143
|
+
// ============================================================================
|
|
144
|
+
function toMessagesResponse(openaiRes, messageId) {
|
|
145
|
+
const id = messageId || generateMessageId();
|
|
146
|
+
const choice = openaiRes.choices[0];
|
|
147
|
+
const message = choice.message;
|
|
148
|
+
const content = [];
|
|
149
|
+
// Add text content
|
|
150
|
+
if (message.content) {
|
|
151
|
+
content.push({
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: message.content,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Add tool calls
|
|
157
|
+
if (message.tool_calls) {
|
|
158
|
+
for (const tc of message.tool_calls) {
|
|
159
|
+
content.push({
|
|
160
|
+
type: 'tool_use',
|
|
161
|
+
id: tc.id,
|
|
162
|
+
name: tc.function.name,
|
|
163
|
+
input: JSON.parse(tc.function.arguments || '{}'),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const stopReason = mapStopReason(choice.finish_reason, message.tool_calls?.length ?? 0);
|
|
168
|
+
return {
|
|
169
|
+
id,
|
|
170
|
+
type: 'message',
|
|
171
|
+
role: 'assistant',
|
|
172
|
+
model: openaiRes.model,
|
|
173
|
+
content,
|
|
174
|
+
stop_reason: stopReason,
|
|
175
|
+
usage: {
|
|
176
|
+
input_tokens: openaiRes.usage.prompt_tokens,
|
|
177
|
+
output_tokens: openaiRes.usage.completion_tokens,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function mapStopReason(finishReason, toolCallsCount) {
|
|
182
|
+
if (toolCallsCount > 0) {
|
|
183
|
+
return 'tool_use';
|
|
184
|
+
}
|
|
185
|
+
switch (finishReason) {
|
|
186
|
+
case 'stop':
|
|
187
|
+
return 'end_turn';
|
|
188
|
+
case 'length':
|
|
189
|
+
return 'max_tokens';
|
|
190
|
+
case 'tool_calls':
|
|
191
|
+
return 'tool_use';
|
|
192
|
+
default:
|
|
193
|
+
return 'end_turn';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// Utility Functions
|
|
198
|
+
// ============================================================================
|
|
199
|
+
function generateMessageId() {
|
|
200
|
+
const bytes = (0, crypto_1.randomBytes)(12);
|
|
201
|
+
return `msg_${bytes.toString('hex')}`;
|
|
202
|
+
}
|
|
203
|
+
function generateRequestId() {
|
|
204
|
+
const bytes = (0, crypto_1.randomBytes)(12);
|
|
205
|
+
return `req_${bytes.toString('hex')}`;
|
|
206
|
+
}
|
|
207
|
+
function estimateInputTokens(req) {
|
|
208
|
+
let totalLength = 0;
|
|
209
|
+
// Count system prompt
|
|
210
|
+
if (req.system) {
|
|
211
|
+
if (typeof req.system === 'string') {
|
|
212
|
+
totalLength += req.system.length;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
totalLength += extractTextFromContentBlocks(req.system).length;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Count messages
|
|
219
|
+
for (const msg of req.messages) {
|
|
220
|
+
totalLength += msg.role.length;
|
|
221
|
+
if (typeof msg.content === 'string') {
|
|
222
|
+
totalLength += msg.content.length;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
totalLength += extractTextFromContentBlocks(msg.content).length;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Count tools
|
|
229
|
+
if (req.tools) {
|
|
230
|
+
for (const tool of req.tools) {
|
|
231
|
+
totalLength += tool.name.length;
|
|
232
|
+
totalLength += tool.description?.length ?? 0;
|
|
233
|
+
totalLength += JSON.stringify(tool.input_schema || {}).length;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Rough estimate: 1 token ≈ 4 characters
|
|
237
|
+
return Math.max(1, Math.floor(totalLength / 4));
|
|
238
|
+
}
|
|
239
|
+
// ============================================================================
|
|
240
|
+
// Error Response Creation
|
|
241
|
+
// ============================================================================
|
|
242
|
+
function createAnthropicError(statusCode, message) {
|
|
243
|
+
let errorType;
|
|
244
|
+
switch (statusCode) {
|
|
245
|
+
case 400:
|
|
246
|
+
errorType = 'invalid_request_error';
|
|
247
|
+
break;
|
|
248
|
+
case 401:
|
|
249
|
+
errorType = 'authentication_error';
|
|
250
|
+
break;
|
|
251
|
+
case 403:
|
|
252
|
+
errorType = 'permission_error';
|
|
253
|
+
break;
|
|
254
|
+
case 404:
|
|
255
|
+
errorType = 'not_found_error';
|
|
256
|
+
break;
|
|
257
|
+
case 429:
|
|
258
|
+
errorType = 'rate_limit_error';
|
|
259
|
+
break;
|
|
260
|
+
case 503:
|
|
261
|
+
case 529:
|
|
262
|
+
errorType = 'overloaded_error';
|
|
263
|
+
break;
|
|
264
|
+
default:
|
|
265
|
+
errorType = 'api_error';
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
type: 'error',
|
|
269
|
+
error: {
|
|
270
|
+
type: errorType,
|
|
271
|
+
message,
|
|
272
|
+
},
|
|
273
|
+
request_id: generateRequestId(),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=anthropic-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-converter.js","sourceRoot":"","sources":["../../src/lib/anthropic-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { OpenAIChatStreamChunk, AnthropicStreamEvent } from '../types/anthropic-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* StreamConverter manages state for converting OpenAI streaming responses to Anthropic format.
|
|
4
|
+
*
|
|
5
|
+
* It tracks the current state of content blocks and emits proper Anthropic SSE events.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AnthropicStreamConverter {
|
|
8
|
+
private id;
|
|
9
|
+
private model;
|
|
10
|
+
private firstChunk;
|
|
11
|
+
private contentIndex;
|
|
12
|
+
private inputTokens;
|
|
13
|
+
private outputTokens;
|
|
14
|
+
private estimatedInputTokens;
|
|
15
|
+
private textStarted;
|
|
16
|
+
private currentTextContent;
|
|
17
|
+
private toolCallsInProgress;
|
|
18
|
+
private toolCallsSent;
|
|
19
|
+
constructor(id: string, model: string, estimatedInputTokens: number);
|
|
20
|
+
/**
|
|
21
|
+
* Process an OpenAI streaming chunk and return Anthropic events.
|
|
22
|
+
*/
|
|
23
|
+
process(chunk: OpenAIChatStreamChunk): AnthropicStreamEvent[];
|
|
24
|
+
private processToolCallDelta;
|
|
25
|
+
private createMessageStartEvent;
|
|
26
|
+
private createContentBlockStartEvent;
|
|
27
|
+
private createToolUseStartEvent;
|
|
28
|
+
private createTextDeltaEvent;
|
|
29
|
+
private createInputJsonDeltaEvent;
|
|
30
|
+
private createContentBlockStopEvent;
|
|
31
|
+
private createMessageDeltaEvent;
|
|
32
|
+
private createMessageStopEvent;
|
|
33
|
+
private mapFinishReason;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=anthropic-stream-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-stream-converter.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic-stream-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAOrB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,oBAAoB,CAAS;IAGrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,aAAa,CAAqB;gBAE9B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM;IAOnE;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,oBAAoB,EAAE;IA+D7D,OAAO,CAAC,oBAAoB;IA4D5B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,eAAe;CAkBxB"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnthropicStreamConverter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* StreamConverter manages state for converting OpenAI streaming responses to Anthropic format.
|
|
6
|
+
*
|
|
7
|
+
* It tracks the current state of content blocks and emits proper Anthropic SSE events.
|
|
8
|
+
*/
|
|
9
|
+
class AnthropicStreamConverter {
|
|
10
|
+
constructor(id, model, estimatedInputTokens) {
|
|
11
|
+
this.firstChunk = true;
|
|
12
|
+
this.contentIndex = 0;
|
|
13
|
+
this.outputTokens = 0;
|
|
14
|
+
// State tracking
|
|
15
|
+
this.textStarted = false;
|
|
16
|
+
this.currentTextContent = '';
|
|
17
|
+
this.toolCallsInProgress = new Map();
|
|
18
|
+
this.toolCallsSent = new Set();
|
|
19
|
+
this.id = id;
|
|
20
|
+
this.model = model;
|
|
21
|
+
this.estimatedInputTokens = estimatedInputTokens;
|
|
22
|
+
this.inputTokens = estimatedInputTokens;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Process an OpenAI streaming chunk and return Anthropic events.
|
|
26
|
+
*/
|
|
27
|
+
process(chunk) {
|
|
28
|
+
const events = [];
|
|
29
|
+
// First chunk: emit message_start
|
|
30
|
+
if (this.firstChunk) {
|
|
31
|
+
this.firstChunk = false;
|
|
32
|
+
events.push(this.createMessageStartEvent());
|
|
33
|
+
}
|
|
34
|
+
const choice = chunk.choices[0];
|
|
35
|
+
if (!choice) {
|
|
36
|
+
return events;
|
|
37
|
+
}
|
|
38
|
+
const delta = choice.delta;
|
|
39
|
+
// Handle text content
|
|
40
|
+
if (delta.content) {
|
|
41
|
+
if (!this.textStarted) {
|
|
42
|
+
this.textStarted = true;
|
|
43
|
+
events.push(this.createContentBlockStartEvent('text'));
|
|
44
|
+
}
|
|
45
|
+
this.currentTextContent += delta.content;
|
|
46
|
+
events.push(this.createTextDeltaEvent(delta.content));
|
|
47
|
+
}
|
|
48
|
+
// Handle tool calls
|
|
49
|
+
if (delta.tool_calls) {
|
|
50
|
+
for (const toolCallDelta of delta.tool_calls) {
|
|
51
|
+
const index = toolCallDelta.index;
|
|
52
|
+
const tcEvents = this.processToolCallDelta(toolCallDelta);
|
|
53
|
+
events.push(...tcEvents);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Handle completion
|
|
57
|
+
if (choice.finish_reason) {
|
|
58
|
+
// Close any open content blocks
|
|
59
|
+
if (this.textStarted) {
|
|
60
|
+
events.push(this.createContentBlockStopEvent(this.contentIndex));
|
|
61
|
+
this.contentIndex++;
|
|
62
|
+
}
|
|
63
|
+
// Close any open tool calls
|
|
64
|
+
for (const [index, state] of this.toolCallsInProgress.entries()) {
|
|
65
|
+
if (state.started && !state.completed) {
|
|
66
|
+
events.push(this.createContentBlockStopEvent(state.blockIndex));
|
|
67
|
+
state.completed = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Emit message_delta with stop reason
|
|
71
|
+
const stopReason = this.mapFinishReason(choice.finish_reason);
|
|
72
|
+
events.push(this.createMessageDeltaEvent(stopReason));
|
|
73
|
+
// Emit message_stop
|
|
74
|
+
events.push(this.createMessageStopEvent());
|
|
75
|
+
}
|
|
76
|
+
return events;
|
|
77
|
+
}
|
|
78
|
+
processToolCallDelta(toolCallDelta) {
|
|
79
|
+
const events = [];
|
|
80
|
+
const index = toolCallDelta.index;
|
|
81
|
+
// Get or create tool call state
|
|
82
|
+
let state = this.toolCallsInProgress.get(index);
|
|
83
|
+
if (!state) {
|
|
84
|
+
state = {
|
|
85
|
+
id: '',
|
|
86
|
+
name: '',
|
|
87
|
+
arguments: '',
|
|
88
|
+
started: false,
|
|
89
|
+
completed: false,
|
|
90
|
+
blockIndex: -1,
|
|
91
|
+
};
|
|
92
|
+
this.toolCallsInProgress.set(index, state);
|
|
93
|
+
}
|
|
94
|
+
// Accumulate tool call data
|
|
95
|
+
if (toolCallDelta.id) {
|
|
96
|
+
state.id = toolCallDelta.id;
|
|
97
|
+
}
|
|
98
|
+
if (toolCallDelta.function?.name) {
|
|
99
|
+
state.name = toolCallDelta.function.name;
|
|
100
|
+
}
|
|
101
|
+
if (toolCallDelta.function?.arguments) {
|
|
102
|
+
state.arguments += toolCallDelta.function.arguments;
|
|
103
|
+
}
|
|
104
|
+
// Start tool call block when we have id and name
|
|
105
|
+
if (!state.started && state.id && state.name) {
|
|
106
|
+
// Close text block if open
|
|
107
|
+
if (this.textStarted) {
|
|
108
|
+
events.push(this.createContentBlockStopEvent(this.contentIndex));
|
|
109
|
+
this.contentIndex++;
|
|
110
|
+
this.textStarted = false;
|
|
111
|
+
}
|
|
112
|
+
state.started = true;
|
|
113
|
+
state.blockIndex = this.contentIndex;
|
|
114
|
+
events.push(this.createToolUseStartEvent(state.id, state.name));
|
|
115
|
+
}
|
|
116
|
+
// Emit input_json_delta if we have arguments
|
|
117
|
+
if (state.started && toolCallDelta.function?.arguments) {
|
|
118
|
+
events.push(this.createInputJsonDeltaEvent(state.blockIndex, toolCallDelta.function.arguments));
|
|
119
|
+
}
|
|
120
|
+
return events;
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Event Creation Methods
|
|
124
|
+
// ============================================================================
|
|
125
|
+
createMessageStartEvent() {
|
|
126
|
+
return {
|
|
127
|
+
type: 'message_start',
|
|
128
|
+
message: {
|
|
129
|
+
id: this.id,
|
|
130
|
+
type: 'message',
|
|
131
|
+
role: 'assistant',
|
|
132
|
+
model: this.model,
|
|
133
|
+
content: [],
|
|
134
|
+
usage: {
|
|
135
|
+
input_tokens: this.inputTokens,
|
|
136
|
+
output_tokens: 0,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
createContentBlockStartEvent(type) {
|
|
142
|
+
return {
|
|
143
|
+
type: 'content_block_start',
|
|
144
|
+
index: this.contentIndex,
|
|
145
|
+
content_block: {
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: '',
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
createToolUseStartEvent(id, name) {
|
|
152
|
+
return {
|
|
153
|
+
type: 'content_block_start',
|
|
154
|
+
index: this.contentIndex,
|
|
155
|
+
content_block: {
|
|
156
|
+
type: 'tool_use',
|
|
157
|
+
id,
|
|
158
|
+
name,
|
|
159
|
+
input: {},
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
createTextDeltaEvent(text) {
|
|
164
|
+
return {
|
|
165
|
+
type: 'content_block_delta',
|
|
166
|
+
index: this.contentIndex,
|
|
167
|
+
delta: {
|
|
168
|
+
type: 'text_delta',
|
|
169
|
+
text,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
createInputJsonDeltaEvent(index, partialJson) {
|
|
174
|
+
return {
|
|
175
|
+
type: 'content_block_delta',
|
|
176
|
+
index,
|
|
177
|
+
delta: {
|
|
178
|
+
type: 'input_json_delta',
|
|
179
|
+
partial_json: partialJson,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
createContentBlockStopEvent(index) {
|
|
184
|
+
return {
|
|
185
|
+
type: 'content_block_stop',
|
|
186
|
+
index,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
createMessageDeltaEvent(stopReason) {
|
|
190
|
+
return {
|
|
191
|
+
type: 'message_delta',
|
|
192
|
+
delta: {
|
|
193
|
+
stop_reason: stopReason,
|
|
194
|
+
},
|
|
195
|
+
usage: {
|
|
196
|
+
input_tokens: this.inputTokens,
|
|
197
|
+
output_tokens: this.outputTokens,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
createMessageStopEvent() {
|
|
202
|
+
return {
|
|
203
|
+
type: 'message_stop',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// Helper Methods
|
|
208
|
+
// ============================================================================
|
|
209
|
+
mapFinishReason(finishReason) {
|
|
210
|
+
const hasToolCalls = this.toolCallsInProgress.size > 0;
|
|
211
|
+
if (hasToolCalls) {
|
|
212
|
+
return 'tool_use';
|
|
213
|
+
}
|
|
214
|
+
switch (finishReason) {
|
|
215
|
+
case 'stop':
|
|
216
|
+
return 'end_turn';
|
|
217
|
+
case 'length':
|
|
218
|
+
return 'max_tokens';
|
|
219
|
+
case 'tool_calls':
|
|
220
|
+
return 'tool_use';
|
|
221
|
+
default:
|
|
222
|
+
return 'end_turn';
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
exports.AnthropicStreamConverter = AnthropicStreamConverter;
|
|
227
|
+
//# sourceMappingURL=anthropic-stream-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-stream-converter.js","sourceRoot":"","sources":["../../src/lib/anthropic-stream-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AvailableModel } from '../types/integration-config';
|
|
2
|
+
/**
|
|
3
|
+
* Check if Claude Code CLI is installed
|
|
4
|
+
*/
|
|
5
|
+
export declare function isClaudeCodeInstalled(): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Check if URL is a local router (localhost or 127.0.0.1)
|
|
8
|
+
*/
|
|
9
|
+
export declare function isLocalRouter(url: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Check if local router is running
|
|
12
|
+
*/
|
|
13
|
+
export declare function isLocalRouterRunning(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Check if router is reachable (health check)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isRouterReachable(url: string): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Get available models from router
|
|
20
|
+
*/
|
|
21
|
+
export declare function getAvailableModels(routerUrl: string): Promise<AvailableModel[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Validate model exists in available models
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateModel(modelName: string, availableModels: AvailableModel[]): boolean;
|
|
26
|
+
//# sourceMappingURL=integration-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-checker.d.ts","sourceRoot":"","sources":["../../src/lib/integration-checker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAgBrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO,CAE3F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isClaudeCodeInstalled = isClaudeCodeInstalled;
|
|
4
|
+
exports.isLocalRouter = isLocalRouter;
|
|
5
|
+
exports.isLocalRouterRunning = isLocalRouterRunning;
|
|
6
|
+
exports.isRouterReachable = isRouterReachable;
|
|
7
|
+
exports.getAvailableModels = getAvailableModels;
|
|
8
|
+
exports.validateModel = validateModel;
|
|
9
|
+
const process_utils_1 = require("../utils/process-utils");
|
|
10
|
+
const router_manager_1 = require("./router-manager");
|
|
11
|
+
/**
|
|
12
|
+
* Check if Claude Code CLI is installed
|
|
13
|
+
*/
|
|
14
|
+
async function isClaudeCodeInstalled() {
|
|
15
|
+
try {
|
|
16
|
+
await (0, process_utils_1.execAsync)('which claude');
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if URL is a local router (localhost or 127.0.0.1)
|
|
25
|
+
*/
|
|
26
|
+
function isLocalRouter(url) {
|
|
27
|
+
const urlObj = new URL(url);
|
|
28
|
+
return urlObj.hostname === 'localhost' || urlObj.hostname === '127.0.0.1';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if local router is running
|
|
32
|
+
*/
|
|
33
|
+
async function isLocalRouterRunning() {
|
|
34
|
+
const status = await router_manager_1.routerManager.getStatus();
|
|
35
|
+
return status?.status.isRunning ?? false;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if router is reachable (health check)
|
|
39
|
+
*/
|
|
40
|
+
async function isRouterReachable(url) {
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(`${url}/health`, {
|
|
43
|
+
method: 'GET',
|
|
44
|
+
signal: AbortSignal.timeout(5000),
|
|
45
|
+
});
|
|
46
|
+
return response.ok;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get available models from router
|
|
54
|
+
*/
|
|
55
|
+
async function getAvailableModels(routerUrl) {
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(`${routerUrl}/v1/models`, {
|
|
58
|
+
method: 'GET',
|
|
59
|
+
signal: AbortSignal.timeout(5000),
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`Failed to fetch models: ${response.statusText}`);
|
|
63
|
+
}
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
return data.data || [];
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Cannot reach router at ${routerUrl}: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validate model exists in available models
|
|
73
|
+
*/
|
|
74
|
+
function validateModel(modelName, availableModels) {
|
|
75
|
+
return availableModels.some(m => m.id === modelName);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=integration-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-checker.js","sourceRoot":"","sources":["../../src/lib/integration-checker.ts"],"names":[],"mappings":";;AAOA,sDAOC;AAKD,sCAGC;AAKD,oDAGC;AAKD,8CAUC;AAKD,gDAgBC;AAKD,sCAEC;AAzED,0DAAmD;AACnD,qDAAiD;AAGjD;;GAEG;AACI,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,IAAA,yBAAS,EAAC,cAAc,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;AAC5E,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,8BAAa,CAAC,SAAS,EAAE,CAAC;IAC/C,OAAO,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;AAC3C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,SAAS,EAAE;YAC5C,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,YAAY,EAAE;YACrD,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiC,CAAC;QAClE,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,SAAiB,EAAE,eAAiC;IAChF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AACvD,CAAC"}
|