unbound-claude-code 0.1.9 → 0.2.1

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.
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Unbound Code Interceptor
3
3
  *
4
- * This interceptor modifies Claude Code to work with the Unbound AI API
5
- * by redirecting Anthropic API calls to api.getunbound.ai and handling
6
- * OpenAI-compatible request/response formats.
4
+ * Ultra-thin interceptor that only handles URL redirection and authentication.
5
+ * All processing is done by the gateway - no format conversion in client.
7
6
  */
8
7
  import { UnboundConfig } from "./types";
9
8
  export declare class UnboundInterceptor {
@@ -12,7 +11,6 @@ export declare class UnboundInterceptor {
12
11
  constructor(config?: UnboundConfig);
13
12
  setApiKey(apiKey: string): void;
14
13
  private isAnthropicAPI;
15
- private convertAnthropicToOpenAI;
16
14
  instrumentFetch(): void;
17
15
  instrumentAll(): void;
18
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAMxC,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,aAAkB;IAQ/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,wBAAwB;IA4EzB,eAAe,IAAI,IAAI;IA2QvB,aAAa,IAAI,IAAI;CAG5B;AAKD,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,kBAAkB,CASvF;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIrD"}
1
+ {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAMxC,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,aAAkB;IAQ/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC,OAAO,CAAC,cAAc;IAKf,eAAe,IAAI,IAAI;IAmEvB,aAAa,IAAI,IAAI;CAG5B;AAKD,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,kBAAkB,CASvF;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIrD"}
@@ -2,9 +2,8 @@
2
2
  /**
3
3
  * Unbound Code Interceptor
4
4
  *
5
- * This interceptor modifies Claude Code to work with the Unbound AI API
6
- * by redirecting Anthropic API calls to api.getunbound.ai and handling
7
- * OpenAI-compatible request/response formats.
5
+ * Ultra-thin interceptor that only handles URL redirection and authentication.
6
+ * All processing is done by the gateway - no format conversion in client.
8
7
  */
9
8
  Object.defineProperty(exports, "__esModule", { value: true });
10
9
  exports.UnboundInterceptor = void 0;
@@ -19,7 +18,7 @@ class UnboundInterceptor {
19
18
  this.apiKey = null;
20
19
  this.config = {
21
20
  baseUrl: "https://api.getunbound.ai/v1",
22
- logLevel: "debug",
21
+ logLevel: "info",
23
22
  ...config,
24
23
  };
25
24
  }
@@ -30,73 +29,6 @@ class UnboundInterceptor {
30
29
  const urlString = typeof url === "string" ? url : url.toString();
31
30
  return urlString.includes("api.anthropic.com") && urlString.includes("/v1/messages");
32
31
  }
33
- convertAnthropicToOpenAI(anthropicRequest) {
34
- // Convert Anthropic request format to OpenAI format
35
- const messages = [];
36
- // Add system message if present
37
- if (anthropicRequest.system) {
38
- let systemContent = "";
39
- if (typeof anthropicRequest.system === "string") {
40
- systemContent = anthropicRequest.system;
41
- }
42
- else if (Array.isArray(anthropicRequest.system)) {
43
- // Handle system as array of objects (like in Claude Code)
44
- systemContent = anthropicRequest.system
45
- .filter((block) => block && block.type === "text" && block.text)
46
- .map((block) => block.text)
47
- .join("\n");
48
- }
49
- if (systemContent) {
50
- messages.push({
51
- role: "system",
52
- content: systemContent,
53
- });
54
- }
55
- }
56
- // Convert messages
57
- if (anthropicRequest.messages) {
58
- for (const msg of anthropicRequest.messages) {
59
- if (msg.role === "user" || msg.role === "assistant") {
60
- let content = "";
61
- if (typeof msg.content === "string") {
62
- content = msg.content;
63
- }
64
- else if (Array.isArray(msg.content)) {
65
- content = msg.content
66
- .filter((block) => block && block.type === "text" && block.text)
67
- .map((block) => block.text)
68
- .join("\n");
69
- }
70
- messages.push({
71
- role: msg.role,
72
- content: content,
73
- });
74
- }
75
- }
76
- }
77
- // Build OpenAI request with all available parameters
78
- const openAIRequest = {
79
- model: anthropicRequest.model || "claude-sonnet-4-20250514",
80
- messages: messages,
81
- };
82
- // Add optional parameters if present
83
- if (anthropicRequest.max_tokens !== undefined) {
84
- openAIRequest.max_tokens = anthropicRequest.max_tokens;
85
- }
86
- if (anthropicRequest.temperature !== undefined) {
87
- openAIRequest.temperature = anthropicRequest.temperature;
88
- }
89
- if (anthropicRequest.stream !== undefined) {
90
- openAIRequest.stream = anthropicRequest.stream;
91
- }
92
- if (anthropicRequest.tools !== undefined) {
93
- openAIRequest.tools = anthropicRequest.tools;
94
- }
95
- if (anthropicRequest.metadata !== undefined) {
96
- openAIRequest.metadata = anthropicRequest.metadata;
97
- }
98
- return openAIRequest;
99
- }
100
32
  instrumentFetch() {
101
33
  if (!global.fetch) {
102
34
  return;
@@ -117,221 +49,32 @@ class UnboundInterceptor {
117
49
  throw new Error("Unbound API key not set. Please set your API key first.");
118
50
  }
119
51
  try {
120
- // Extract Claude API key from original request headers
121
- let claudeApiKey = null;
122
- if (init.headers) {
123
- if (init.headers instanceof Headers) {
124
- claudeApiKey = init.headers.get('authorization')?.replace('Bearer ', '') ||
125
- null;
126
- }
127
- else {
128
- const headers = init.headers;
129
- claudeApiKey = headers['authorization']?.replace('Bearer ', '') ||
130
- null;
131
- }
132
- }
133
- // Parse original request body
134
- let requestBody = {};
135
- if (init.body) {
136
- try {
137
- requestBody = JSON.parse(init.body);
138
- }
139
- catch (e) {
140
- return originalFetch(input, init);
141
- }
142
- }
143
- // Convert Anthropic request to OpenAI format
144
- const openAIRequest = interceptor.convertAnthropicToOpenAI(requestBody);
145
- // Prepare new request to Unbound API
146
- const unboundUrl = `${interceptor.config.baseUrl}/chat/completions`;
147
- // Start with original headers
52
+ // Redirect URL to Unbound gateway
53
+ const unboundUrl = `${interceptor.config.baseUrl}/messages`;
54
+ // Copy all original headers
148
55
  const unboundHeaders = {};
149
- // Copy original headers
150
56
  if (init.headers) {
151
57
  if (init.headers instanceof Headers) {
152
- // Convert Headers object to plain object with lowercase keys
153
58
  init.headers.forEach((value, key) => {
154
59
  unboundHeaders[key.toLowerCase()] = value;
155
60
  });
156
61
  }
157
62
  else {
158
- // Copy from plain object
159
63
  Object.entries(init.headers).forEach(([key, value]) => {
160
- // Handle both string and array of strings
161
64
  const headerValue = Array.isArray(value) ? value.join(', ') : String(value);
162
65
  unboundHeaders[key.toLowerCase()] = headerValue;
163
66
  });
164
67
  }
165
68
  }
166
- // Replace Authorization with Unbound API key and add default headers
69
+ // Replace Authorization with Unbound API key and add metadata
167
70
  unboundHeaders["authorization"] = `Bearer ${interceptor.apiKey}`;
168
71
  Object.assign(unboundHeaders, DEFAULT_HEADERS);
169
- if (claudeApiKey) {
170
- unboundHeaders["claude-code-key"] = claudeApiKey;
171
- }
172
72
  const newInit = {
173
73
  ...init,
174
- method: "POST",
175
74
  headers: unboundHeaders,
176
- body: JSON.stringify(openAIRequest),
177
75
  };
178
- // Make request to Unbound API
179
- const response = await originalFetch(unboundUrl, newInit);
180
- if (!response.ok) {
181
- const errorText = await response.text();
182
- throw new Error(`Unbound API error: ${response.status} ${response.statusText} - ${errorText}`);
183
- }
184
- // Handle streaming response
185
- if (openAIRequest.stream) {
186
- const reader = response.body?.getReader();
187
- if (!reader) {
188
- throw new Error("No readable stream in response");
189
- }
190
- // Create a new ReadableStream that converts OpenAI chunks to Anthropic format
191
- const transformedStream = new ReadableStream({
192
- async start(controller) {
193
- const decoder = new TextDecoder();
194
- const encoder = new TextEncoder();
195
- let buffer = "";
196
- let hasStartedContent = false;
197
- let messageId = openAIRequest.id || `msg_${Date.now()}`;
198
- try {
199
- // Send initial message_start event
200
- const messageStart = {
201
- type: "message_start",
202
- message: {
203
- id: messageId,
204
- type: "message",
205
- role: "assistant",
206
- content: [],
207
- model: openAIRequest.model,
208
- stop_reason: null,
209
- stop_sequence: null,
210
- usage: { input_tokens: 0, output_tokens: 0 }
211
- }
212
- };
213
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(messageStart)}\n\n`));
214
- while (true) {
215
- const { done, value } = await reader.read();
216
- if (done) {
217
- // Send content_block_stop if we started content
218
- if (hasStartedContent) {
219
- const contentStop = {
220
- type: "content_block_stop",
221
- index: 0
222
- };
223
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(contentStop)}\n\n`));
224
- }
225
- // Send message_delta with final usage
226
- const messageDelta = {
227
- type: "message_delta",
228
- delta: {
229
- stop_reason: "end_turn",
230
- stop_sequence: null
231
- }
232
- };
233
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(messageDelta)}\n\n`));
234
- // Send message_stop
235
- const messageStop = {
236
- type: "message_stop"
237
- };
238
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(messageStop)}\n\n`));
239
- break;
240
- }
241
- buffer += decoder.decode(value, { stream: true });
242
- const lines = buffer.split("\n");
243
- buffer = lines.pop() || "";
244
- for (const line of lines) {
245
- if (line.trim().startsWith("data: ")) {
246
- const jsonPart = line.substring(6).trim();
247
- if (jsonPart === "[DONE]")
248
- continue;
249
- try {
250
- const openAIChunk = JSON.parse(jsonPart);
251
- // Convert OpenAI chunk to Anthropic format
252
- if (openAIChunk.choices?.[0]?.delta?.content) {
253
- // Send content_block_start if this is the first content
254
- if (!hasStartedContent) {
255
- const contentStart = {
256
- type: "content_block_start",
257
- index: 0,
258
- content_block: {
259
- type: "text",
260
- text: ""
261
- }
262
- };
263
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(contentStart)}\n\n`));
264
- hasStartedContent = true;
265
- }
266
- // Send content delta
267
- const contentDelta = {
268
- type: "content_block_delta",
269
- index: 0,
270
- delta: {
271
- type: "text_delta",
272
- text: openAIChunk.choices[0].delta.content
273
- }
274
- };
275
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(contentDelta)}\n\n`));
276
- }
277
- }
278
- catch (e) {
279
- console.error("Error processing chunk:", e);
280
- }
281
- }
282
- }
283
- }
284
- }
285
- catch (error) {
286
- controller.error(error);
287
- }
288
- finally {
289
- controller.close();
290
- }
291
- }
292
- });
293
- return new Response(transformedStream, {
294
- status: response.status,
295
- statusText: response.statusText,
296
- headers: {
297
- ...Object.fromEntries(response.headers.entries()),
298
- "Content-Type": "text/event-stream",
299
- },
300
- });
301
- }
302
- else {
303
- // Non-streaming response
304
- const responseText = await response.text();
305
- const openAIResponse = JSON.parse(responseText);
306
- // Convert to Anthropic format
307
- const anthropicResponse = {
308
- id: openAIResponse.id,
309
- type: "message",
310
- role: "assistant",
311
- content: [
312
- {
313
- type: "text",
314
- text: openAIResponse.choices[0].message.content,
315
- },
316
- ],
317
- model: openAIResponse.model,
318
- stop_reason: "end_turn",
319
- stop_sequence: null,
320
- usage: {
321
- input_tokens: openAIResponse.usage?.prompt_tokens || 0,
322
- output_tokens: openAIResponse.usage?.completion_tokens || 0,
323
- },
324
- };
325
- // Return the response directly in JSON format
326
- return new Response(JSON.stringify(anthropicResponse), {
327
- status: response.status,
328
- statusText: response.statusText,
329
- headers: {
330
- ...Object.fromEntries(response.headers.entries()),
331
- "Content-Type": "application/json",
332
- },
333
- });
334
- }
76
+ // Direct passthrough - gateway handles everything
77
+ return originalFetch(unboundUrl, newInit);
335
78
  }
