@enderfga/openclaw-claude-code 2.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.
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/dist/bin/cli.d.ts +10 -0
- package/dist/bin/cli.js +301 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/embedded-server.d.ts +19 -0
- package/dist/src/embedded-server.js +190 -0
- package/dist/src/embedded-server.js.map +1 -0
- package/dist/src/hooks/prompt-bypass.d.ts +20 -0
- package/dist/src/hooks/prompt-bypass.js +37 -0
- package/dist/src/hooks/prompt-bypass.js.map +1 -0
- package/dist/src/index.d.ts +47 -0
- package/dist/src/index.js +230 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/persistent-session.d.ts +100 -0
- package/dist/src/persistent-session.js +563 -0
- package/dist/src/persistent-session.js.map +1 -0
- package/dist/src/proxy/anthropic-adapter.d.ts +136 -0
- package/dist/src/proxy/anthropic-adapter.js +394 -0
- package/dist/src/proxy/anthropic-adapter.js.map +1 -0
- package/dist/src/proxy/handler.d.ts +39 -0
- package/dist/src/proxy/handler.js +261 -0
- package/dist/src/proxy/handler.js.map +1 -0
- package/dist/src/proxy/schema-cleaner.d.ts +11 -0
- package/dist/src/proxy/schema-cleaner.js +34 -0
- package/dist/src/proxy/schema-cleaner.js.map +1 -0
- package/dist/src/proxy/thought-cache.d.ts +19 -0
- package/dist/src/proxy/thought-cache.js +53 -0
- package/dist/src/proxy/thought-cache.js.map +1 -0
- package/dist/src/session-manager.d.ts +79 -0
- package/dist/src/session-manager.js +329 -0
- package/dist/src/session-manager.js.map +1 -0
- package/dist/src/types.d.ts +160 -0
- package/dist/src/types.js +20 -0
- package/dist/src/types.js.map +1 -0
- package/openclaw.plugin.json +76 -0
- package/package.json +46 -0
- package/skills/SKILL.md +594 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic ↔ OpenAI Format Adapter
|
|
3
|
+
*
|
|
4
|
+
* Core conversion logic for translating between Anthropic Messages API format
|
|
5
|
+
* and OpenAI Chat Completions format. Replaces the Python server.py (~2300 lines)
|
|
6
|
+
* with pure TypeScript (~600 lines), no litellm dependency.
|
|
7
|
+
*
|
|
8
|
+
* Handles:
|
|
9
|
+
* - Message format conversion (content blocks ↔ role/content strings)
|
|
10
|
+
* - Tool schema conversion (Anthropic tools ↔ OpenAI function tools)
|
|
11
|
+
* - Message normalization (re-interleave merged blocks for OpenAI)
|
|
12
|
+
* - Response conversion (OpenAI response → Anthropic response)
|
|
13
|
+
* - Streaming SSE conversion (OpenAI SSE → Anthropic SSE events)
|
|
14
|
+
*/
|
|
15
|
+
export interface AnthropicRequest {
|
|
16
|
+
model: string;
|
|
17
|
+
max_tokens: number;
|
|
18
|
+
messages: AnthropicMessage[];
|
|
19
|
+
system?: string | Array<{
|
|
20
|
+
type: string;
|
|
21
|
+
text: string;
|
|
22
|
+
}>;
|
|
23
|
+
tools?: AnthropicTool[];
|
|
24
|
+
tool_choice?: {
|
|
25
|
+
type: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
};
|
|
28
|
+
stream?: boolean;
|
|
29
|
+
temperature?: number;
|
|
30
|
+
top_p?: number;
|
|
31
|
+
top_k?: number;
|
|
32
|
+
thinking?: {
|
|
33
|
+
type: string;
|
|
34
|
+
budget_tokens?: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface AnthropicMessage {
|
|
38
|
+
role: 'user' | 'assistant' | 'system';
|
|
39
|
+
content: string | AnthropicContentBlock[];
|
|
40
|
+
}
|
|
41
|
+
export interface AnthropicContentBlock {
|
|
42
|
+
type: string;
|
|
43
|
+
text?: string;
|
|
44
|
+
id?: string;
|
|
45
|
+
name?: string;
|
|
46
|
+
input?: unknown;
|
|
47
|
+
tool_use_id?: string;
|
|
48
|
+
content?: unknown;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
export interface AnthropicTool {
|
|
52
|
+
name: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
input_schema: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
export interface AnthropicResponse {
|
|
57
|
+
id: string;
|
|
58
|
+
type: 'message';
|
|
59
|
+
model: string;
|
|
60
|
+
role: 'assistant';
|
|
61
|
+
content: AnthropicContentBlock[];
|
|
62
|
+
stop_reason: string | null;
|
|
63
|
+
stop_sequence: string | null;
|
|
64
|
+
usage: {
|
|
65
|
+
input_tokens: number;
|
|
66
|
+
output_tokens: number;
|
|
67
|
+
cache_creation_input_tokens: number;
|
|
68
|
+
cache_read_input_tokens: number;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export interface OpenAIRequest {
|
|
72
|
+
model: string;
|
|
73
|
+
messages: OpenAIMessage[];
|
|
74
|
+
max_completion_tokens?: number;
|
|
75
|
+
temperature?: number;
|
|
76
|
+
top_p?: number;
|
|
77
|
+
stream?: boolean;
|
|
78
|
+
tools?: OpenAITool[];
|
|
79
|
+
tool_choice?: string | {
|
|
80
|
+
type: string;
|
|
81
|
+
function: {
|
|
82
|
+
name: string;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
thinking?: {
|
|
86
|
+
type: string;
|
|
87
|
+
budget_tokens?: number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export interface OpenAIMessage {
|
|
91
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
92
|
+
content?: string | null;
|
|
93
|
+
tool_calls?: OpenAIToolCall[];
|
|
94
|
+
tool_call_id?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface OpenAIToolCall {
|
|
97
|
+
id: string;
|
|
98
|
+
type: 'function';
|
|
99
|
+
function: {
|
|
100
|
+
name: string;
|
|
101
|
+
arguments: string;
|
|
102
|
+
};
|
|
103
|
+
extra_content?: Record<string, unknown>;
|
|
104
|
+
}
|
|
105
|
+
export interface OpenAITool {
|
|
106
|
+
type: 'function';
|
|
107
|
+
function: {
|
|
108
|
+
name: string;
|
|
109
|
+
description: string;
|
|
110
|
+
parameters: Record<string, unknown>;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export interface OpenAIResponse {
|
|
114
|
+
id?: string;
|
|
115
|
+
model?: string;
|
|
116
|
+
choices: Array<{
|
|
117
|
+
message?: {
|
|
118
|
+
content?: string | null;
|
|
119
|
+
tool_calls?: OpenAIToolCall[];
|
|
120
|
+
};
|
|
121
|
+
finish_reason?: string;
|
|
122
|
+
}>;
|
|
123
|
+
usage?: {
|
|
124
|
+
prompt_tokens?: number;
|
|
125
|
+
completion_tokens?: number;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export declare function isGeminiModel(model: string): boolean;
|
|
129
|
+
export declare function isClaudeModel(model: string): boolean;
|
|
130
|
+
export declare function convertAnthropicToOpenAI(req: AnthropicRequest): OpenAIRequest;
|
|
131
|
+
export declare function convertOpenAIToAnthropic(resp: OpenAIResponse, originalModel: string): AnthropicResponse;
|
|
132
|
+
/**
|
|
133
|
+
* Convert an OpenAI SSE stream to Anthropic SSE format.
|
|
134
|
+
* Yields Anthropic-formatted SSE strings.
|
|
135
|
+
*/
|
|
136
|
+
export declare function convertStreamOpenAIToAnthropic(stream: AsyncIterable<string>, originalModel: string): AsyncGenerator<string>;
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic ↔ OpenAI Format Adapter
|
|
3
|
+
*
|
|
4
|
+
* Core conversion logic for translating between Anthropic Messages API format
|
|
5
|
+
* and OpenAI Chat Completions format. Replaces the Python server.py (~2300 lines)
|
|
6
|
+
* with pure TypeScript (~600 lines), no litellm dependency.
|
|
7
|
+
*
|
|
8
|
+
* Handles:
|
|
9
|
+
* - Message format conversion (content blocks ↔ role/content strings)
|
|
10
|
+
* - Tool schema conversion (Anthropic tools ↔ OpenAI function tools)
|
|
11
|
+
* - Message normalization (re-interleave merged blocks for OpenAI)
|
|
12
|
+
* - Response conversion (OpenAI response → Anthropic response)
|
|
13
|
+
* - Streaming SSE conversion (OpenAI SSE → Anthropic SSE events)
|
|
14
|
+
*/
|
|
15
|
+
import { randomUUID } from 'node:crypto';
|
|
16
|
+
const uuidv4 = randomUUID;
|
|
17
|
+
import { cleanGeminiSchema } from './schema-cleaner.js';
|
|
18
|
+
import { cacheThoughtSig } from './thought-cache.js';
|
|
19
|
+
// ─── Model Detection ─────────────────────────────────────────────────────────
|
|
20
|
+
export function isGeminiModel(model) {
|
|
21
|
+
return model.toLowerCase().includes('gemini');
|
|
22
|
+
}
|
|
23
|
+
export function isClaudeModel(model) {
|
|
24
|
+
const l = model.toLowerCase();
|
|
25
|
+
return l.includes('claude') || l.includes('opus') || l.includes('sonnet') || l.includes('haiku');
|
|
26
|
+
}
|
|
27
|
+
// ─── Anthropic → OpenAI Conversion ───────────────────────────────────────────
|
|
28
|
+
export function convertAnthropicToOpenAI(req) {
|
|
29
|
+
const isGemini = isGeminiModel(req.model);
|
|
30
|
+
// 1. System message
|
|
31
|
+
let systemText = '';
|
|
32
|
+
if (typeof req.system === 'string') {
|
|
33
|
+
systemText = req.system;
|
|
34
|
+
}
|
|
35
|
+
else if (Array.isArray(req.system)) {
|
|
36
|
+
systemText = req.system.map(b => b.text || '').join('\n');
|
|
37
|
+
}
|
|
38
|
+
// 2. Convert messages
|
|
39
|
+
const rawMessages = convertMessages(req.messages);
|
|
40
|
+
// 3. Normalize for OpenAI interleaving
|
|
41
|
+
const normalized = normalizeMessagesForOpenAI(rawMessages);
|
|
42
|
+
// 4. Prepend system
|
|
43
|
+
const messages = [];
|
|
44
|
+
if (systemText)
|
|
45
|
+
messages.push({ role: 'system', content: systemText });
|
|
46
|
+
messages.push(...normalized);
|
|
47
|
+
// 5. Max tokens
|
|
48
|
+
let maxTokens = req.max_tokens || 4096;
|
|
49
|
+
if (!isClaudeModel(req.model))
|
|
50
|
+
maxTokens = Math.min(maxTokens, 16384);
|
|
51
|
+
if (isGemini && maxTokens < 8192)
|
|
52
|
+
maxTokens = 8192;
|
|
53
|
+
// 6. Build request
|
|
54
|
+
const openaiReq = {
|
|
55
|
+
model: req.model,
|
|
56
|
+
messages,
|
|
57
|
+
max_completion_tokens: maxTokens,
|
|
58
|
+
temperature: req.temperature ?? 1.0,
|
|
59
|
+
stream: req.stream ?? false,
|
|
60
|
+
};
|
|
61
|
+
if (req.top_p !== undefined)
|
|
62
|
+
openaiReq.top_p = req.top_p;
|
|
63
|
+
// 7. Thinking (Claude only)
|
|
64
|
+
if (req.thinking && isClaudeModel(req.model)) {
|
|
65
|
+
openaiReq.thinking = {
|
|
66
|
+
type: req.thinking.type === 'enabled' ? 'enabled' : 'disabled',
|
|
67
|
+
budget_tokens: req.thinking.budget_tokens || Math.max(maxTokens - 1000, 1024),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// 8. Tools
|
|
71
|
+
if (req.tools?.length) {
|
|
72
|
+
openaiReq.tools = req.tools.map(tool => {
|
|
73
|
+
let schema = tool.input_schema || {};
|
|
74
|
+
if (isGemini)
|
|
75
|
+
schema = cleanGeminiSchema(schema);
|
|
76
|
+
return {
|
|
77
|
+
type: 'function',
|
|
78
|
+
function: {
|
|
79
|
+
name: tool.name,
|
|
80
|
+
description: tool.description || '',
|
|
81
|
+
parameters: schema,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// 9. Tool choice
|
|
87
|
+
if (req.tool_choice) {
|
|
88
|
+
const tc = req.tool_choice;
|
|
89
|
+
if (tc.type === 'auto')
|
|
90
|
+
openaiReq.tool_choice = 'auto';
|
|
91
|
+
else if (tc.type === 'any')
|
|
92
|
+
openaiReq.tool_choice = 'auto';
|
|
93
|
+
else if (tc.type === 'tool' && tc.name) {
|
|
94
|
+
openaiReq.tool_choice = { type: 'function', function: { name: tc.name } };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return openaiReq;
|
|
98
|
+
}
|
|
99
|
+
// ─── Message Conversion ──────────────────────────────────────────────────────
|
|
100
|
+
function convertMessages(messages) {
|
|
101
|
+
const result = [];
|
|
102
|
+
for (const msg of messages) {
|
|
103
|
+
if (msg.role === 'system')
|
|
104
|
+
continue; // handled separately
|
|
105
|
+
if (typeof msg.content === 'string') {
|
|
106
|
+
result.push({ role: msg.role, content: msg.content });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Content blocks
|
|
110
|
+
const textParts = [];
|
|
111
|
+
const toolCalls = [];
|
|
112
|
+
const toolResults = [];
|
|
113
|
+
for (const block of msg.content) {
|
|
114
|
+
if (block.type === 'text' && block.text) {
|
|
115
|
+
textParts.push(block.text);
|
|
116
|
+
}
|
|
117
|
+
else if (block.type === 'tool_use') {
|
|
118
|
+
toolCalls.push({
|
|
119
|
+
id: block.id || `tool_${uuidv4()}`,
|
|
120
|
+
type: 'function',
|
|
121
|
+
function: {
|
|
122
|
+
name: block.name || '',
|
|
123
|
+
arguments: typeof block.input === 'string' ? block.input : JSON.stringify(block.input || {}),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else if (block.type === 'tool_result') {
|
|
128
|
+
const content = typeof block.content === 'string'
|
|
129
|
+
? block.content
|
|
130
|
+
: JSON.stringify(block.content || '');
|
|
131
|
+
toolResults.push({
|
|
132
|
+
role: 'tool',
|
|
133
|
+
tool_call_id: block.tool_use_id || '',
|
|
134
|
+
content,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (msg.role === 'assistant') {
|
|
139
|
+
const assistantMsg = {
|
|
140
|
+
role: 'assistant',
|
|
141
|
+
content: textParts.join('\n') || null,
|
|
142
|
+
};
|
|
143
|
+
if (toolCalls.length)
|
|
144
|
+
assistantMsg.tool_calls = toolCalls;
|
|
145
|
+
result.push(assistantMsg);
|
|
146
|
+
}
|
|
147
|
+
else if (msg.role === 'user') {
|
|
148
|
+
// Tool results first, then text
|
|
149
|
+
result.push(...toolResults);
|
|
150
|
+
if (textParts.length) {
|
|
151
|
+
result.push({ role: 'user', content: textParts.join('\n') });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
// ─── Message Normalization ───────────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Re-interleave messages for OpenAI's strict format:
|
|
160
|
+
* - assistant message with tool_calls must be followed by tool messages
|
|
161
|
+
* - No consecutive same-role messages (merge them)
|
|
162
|
+
* - Tool messages must reference a tool_call_id from previous assistant
|
|
163
|
+
*/
|
|
164
|
+
function normalizeMessagesForOpenAI(messages) {
|
|
165
|
+
const normalized = [];
|
|
166
|
+
for (const msg of messages) {
|
|
167
|
+
const last = normalized[normalized.length - 1];
|
|
168
|
+
if (msg.role === 'tool') {
|
|
169
|
+
// Tool result — must follow an assistant with tool_calls
|
|
170
|
+
normalized.push(msg);
|
|
171
|
+
}
|
|
172
|
+
else if (msg.role === 'assistant') {
|
|
173
|
+
// Merge consecutive assistant messages
|
|
174
|
+
if (last?.role === 'assistant' && !last.tool_calls && !msg.tool_calls) {
|
|
175
|
+
last.content = [last.content || '', msg.content || ''].filter(Boolean).join('\n') || null;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
normalized.push({ ...msg });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (msg.role === 'user') {
|
|
182
|
+
// Merge consecutive user messages
|
|
183
|
+
if (last?.role === 'user') {
|
|
184
|
+
last.content = [last.content || '', msg.content || ''].filter(Boolean).join('\n');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
normalized.push({ ...msg });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
normalized.push(msg);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return normalized;
|
|
195
|
+
}
|
|
196
|
+
// ─── OpenAI → Anthropic Response Conversion ──────────────────────────────────
|
|
197
|
+
export function convertOpenAIToAnthropic(resp, originalModel) {
|
|
198
|
+
const choice = resp.choices?.[0];
|
|
199
|
+
const message = choice?.message;
|
|
200
|
+
const content = [];
|
|
201
|
+
// Text content
|
|
202
|
+
if (message?.content) {
|
|
203
|
+
content.push({ type: 'text', text: message.content });
|
|
204
|
+
}
|
|
205
|
+
// Tool calls → tool_use blocks
|
|
206
|
+
if (message?.tool_calls) {
|
|
207
|
+
for (const tc of message.tool_calls) {
|
|
208
|
+
let args = {};
|
|
209
|
+
if (typeof tc.function.arguments === 'string') {
|
|
210
|
+
try {
|
|
211
|
+
args = JSON.parse(tc.function.arguments);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
args = { raw: tc.function.arguments };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
args = tc.function.arguments;
|
|
219
|
+
}
|
|
220
|
+
content.push({
|
|
221
|
+
type: 'tool_use',
|
|
222
|
+
id: tc.id || `tool_${uuidv4()}`,
|
|
223
|
+
name: tc.function.name,
|
|
224
|
+
input: args,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Empty content fallback
|
|
229
|
+
if (content.length === 0) {
|
|
230
|
+
content.push({ type: 'text', text: '' });
|
|
231
|
+
}
|
|
232
|
+
// Stop reason mapping
|
|
233
|
+
let stopReason = 'end_turn';
|
|
234
|
+
const finishReason = choice?.finish_reason;
|
|
235
|
+
if (finishReason === 'length')
|
|
236
|
+
stopReason = 'max_tokens';
|
|
237
|
+
else if (finishReason === 'tool_calls')
|
|
238
|
+
stopReason = 'tool_use';
|
|
239
|
+
else if (finishReason === 'stop')
|
|
240
|
+
stopReason = 'end_turn';
|
|
241
|
+
// Fix: force tool_use if response has tool blocks but stop was "end_turn"
|
|
242
|
+
const hasToolUse = content.some(c => c.type === 'tool_use');
|
|
243
|
+
if (stopReason === 'end_turn' && hasToolUse)
|
|
244
|
+
stopReason = 'tool_use';
|
|
245
|
+
return {
|
|
246
|
+
id: resp.id || `msg_${uuidv4()}`,
|
|
247
|
+
type: 'message',
|
|
248
|
+
model: originalModel,
|
|
249
|
+
role: 'assistant',
|
|
250
|
+
content,
|
|
251
|
+
stop_reason: stopReason,
|
|
252
|
+
stop_sequence: null,
|
|
253
|
+
usage: {
|
|
254
|
+
input_tokens: resp.usage?.prompt_tokens || 0,
|
|
255
|
+
output_tokens: resp.usage?.completion_tokens || 0,
|
|
256
|
+
cache_creation_input_tokens: 0,
|
|
257
|
+
cache_read_input_tokens: 0,
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// ─── Streaming SSE Conversion ────────────────────────────────────────────────
|
|
262
|
+
/**
|
|
263
|
+
* Convert an OpenAI SSE stream to Anthropic SSE format.
|
|
264
|
+
* Yields Anthropic-formatted SSE strings.
|
|
265
|
+
*/
|
|
266
|
+
export async function* convertStreamOpenAIToAnthropic(stream, originalModel) {
|
|
267
|
+
// Emit message_start
|
|
268
|
+
const msgId = `msg_${uuidv4()}`;
|
|
269
|
+
yield sseEvent('message_start', {
|
|
270
|
+
type: 'message_start',
|
|
271
|
+
message: {
|
|
272
|
+
id: msgId, type: 'message', model: originalModel, role: 'assistant',
|
|
273
|
+
content: [], stop_reason: null, stop_sequence: null,
|
|
274
|
+
usage: { input_tokens: 0, output_tokens: 0 },
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
// Emit initial text block
|
|
278
|
+
yield sseEvent('content_block_start', {
|
|
279
|
+
type: 'content_block_start', index: 0,
|
|
280
|
+
content_block: { type: 'text', text: '' },
|
|
281
|
+
});
|
|
282
|
+
let accumulatedText = '';
|
|
283
|
+
let textBlockOpen = true;
|
|
284
|
+
let lastToolIndex = 0; // anthropic index (0 = text, 1+ = tools)
|
|
285
|
+
let currentToolCallId = null;
|
|
286
|
+
let finishReason = null;
|
|
287
|
+
let promptTokens = 0;
|
|
288
|
+
let completionTokens = 0;
|
|
289
|
+
for await (const line of stream) {
|
|
290
|
+
if (!line.startsWith('data: ') || line === 'data: [DONE]')
|
|
291
|
+
continue;
|
|
292
|
+
let chunk;
|
|
293
|
+
try {
|
|
294
|
+
chunk = JSON.parse(line.slice(6));
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const choices = chunk.choices;
|
|
300
|
+
if (!choices?.length) {
|
|
301
|
+
// Usage chunk (OpenAI sends usage in final chunk)
|
|
302
|
+
const usage = chunk.usage;
|
|
303
|
+
if (usage) {
|
|
304
|
+
promptTokens = usage.prompt_tokens || 0;
|
|
305
|
+
completionTokens = usage.completion_tokens || 0;
|
|
306
|
+
}
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const delta = choices[0].delta;
|
|
310
|
+
if (!delta) {
|
|
311
|
+
finishReason = choices[0].finish_reason || finishReason;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
finishReason = choices[0].finish_reason || finishReason;
|
|
315
|
+
// Text delta
|
|
316
|
+
const textContent = delta.content;
|
|
317
|
+
if (textContent) {
|
|
318
|
+
accumulatedText += textContent;
|
|
319
|
+
if (textBlockOpen) {
|
|
320
|
+
yield sseEvent('content_block_delta', {
|
|
321
|
+
type: 'content_block_delta', index: 0,
|
|
322
|
+
delta: { type: 'text_delta', text: textContent },
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Tool calls
|
|
327
|
+
const toolCalls = delta.tool_calls;
|
|
328
|
+
if (toolCalls) {
|
|
329
|
+
for (const tc of toolCalls) {
|
|
330
|
+
const tcId = tc.id;
|
|
331
|
+
const fn = tc.function;
|
|
332
|
+
// New tool call
|
|
333
|
+
if (tcId && tcId !== currentToolCallId) {
|
|
334
|
+
// Close text block if still open
|
|
335
|
+
if (textBlockOpen) {
|
|
336
|
+
yield sseEvent('content_block_stop', { type: 'content_block_stop', index: 0 });
|
|
337
|
+
textBlockOpen = false;
|
|
338
|
+
}
|
|
339
|
+
// Close previous tool block
|
|
340
|
+
if (currentToolCallId) {
|
|
341
|
+
yield sseEvent('content_block_stop', { type: 'content_block_stop', index: lastToolIndex });
|
|
342
|
+
}
|
|
343
|
+
lastToolIndex++;
|
|
344
|
+
currentToolCallId = tcId;
|
|
345
|
+
// Cache thought signature if present (Gemini)
|
|
346
|
+
const extra = tc.extra_content;
|
|
347
|
+
const sig = extra?.google?.thought_signature || tc.thought_signature;
|
|
348
|
+
if (sig && tcId)
|
|
349
|
+
cacheThoughtSig(tcId, sig);
|
|
350
|
+
// Start new tool block
|
|
351
|
+
yield sseEvent('content_block_start', {
|
|
352
|
+
type: 'content_block_start', index: lastToolIndex,
|
|
353
|
+
content_block: { type: 'tool_use', id: tcId, name: fn?.name || '', input: {} },
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// Tool arguments delta
|
|
357
|
+
if (fn?.arguments) {
|
|
358
|
+
yield sseEvent('content_block_delta', {
|
|
359
|
+
type: 'content_block_delta', index: lastToolIndex,
|
|
360
|
+
delta: { type: 'input_json_delta', partial_json: fn.arguments },
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Close remaining blocks
|
|
367
|
+
if (currentToolCallId) {
|
|
368
|
+
yield sseEvent('content_block_stop', { type: 'content_block_stop', index: lastToolIndex });
|
|
369
|
+
}
|
|
370
|
+
else if (textBlockOpen) {
|
|
371
|
+
yield sseEvent('content_block_stop', { type: 'content_block_stop', index: 0 });
|
|
372
|
+
}
|
|
373
|
+
// Stop reason
|
|
374
|
+
let stopReason = 'end_turn';
|
|
375
|
+
if (finishReason === 'length')
|
|
376
|
+
stopReason = 'max_tokens';
|
|
377
|
+
else if (finishReason === 'tool_calls')
|
|
378
|
+
stopReason = 'tool_use';
|
|
379
|
+
if (stopReason === 'end_turn' && currentToolCallId)
|
|
380
|
+
stopReason = 'tool_use';
|
|
381
|
+
// message_delta (usage + stop)
|
|
382
|
+
yield sseEvent('message_delta', {
|
|
383
|
+
type: 'message_delta',
|
|
384
|
+
delta: { stop_reason: stopReason, stop_sequence: null },
|
|
385
|
+
usage: { output_tokens: completionTokens },
|
|
386
|
+
});
|
|
387
|
+
// message_stop
|
|
388
|
+
yield sseEvent('message_stop', { type: 'message_stop' });
|
|
389
|
+
}
|
|
390
|
+
// ─── SSE Helpers ─────────────────────────────────────────────────────────────
|
|
391
|
+
function sseEvent(event, data) {
|
|
392
|
+
return `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=anthropic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../../src/proxy/anthropic-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy HTTP Handler — registerHttpRoute handler for OpenClaw Plugin SDK
|
|
3
|
+
*
|
|
4
|
+
* Receives Anthropic-format requests from Claude Code CLI,
|
|
5
|
+
* translates to OpenAI format, forwards to the target provider,
|
|
6
|
+
* and translates the response back to Anthropic format.
|
|
7
|
+
*
|
|
8
|
+
* Supports:
|
|
9
|
+
* - Direct Anthropic API passthrough (zero conversion)
|
|
10
|
+
* - OpenAI/GPT models via format conversion
|
|
11
|
+
* - Gemini models via format conversion + schema cleaning
|
|
12
|
+
* - Gateway passthrough (OpenClaw gateway handles routing)
|
|
13
|
+
* - Streaming and non-streaming modes
|
|
14
|
+
*/
|
|
15
|
+
import type { ProxyConfig } from '../types.js';
|
|
16
|
+
export interface ProxyEnv {
|
|
17
|
+
anthropicApiKey?: string;
|
|
18
|
+
openaiApiKey?: string;
|
|
19
|
+
geminiApiKey?: string;
|
|
20
|
+
gatewayUrl?: string;
|
|
21
|
+
gatewayKey?: string;
|
|
22
|
+
}
|
|
23
|
+
interface HttpRequest {
|
|
24
|
+
method: string;
|
|
25
|
+
url: string;
|
|
26
|
+
headers: Record<string, string>;
|
|
27
|
+
body?: unknown;
|
|
28
|
+
json(): Promise<unknown>;
|
|
29
|
+
}
|
|
30
|
+
interface HttpResponse {
|
|
31
|
+
status(code: number): HttpResponse;
|
|
32
|
+
json(data: unknown): void;
|
|
33
|
+
setHeader(key: string, value: string): void;
|
|
34
|
+
write(data: string): void;
|
|
35
|
+
end(): void;
|
|
36
|
+
flushHeaders?(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare function createProxyHandler(config: ProxyConfig | undefined, env: ProxyEnv): (req: HttpRequest, res: HttpResponse) => Promise<boolean>;
|
|
39
|
+
export {};
|