Skip to content

Commit cae1049

Browse files
committed
fix: wip
1 parent 37daba0 commit cae1049

13 files changed

Lines changed: 59 additions & 91 deletions

File tree

.coderabbit.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ reviews:
1616

1717
# Ignore non-code files to save quota
1818
path_filters:
19-
- '!*.md'
20-
- '!*.lock'
21-
- '!*.json'
19+
- '!**/*.md'
20+
- '!**/*.lock'
21+
- '!**/*.json'
2222
- '!docs/**'
2323
- '!examples/**'
2424

.github/workflows/docker-build.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ name: Build and Push Docker Image
44
on:
55
push:
66
tags:
7-
- "v*" # Trigger on version tags (v0.1.0, v1.0.0, etc.)
7+
- 'v*' # Trigger on version tags (v0.1.0, v1.0.0, etc.)
88
branches:
99
- main # Also build on main branch pushes
1010
paths:
11-
- "proxy/**"
12-
- ".github/workflows/docker-build.yml"
11+
- 'proxy/**'
12+
- '.github/workflows/docker-build.yml'
1313

1414
env:
1515
REGISTRY: ghcr.io

proxy/src/adapters/anthropic.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ describe('AnthropicAdapter', () => {
8787
url: '/test',
8888
method: 'POST',
8989
headers: {
90-
'x-api-key': ['key1', 'key2'] as any,
90+
'x-api-key': 'key1',
9191
},
9292
body: {},
9393
};

proxy/src/adapters/base.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
1-
import { AnthropicMessageResponse } from "@/types/providers/anthropic.type";
2-
import {
3-
StandardRequest,
4-
StandardResponse,
5-
} from "../types/standard-message.type";
6-
import { OpenAIChatCompletionResponse } from "@/types/providers/openai.type";
7-
import { BedrockAmazonTitanResponse } from "@/types/providers/bedrock";
8-
import { BedrockInvokeResponse } from "@/types/providers/bedrock/common.type";
9-
import {
10-
ProviderRequest,
11-
ProviderResponse,
12-
} from "@/types/providers/common.type";
1+
import { StandardRequest, StandardResponse } from '../types/standard-message.type';
2+
import { ProviderRequest, ProviderResponse } from '@/types/providers/common.type';
133

144
export abstract class ProviderAdapter {
155
/**
@@ -36,6 +26,6 @@ export abstract class ProviderAdapter {
3626
* Get provider name (used for routing)
3727
*/
3828
getProviderName(): string {
39-
return this.constructor.name.replace("Adapter", "").toLowerCase();
29+
return this.constructor.name.replace('Adapter', '').toLowerCase();
4030
}
4131
}

proxy/src/adapters/bedrock-handlers/anthropic-handler.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ describe('AnthropicBedrockHandler', () => {
133133
messages: [
134134
{
135135
role: 'user',
136-
content: [{ type: 'image' as any, source: 'base64data' } as any],
136+
content: [{ type: 'image', source: 'base64data' }],
137137
},
138138
],
139139
max_tokens: 1000,

proxy/src/adapters/bedrock-handlers/anthropic-handler.ts

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
11
// src/adapters/bedrock/anthropic-handler.ts
2-
import {
3-
StandardMessage,
4-
StandardRequest,
5-
StandardResponse,
6-
} from "@/types/standard-message.type";
7-
import { BedrockModelHandler } from "./base-handler";
8-
import {
9-
BedrockAnthropicRequest,
10-
BedrockAnthropicResponse,
11-
} from "@/types/providers/bedrock/anthropic.type";
12-
import { BedrockInvokeResponse } from "@/types/providers/bedrock/common.type";
13-
import { AnthropicMessageResponse } from "@/types/providers/anthropic.type";
2+
import { StandardMessage, StandardRequest, StandardResponse } from '@/types/standard-message.type';
3+
import { BedrockModelHandler } from './base-handler';
4+
import { BedrockAnthropicRequest } from '@/types/providers/bedrock/anthropic.type';
145

156
export class AnthropicBedrockHandler extends BedrockModelHandler {
167
canHandleRequest(modelId: string): boolean {
17-
return modelId.startsWith("anthropic.claude");
8+
return modelId.startsWith('anthropic.claude');
189
}
1910

2011
getProviderName(): string {
21-
return "anthropic";
12+
return 'anthropic';
2213
}
2314

2415
transformRequest(body: BedrockAnthropicRequest): StandardRequest {
2516
const messages: StandardMessage[] = body.messages.map((msg) => ({
2617
role: msg.role,
2718
content:
28-
typeof msg.content === "string"
19+
typeof msg.content === 'string'
2920
? msg.content
30-
: msg.content.find((c) => c.type === "text")?.text || "",
21+
: msg.content.find((c) => c.type === 'text')?.text || '',
3122
}));
3223

3324
return {
@@ -43,16 +34,16 @@ export class AnthropicBedrockHandler extends BedrockModelHandler {
4334
transformResponse(standard: StandardResponse): AnthropicMessageResponse {
4435
return {
4536
id: standard.id,
46-
type: "message",
47-
role: "assistant",
37+
type: 'message',
38+
role: 'assistant',
4839
content: [
4940
{
50-
type: "text",
41+
type: 'text',
5142
text: standard.content,
5243
},
5344
],
5445
model: standard.model,
55-
stop_reason: standard.finishReason === "stop" ? "end_turn" : "max_tokens",
46+
stop_reason: standard.finishReason === 'stop' ? 'end_turn' : 'max_tokens',
5647
usage: {
5748
input_tokens: standard.usage.promptTokens,
5849
output_tokens: standard.usage.completionTokens,

proxy/src/adapters/bedrock.spec.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { BedrockAdapter } from './bedrock';
22
import { ProviderRequest } from '@/types/providers/common.type';
3+
import { BedrockRequest } from '@/types/providers/bedrock/common.type';
34
import { StandardResponse } from '@/types/standard-message.type';
45

56
describe('BedrockAdapter', () => {
@@ -329,7 +330,7 @@ describe('BedrockAdapter', () => {
329330
};
330331

331332
// Act
332-
const result = adapter.transformRequest(request as any);
333+
const result = adapter.transformRequest(request as BedrockRequest);
333334

334335
// Assert
335336
expect(result.messages).toEqual([{ role: 'user', content: 'Test' }]);
@@ -349,7 +350,7 @@ describe('BedrockAdapter', () => {
349350
};
350351

351352
// Act
352-
const result = adapter.transformRequest(request as any);
353+
const result = adapter.transformRequest(request as BedrockRequest);
353354

354355
// Assert
355356
expect(result).toBeDefined();
@@ -369,7 +370,7 @@ describe('BedrockAdapter', () => {
369370
};
370371

371372
// Act
372-
adapter.transformRequest(request as any);
373+
adapter.transformRequest(request as BedrockRequest);
373374

374375
// Assert - model ID should be stored for response transformation
375376
const standardResponse: StandardResponse = {
@@ -403,7 +404,7 @@ describe('BedrockAdapter', () => {
403404
messages: [{ role: 'user', content: 'Test' }],
404405
},
405406
};
406-
adapter.transformRequest(request as any);
407+
adapter.transformRequest(request as BedrockRequest);
407408

408409
const standardResponse: StandardResponse = {
409410
id: 'msg-123',
@@ -439,7 +440,7 @@ describe('BedrockAdapter', () => {
439440
messages: [{ role: 'user', content: 'Test' }],
440441
},
441442
};
442-
adapter.transformRequest(request as any);
443+
adapter.transformRequest(request as BedrockRequest);
443444

444445
const standardResponse: StandardResponse = {
445446
id: 'test-id',
@@ -508,7 +509,7 @@ describe('BedrockAdapter', () => {
508509
};
509510

510511
// Act
511-
adapter.transformRequest(request as any);
512+
adapter.transformRequest(request as BedrockRequest);
512513

513514
// Assert
514515
expect(console.warn).toHaveBeenCalledWith(
@@ -528,7 +529,7 @@ describe('BedrockAdapter', () => {
528529
};
529530

530531
// Act
531-
const result = adapter.transformRequest(request as any);
532+
const result = adapter.transformRequest(request as BedrockRequest);
532533

533534
// Assert
534535
expect(result).toBeDefined();

proxy/src/adapters/bedrock.ts

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
// src/adapters/bedrock/index.ts
22

3-
import { BedrockModelHandler } from "@/adapters/bedrock-handlers/base-handler";
4-
import { AnthropicBedrockHandler } from "@/adapters/bedrock-handlers/anthropic-handler";
5-
import { MetaBedrockHandler } from "@/adapters/bedrock-handlers/meta-llama-handler";
6-
import { CohereBedrockHandler } from "@/adapters/bedrock-handlers/cohere-handler";
7-
import { MistralBedrockHandler } from "@/adapters/bedrock-handlers/mistral-handler";
8-
import { OpenAIBedrockHandler } from "@/adapters/bedrock-handlers/open-ai-handler";
9-
import {
10-
BedrockRequest,
11-
BedrockRequestBody,
12-
} from "@/types/providers/bedrock/common.type";
13-
import { ProviderAdapter } from "./base";
14-
import {
15-
StandardRequest,
16-
StandardResponse,
17-
} from "@/types/standard-message.type";
18-
import {
19-
BedrockMessageResponse,
20-
ProviderRequest,
21-
} from "@/types/providers/common.type";
3+
import { BedrockModelHandler } from '@/adapters/bedrock-handlers/base-handler';
4+
import { AnthropicBedrockHandler } from '@/adapters/bedrock-handlers/anthropic-handler';
5+
import { MetaBedrockHandler } from '@/adapters/bedrock-handlers/meta-llama-handler';
6+
import { CohereBedrockHandler } from '@/adapters/bedrock-handlers/cohere-handler';
7+
import { MistralBedrockHandler } from '@/adapters/bedrock-handlers/mistral-handler';
8+
import { OpenAIBedrockHandler } from '@/adapters/bedrock-handlers/open-ai-handler';
9+
import { BedrockRequest, BedrockRequestBody } from '@/types/providers/bedrock/common.type';
10+
import { ProviderAdapter } from './base';
11+
import { StandardRequest, StandardResponse } from '@/types/standard-message.type';
12+
import { BedrockMessageResponse, ProviderRequest } from '@/types/providers/common.type';
2213

2314
export class BedrockAdapter extends ProviderAdapter {
2415
private handlers: BedrockModelHandler[];
@@ -40,30 +31,26 @@ export class BedrockAdapter extends ProviderAdapter {
4031
canHandleRequest(req: ProviderRequest): boolean {
4132
let confidence = 0;
4233

43-
if (
44-
req.headers["x-amzn-bedrock-model-id"] ||
45-
req.headers["x-amz-bedrock-model-id"]
46-
) {
34+
if (req.headers['x-amzn-bedrock-model-id'] || req.headers['x-amz-bedrock-model-id']) {
4735
confidence += 3;
4836
}
4937

50-
if (req.headers["authorization"]?.includes("AWS4-HMAC-SHA256")) {
38+
if (req.headers['authorization']?.includes('AWS4-HMAC-SHA256')) {
5139
confidence += 2;
5240
}
5341

54-
if (req.headers["x-amz-security-token"]) {
42+
if (req.headers['x-amz-security-token']) {
5543
confidence += 2;
5644
}
5745

58-
const bedrockUrlPattern =
59-
/^\/model\/[a-zA-Z0-9\.\-\_:]+\/invoke(?:-with-response-stream)?$/;
46+
const bedrockUrlPattern = /^\/model\/[a-zA-Z0-9._:-]+\/invoke(?:-with-response-stream)?$/;
6047
if (bedrockUrlPattern.test(req.url)) {
6148
confidence += 1;
6249
}
6350

6451
if (
65-
req.headers["host"]?.includes("bedrock-runtime") ||
66-
req.headers["host"]?.includes("bedrock.amazonaws.com")
52+
req.headers['host']?.includes('bedrock-runtime') ||
53+
req.headers['host']?.includes('bedrock.amazonaws.com')
6754
) {
6855
confidence += 2;
6956
}
@@ -73,16 +60,15 @@ export class BedrockAdapter extends ProviderAdapter {
7360

7461
getModelId(req: ProviderRequest): string {
7562
const headerModelId =
76-
req.headers["x-amzn-bedrock-model-id"] ||
77-
req.headers["x-amz-bedrock-model-id"];
63+
req.headers['x-amzn-bedrock-model-id'] || req.headers['x-amz-bedrock-model-id'];
7864

7965
if (headerModelId) {
8066
return headerModelId;
8167
}
8268

83-
const match = req.url.match(/\/model\/([^\/]+)\/invoke/);
69+
const match = req.url.match(/\/model\/([^/]+)\/invoke/);
8470
if (!match) {
85-
throw new Error("Invalid Bedrock URL format");
71+
throw new Error('Invalid Bedrock URL format');
8672
}
8773
return match[1];
8874
}
@@ -94,17 +80,15 @@ export class BedrockAdapter extends ProviderAdapter {
9480
const handler = this.handlers.find((h) => h.canHandleRequest(modelId));
9581

9682
if (!handler) {
97-
console.warn(
98-
`No handler found for Bedrock model: ${modelId}, using Anthropic as fallback`
99-
);
83+
console.warn(`No handler found for Bedrock model: ${modelId}, using Anthropic as fallback`);
10084
return this.handlers[0]; // Fallback to Anthropic
10185
}
10286

10387
return handler;
10488
}
10589

10690
transformRequest(req: BedrockRequest): StandardRequest {
107-
const body = typeof req.body === "string" ? JSON.parse(req.body) : req.body;
91+
const body = typeof req.body === 'string' ? JSON.parse(req.body) : req.body;
10892
const modelId = this.getModelId(req);
10993

11094
// Store for use in transformResponse

proxy/src/adapters/openai.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('OpenAIAdapter', () => {
8585
url: '/test',
8686
method: 'POST',
8787
headers: {
88-
authorization: ['Bearer', 'token'] as any,
88+
authorization: 'Bearer token',
8989
},
9090
body: {},
9191
};

proxy/src/runners/ollama.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ global.fetch = jest.fn();
77
// Mock crypto.randomUUID
88
global.crypto = {
99
randomUUID: jest.fn(() => 'test-uuid-123'),
10-
} as any;
10+
} as unknown as Crypto;
1111

1212
describe('OllamaRunner', () => {
1313
let runner: OllamaRunner;

0 commit comments

Comments
 (0)