336
79
  catch (error) {
337
80
  console.error("Unbound interceptor error:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unbound-claude-code",
3
- "version": "0.1.9",
3
+ "version": "0.2.1",
4
4
  "description": "Claude Code with Unbound integration - Drop-in replacement for Claude Code with multi-provider routing and cost optimization",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,6 +11,9 @@
11
11
  "dev": "tsc --watch --preserveWatchOutput",
12
12
  "clean": "rm -rf dist",
13
13
  "typecheck": "tsc --noEmit",
14
+ "test": "jest",
15
+ "test:watch": "jest --watch",
16
+ "test:coverage": "jest --coverage",
14
17
  "prepare": "npm run build",
15
18
  "prepublishOnly": "npm run clean && npm run build && npm run typecheck"
16
19
  },
@@ -46,13 +49,17 @@
46
49
  "win32"
47
50
  ],
48
51
  "devDependencies": {
49
- "@types/keytar": "^4.4.2",
52
+ "@types/jest": "^30.0.0",
50
53
  "@types/node": "^20.0.0",
54
+ "electron-rebuild": "^3.2.9",
55
+ "jest": "^30.0.2",
56
+ "ts-jest": "^29.4.0",
51
57
  "typescript": "^5.0.0"
52
58
  },
53
59
  "dependencies": {
54
60
  "@anthropic-ai/claude-code": ">=0.1.0",
55
- "keytar": "^7.9.0"
61
+ "keytar": "^7.9.0",
62
+ "rebuild": "^0.1.2"
56
63
  },
57
64
  "peerDependencies": {
58
65
  "@anthropic-ai/claude-code": ">=0.1.0"