@memorilabs/axon 0.0.1 → 0.1.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 +99 -0
- package/dist/core/axon.d.ts +67 -0
- package/dist/core/axon.d.ts.map +1 -0
- package/dist/core/axon.js +68 -0
- package/dist/core/axon.js.map +1 -0
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +9 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/errors/axon-error.d.ts +7 -0
- package/dist/errors/axon-error.d.ts.map +1 -0
- package/dist/errors/axon-error.js +10 -0
- package/dist/errors/axon-error.js.map +1 -0
- package/dist/errors/hook-error.d.ts +13 -0
- package/dist/errors/hook-error.d.ts.map +1 -0
- package/dist/errors/hook-error.js +15 -0
- package/dist/errors/hook-error.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/unsupported-provider-error.d.ts +9 -0
- package/dist/errors/unsupported-provider-error.d.ts.map +1 -0
- package/dist/errors/unsupported-provider-error.js +13 -0
- package/dist/errors/unsupported-provider-error.js.map +1 -0
- package/dist/hooks/hooked.d.ts +48 -0
- package/dist/hooks/hooked.d.ts.map +1 -0
- package/dist/hooks/hooked.js +95 -0
- package/dist/hooks/hooked.js.map +1 -0
- package/dist/hooks/registry.d.ts +28 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +50 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/registry.d.ts +29 -0
- package/dist/llm/registry.d.ts.map +1 -0
- package/dist/llm/registry.js +41 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/providers/anthropic/common.d.ts +8 -0
- package/dist/providers/anthropic/common.d.ts.map +1 -0
- package/dist/providers/anthropic/common.js +58 -0
- package/dist/providers/anthropic/common.js.map +1 -0
- package/dist/providers/anthropic/detect.d.ts +2 -0
- package/dist/providers/anthropic/detect.d.ts.map +1 -0
- package/dist/providers/anthropic/detect.js +7 -0
- package/dist/providers/anthropic/detect.js.map +1 -0
- package/dist/providers/anthropic/index.d.ts +5 -0
- package/dist/providers/anthropic/index.d.ts.map +1 -0
- package/dist/providers/anthropic/index.js +10 -0
- package/dist/providers/anthropic/index.js.map +1 -0
- package/dist/providers/anthropic/proxy.d.ts +8 -0
- package/dist/providers/anthropic/proxy.d.ts.map +1 -0
- package/dist/providers/anthropic/proxy.js +57 -0
- package/dist/providers/anthropic/proxy.js.map +1 -0
- package/dist/providers/anthropic/types.d.ts +43 -0
- package/dist/providers/anthropic/types.d.ts.map +1 -0
- package/dist/providers/anthropic/types.js +2 -0
- package/dist/providers/anthropic/types.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai/common.d.ts +11 -0
- package/dist/providers/openai/common.d.ts.map +1 -0
- package/dist/providers/openai/common.js +42 -0
- package/dist/providers/openai/common.js.map +1 -0
- package/dist/providers/openai/detect.d.ts +2 -0
- package/dist/providers/openai/detect.d.ts.map +1 -0
- package/dist/providers/openai/detect.js +9 -0
- package/dist/providers/openai/detect.js.map +1 -0
- package/dist/providers/openai/index.d.ts +9 -0
- package/dist/providers/openai/index.d.ts.map +1 -0
- package/dist/providers/openai/index.js +14 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/proxy.d.ts +3 -0
- package/dist/providers/openai/proxy.d.ts.map +1 -0
- package/dist/providers/openai/proxy.js +91 -0
- package/dist/providers/openai/proxy.js.map +1 -0
- package/dist/providers/openai/responses.d.ts +26 -0
- package/dist/providers/openai/responses.d.ts.map +1 -0
- package/dist/providers/openai/responses.js +4 -0
- package/dist/providers/openai/responses.js.map +1 -0
- package/dist/providers/openai/types.d.ts +30 -0
- package/dist/providers/openai/types.d.ts.map +1 -0
- package/dist/providers/openai/types.js +2 -0
- package/dist/providers/openai/types.js.map +1 -0
- package/dist/providers/patcher.d.ts +15 -0
- package/dist/providers/patcher.d.ts.map +1 -0
- package/dist/providers/patcher.js +41 -0
- package/dist/providers/patcher.js.map +1 -0
- package/dist/types/config.d.ts +23 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.d.ts +17 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +13 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/llm.d.ts +46 -0
- package/dist/types/llm.d.ts.map +1 -0
- package/dist/types/llm.js +2 -0
- package/dist/types/llm.js.map +1 -0
- package/package.json +104 -4
- package/.npmrc.bak +0 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAElC,OAAO,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAElC,OAAO,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Axon } from '../core/axon.js';
|
|
2
|
+
export type ClientMatcher = (client: unknown) => boolean;
|
|
3
|
+
export type ClientPatcher = (client: unknown, axon: Axon) => void;
|
|
4
|
+
/**
|
|
5
|
+
* Manages the detection and patching of third-party LLM clients.
|
|
6
|
+
* This registry acts as the bridge between Axon and libraries like `openai`, `anthropic`, etc.
|
|
7
|
+
*/
|
|
8
|
+
export declare class LLMRegistry {
|
|
9
|
+
private readonly axon;
|
|
10
|
+
private static globalRegistrations;
|
|
11
|
+
constructor(axon: Axon);
|
|
12
|
+
/**
|
|
13
|
+
* Registers a provider strategy globally.
|
|
14
|
+
* This is typically called by provider implementation files (side-effect imports).
|
|
15
|
+
*
|
|
16
|
+
* @param matcher - A function that returns `true` if a client instance belongs to this provider.
|
|
17
|
+
* @param patcher - A function that applies the Axon proxy to the client instance.
|
|
18
|
+
*/
|
|
19
|
+
static registerProvider(matcher: ClientMatcher, patcher: ClientPatcher): void;
|
|
20
|
+
/**
|
|
21
|
+
* Patches a third-party client instance to route calls through Axon.
|
|
22
|
+
*
|
|
23
|
+
* @param client - The initialized LLM client instance (e.g. `new OpenAI(...)`).
|
|
24
|
+
* @returns The Axon instance for method chaining.
|
|
25
|
+
* @throws {UnsupportedLLMProviderError} If the provided client is not supported or recognized.
|
|
26
|
+
*/
|
|
27
|
+
register(client: unknown): Axon;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/llm/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AAOlE;;;GAGG;AACH,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAA8B;gBAEnC,IAAI,EAAE,IAAI;IAEvC;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAI7E;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;CAahC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { UnsupportedLLMProviderError } from '../errors/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages the detection and patching of third-party LLM clients.
|
|
4
|
+
* This registry acts as the bridge between Axon and libraries like `openai`, `anthropic`, etc.
|
|
5
|
+
*/
|
|
6
|
+
export class LLMRegistry {
|
|
7
|
+
axon;
|
|
8
|
+
static globalRegistrations = [];
|
|
9
|
+
constructor(axon) {
|
|
10
|
+
this.axon = axon;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Registers a provider strategy globally.
|
|
14
|
+
* This is typically called by provider implementation files (side-effect imports).
|
|
15
|
+
*
|
|
16
|
+
* @param matcher - A function that returns `true` if a client instance belongs to this provider.
|
|
17
|
+
* @param patcher - A function that applies the Axon proxy to the client instance.
|
|
18
|
+
*/
|
|
19
|
+
static registerProvider(matcher, patcher) {
|
|
20
|
+
this.globalRegistrations.push({ matcher, patcher });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Patches a third-party client instance to route calls through Axon.
|
|
24
|
+
*
|
|
25
|
+
* @param client - The initialized LLM client instance (e.g. `new OpenAI(...)`).
|
|
26
|
+
* @returns The Axon instance for method chaining.
|
|
27
|
+
* @throws {UnsupportedLLMProviderError} If the provided client is not supported or recognized.
|
|
28
|
+
*/
|
|
29
|
+
register(client) {
|
|
30
|
+
for (const reg of LLMRegistry.globalRegistrations) {
|
|
31
|
+
if (reg.matcher(client)) {
|
|
32
|
+
reg.patcher(client, this.axon);
|
|
33
|
+
return this.axon;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Attempt to extract a meaningful name for the error message
|
|
37
|
+
const clientName = client?.constructor?.name ?? typeof client;
|
|
38
|
+
throw new UnsupportedLLMProviderError(clientName);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/llm/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAUjE;;;GAGG;AACH,MAAM,OAAO,WAAW;IAGO;IAFrB,MAAM,CAAC,mBAAmB,GAA2B,EAAE,CAAC;IAEhE,YAA6B,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAG,CAAC;IAE3C;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAsB,EAAE,OAAsB;QACpE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,MAAe;QACtB,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;YAClD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,MAAM,UAAU,GACb,MAAqD,EAAE,WAAW,EAAE,IAAI,IAAI,OAAO,MAAM,CAAC;QAC7F,MAAM,IAAI,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Message, LLMRequest, Usage, LLMResponse } from '../../types/index.js';
|
|
2
|
+
import { AnthropicMessage } from './types.js';
|
|
3
|
+
export declare function anthropicInputToMessages(input: unknown): Message[];
|
|
4
|
+
export declare function messagesToAnthropicInput(request: LLMRequest): AnthropicMessage[];
|
|
5
|
+
export declare function contentFromAnthropic(response: unknown): string;
|
|
6
|
+
export declare function usageFromAnthropic(response: unknown): Usage | undefined;
|
|
7
|
+
export declare function applyContentToResponse(raw: unknown, canonical: LLMResponse): void;
|
|
8
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AAEjE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAgBlE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAKhF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAS9D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CASvE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAYjF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function anthropicInputToMessages(input) {
|
|
2
|
+
if (!Array.isArray(input))
|
|
3
|
+
throw new Error('Invalid Anthropic input format');
|
|
4
|
+
return input.map((m) => {
|
|
5
|
+
let content = '';
|
|
6
|
+
// Anthropic messages can be a string or an array of content blocks
|
|
7
|
+
if (typeof m.content === 'string') {
|
|
8
|
+
content = m.content;
|
|
9
|
+
}
|
|
10
|
+
else if (Array.isArray(m.content)) {
|
|
11
|
+
content = m.content
|
|
12
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
13
|
+
.map((c) => c.text)
|
|
14
|
+
.join('');
|
|
15
|
+
}
|
|
16
|
+
return { role: m.role, content };
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function messagesToAnthropicInput(request) {
|
|
20
|
+
return request.messages.map((m) => ({
|
|
21
|
+
role: m.role,
|
|
22
|
+
content: m.content,
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
export function contentFromAnthropic(response) {
|
|
26
|
+
const r = response;
|
|
27
|
+
if (Array.isArray(r.content)) {
|
|
28
|
+
return r.content
|
|
29
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
30
|
+
.map((c) => c.text)
|
|
31
|
+
.join('');
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
export function usageFromAnthropic(response) {
|
|
36
|
+
const r = response;
|
|
37
|
+
if (!r.usage)
|
|
38
|
+
return undefined;
|
|
39
|
+
return {
|
|
40
|
+
promptTokens: r.usage.input_tokens,
|
|
41
|
+
completionTokens: r.usage.output_tokens,
|
|
42
|
+
totalTokens: r.usage.input_tokens + r.usage.output_tokens,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function applyContentToResponse(raw, canonical) {
|
|
46
|
+
const r = raw;
|
|
47
|
+
// Best-effort mutation: overwrite the first text block and remove others to maintain consistency
|
|
48
|
+
if (Array.isArray(r.content) && r.content.length > 0 && r.content[0].type === 'text') {
|
|
49
|
+
r.content[0].text = canonical.content;
|
|
50
|
+
if (r.content.length > 1) {
|
|
51
|
+
r.content.splice(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (Array.isArray(r.content) && r.content.length === 0) {
|
|
55
|
+
r.content.push({ type: 'text', text: canonical.content });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/providers/anthropic/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/detect.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAM1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/providers/anthropic/detect.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAExD,MAAM,GAAG,GAAG,MAA6C,CAAC;IAE1D,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAID,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LLMRegistry } from '../../llm/registry.js';
|
|
2
|
+
import { isAnthropicClient } from './detect.js';
|
|
3
|
+
import { patchAnthropicClient } from './proxy.js';
|
|
4
|
+
export function register() {
|
|
5
|
+
LLMRegistry.registerProvider(isAnthropicClient, patchAnthropicClient);
|
|
6
|
+
}
|
|
7
|
+
register();
|
|
8
|
+
export { isAnthropicClient };
|
|
9
|
+
export * from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,UAAU,QAAQ;IACtB,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AACxE,CAAC;AAED,QAAQ,EAAE,CAAC;AAEX,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Axon } from '../../core/axon.js';
|
|
2
|
+
/**
|
|
3
|
+
* Injects Axon hooks into an Anthropic client instance.
|
|
4
|
+
* @param client - The Anthropic client instance to patch.
|
|
5
|
+
* @param axon - The Axon instance managing the hooks.
|
|
6
|
+
*/
|
|
7
|
+
export declare function patchAnthropicClient(client: unknown, axon: Axon): void;
|
|
8
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAgD/C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAkBtE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { anthropicInputToMessages, messagesToAnthropicInput, contentFromAnthropic, usageFromAnthropic, applyContentToResponse, } from './common.js';
|
|
2
|
+
import { patchMethod } from '../patcher.js';
|
|
3
|
+
function extractParams(args) {
|
|
4
|
+
// Separate model and messages from extra provider-specific parameters
|
|
5
|
+
const { model: _model, messages: _messages, ...params } = args;
|
|
6
|
+
return params;
|
|
7
|
+
}
|
|
8
|
+
function argsToRequest(args) {
|
|
9
|
+
return {
|
|
10
|
+
messages: anthropicInputToMessages(args.messages),
|
|
11
|
+
model: args.model,
|
|
12
|
+
params: extractParams(args),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function requestToArgs(request) {
|
|
16
|
+
if (!request.model)
|
|
17
|
+
throw new Error('No model provided.');
|
|
18
|
+
return {
|
|
19
|
+
model: request.model,
|
|
20
|
+
messages: messagesToAnthropicInput(request),
|
|
21
|
+
...(request.params ?? {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function rawToCanonical(raw) {
|
|
25
|
+
return { content: contentFromAnthropic(raw), usage: usageFromAnthropic(raw), raw };
|
|
26
|
+
}
|
|
27
|
+
function chunkToText(chunk) {
|
|
28
|
+
const event = chunk;
|
|
29
|
+
// Only extract text from 'content_block_delta' events to avoid metadata noise
|
|
30
|
+
if (event.type === 'content_block_delta' && event.delta?.type === 'text_delta') {
|
|
31
|
+
return event.delta.text;
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Injects Axon hooks into an Anthropic client instance.
|
|
37
|
+
* @param client - The Anthropic client instance to patch.
|
|
38
|
+
* @param axon - The Axon instance managing the hooks.
|
|
39
|
+
*/
|
|
40
|
+
export function patchAnthropicClient(client, axon) {
|
|
41
|
+
const antClient = client;
|
|
42
|
+
if (!antClient.messages) {
|
|
43
|
+
throw new Error('Anthropic client has no messages API.');
|
|
44
|
+
}
|
|
45
|
+
patchMethod({
|
|
46
|
+
axon,
|
|
47
|
+
parent: antClient.messages,
|
|
48
|
+
methodName: 'create',
|
|
49
|
+
ctxMetadata: { provider: 'anthropic', method: 'messages.create' },
|
|
50
|
+
argsToRequest,
|
|
51
|
+
requestToArgs,
|
|
52
|
+
rawToResponse: rawToCanonical,
|
|
53
|
+
applyCanonicalToRaw: applyContentToResponse,
|
|
54
|
+
chunkToText,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/anthropic/proxy.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,SAAS,aAAa,CAAC,IAAyB;IAC9C,sEAAsE;IACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAyB;IAC9C,OAAO;QACL,QAAQ,EAAE,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAmB;IACxC,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,wBAAwB,CAAC,OAAO,CAAC;QAC3C,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;KACH,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,KAAK,GAAG,KAA6B,CAAC;IAC5C,8EAA8E;IAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAe,EAAE,IAAU;IAC9D,MAAM,SAAS,GAAG,MAAyB,CAAC;IAE5C,IAAI,CAAE,SAAgD,CAAC,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,CAAC;QACV,IAAI;QACJ,MAAM,EAAE,SAAS,CAAC,QAAQ;QAC1B,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE;QACjE,aAAa;QACb,aAAa;QACb,aAAa,EAAE,cAAc;QAC7B,mBAAmB,EAAE,sBAAsB;QAC3C,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface AnthropicMessage {
|
|
2
|
+
role: string;
|
|
3
|
+
content: string | Array<{
|
|
4
|
+
type: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface AnthropicCreateArgs {
|
|
10
|
+
model: string;
|
|
11
|
+
messages: AnthropicMessage[];
|
|
12
|
+
stream?: boolean;
|
|
13
|
+
max_tokens?: number;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface AnthropicUsage {
|
|
17
|
+
input_tokens: number;
|
|
18
|
+
output_tokens: number;
|
|
19
|
+
}
|
|
20
|
+
export interface AnthropicResponse {
|
|
21
|
+
content: Array<{
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}>;
|
|
25
|
+
usage?: AnthropicUsage;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface AnthropicStreamEvent {
|
|
29
|
+
type: string;
|
|
30
|
+
delta?: {
|
|
31
|
+
type: string;
|
|
32
|
+
text?: string;
|
|
33
|
+
};
|
|
34
|
+
usage?: AnthropicUsage;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface AnthropicClient {
|
|
38
|
+
messages: {
|
|
39
|
+
create: (args: AnthropicCreateArgs) => Promise<unknown>;
|
|
40
|
+
__axon_patched__?: boolean;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Message, LLMRequest, Usage, LLMResponse } from '../../types/index.js';
|
|
2
|
+
export declare function openaiInputToMessages(input: unknown): Message[];
|
|
3
|
+
export declare function messagesToOpenAIInput(request: LLMRequest): {
|
|
4
|
+
role: string;
|
|
5
|
+
content: string;
|
|
6
|
+
}[];
|
|
7
|
+
export declare function contentFromOpenAI(response: unknown): string;
|
|
8
|
+
export declare function usageFromOpenAI(response: unknown): Usage | undefined;
|
|
9
|
+
export declare function applyContentToTextResponse(raw: unknown, canonical: LLMResponse): void;
|
|
10
|
+
export declare function applyContentToChatResponse(raw: unknown, canonical: LLMResponse): void;
|
|
11
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAK/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAI/D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAE9F;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAK3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAQpE;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAKrF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAKrF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { hasUsage } from './responses.js';
|
|
2
|
+
export function openaiInputToMessages(input) {
|
|
3
|
+
if (typeof input === 'string')
|
|
4
|
+
return [{ role: 'user', content: input }];
|
|
5
|
+
if (Array.isArray(input))
|
|
6
|
+
return input;
|
|
7
|
+
throw new Error('Invalid OpenAI input format');
|
|
8
|
+
}
|
|
9
|
+
export function messagesToOpenAIInput(request) {
|
|
10
|
+
return request.messages.map((m) => ({ role: m.role, content: m.content }));
|
|
11
|
+
}
|
|
12
|
+
export function contentFromOpenAI(response) {
|
|
13
|
+
const r = response;
|
|
14
|
+
if ('output_text' in r)
|
|
15
|
+
return r.output_text;
|
|
16
|
+
if ('choices' in r && r.choices[0]?.message?.content)
|
|
17
|
+
return r.choices[0].message.content;
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
export function usageFromOpenAI(response) {
|
|
21
|
+
if (!hasUsage(response))
|
|
22
|
+
return undefined;
|
|
23
|
+
const u = response.usage;
|
|
24
|
+
return {
|
|
25
|
+
promptTokens: u.prompt_tokens ?? u.input_tokens,
|
|
26
|
+
completionTokens: u.completion_tokens ?? u.output_tokens,
|
|
27
|
+
totalTokens: u.total_tokens,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function applyContentToTextResponse(raw, canonical) {
|
|
31
|
+
const r = raw;
|
|
32
|
+
if ('output_text' in r) {
|
|
33
|
+
r.output_text = canonical.content;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function applyContentToChatResponse(raw, canonical) {
|
|
37
|
+
const r = raw;
|
|
38
|
+
if (r.choices[0]?.message) {
|
|
39
|
+
r.choices[0].message.content = canonical.content;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/providers/openai/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAoD,MAAM,gBAAgB,CAAC;AAI5F,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAkB,CAAC;IACpD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAmB;IACvD,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,MAAM,CAAC,GAAG,QAA6B,CAAC;IACxC,IAAI,aAAa,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC;IAC7C,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC1F,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACzB,OAAO;QACL,YAAY,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,YAAY;QAC/C,gBAAgB,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,aAAa;QACxD,WAAW,EAAE,CAAC,CAAC,YAAY;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY,EAAE,SAAsB;IAC7E,MAAM,CAAC,GAAG,GAAyB,CAAC;IACpC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY,EAAE,SAAsB;IAC7E,MAAM,CAAC,GAAG,GAAmC,CAAC;IAC9C,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/detect.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAQvD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function isOpenAIClient(client) {
|
|
2
|
+
if (!client || typeof client !== 'object')
|
|
3
|
+
return false;
|
|
4
|
+
const obj = client;
|
|
5
|
+
const hasResponses = !!(obj.responses && typeof obj.responses.create === 'function');
|
|
6
|
+
const hasChat = !!(obj.chat?.completions && typeof obj.chat.completions.create === 'function');
|
|
7
|
+
return hasResponses || hasChat;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/providers/openai/detect.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,GAAG,GAAG,MAAsB,CAAC;IAEnC,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAE/F,OAAO,YAAY,IAAI,OAAO,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAID,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LLMRegistry } from '../../llm/registry.js';
|
|
2
|
+
import { isOpenAIClient } from './detect.js';
|
|
3
|
+
import { patchOpenAIClient } from './proxy.js';
|
|
4
|
+
/**
|
|
5
|
+
* Auto-registers the OpenAI provider strategy.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export function register() {
|
|
9
|
+
LLMRegistry.registerProvider(isOpenAIClient, patchOpenAIClient);
|
|
10
|
+
}
|
|
11
|
+
register();
|
|
12
|
+
export { isOpenAIClient };
|
|
13
|
+
export * from './types.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,WAAW,CAAC,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED,QAAQ,EAAE,CAAC;AAEX,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AA4E/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CA4CnE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { openaiInputToMessages, messagesToOpenAIInput, contentFromOpenAI, usageFromOpenAI, applyContentToTextResponse, applyContentToChatResponse, } from './common.js';
|
|
2
|
+
import { isOpenAIClient } from './detect.js';
|
|
3
|
+
import { patchMethod } from '../patcher.js';
|
|
4
|
+
function extractParams(args, inputKey) {
|
|
5
|
+
const { model: _model, [inputKey]: _input, ...params } = args;
|
|
6
|
+
return params;
|
|
7
|
+
}
|
|
8
|
+
function responsesArgsToRequest(args) {
|
|
9
|
+
return {
|
|
10
|
+
messages: openaiInputToMessages(args.input),
|
|
11
|
+
model: args.model,
|
|
12
|
+
params: extractParams(args, 'input'),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function requestToResponsesArgs(request) {
|
|
16
|
+
if (!request.model)
|
|
17
|
+
throw new Error('No model provided.');
|
|
18
|
+
return {
|
|
19
|
+
model: request.model,
|
|
20
|
+
input: messagesToOpenAIInput(request),
|
|
21
|
+
...(request.params ?? {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function chatArgsToRequest(args) {
|
|
25
|
+
return {
|
|
26
|
+
messages: openaiInputToMessages(args.messages),
|
|
27
|
+
model: args.model,
|
|
28
|
+
params: extractParams(args, 'messages'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function requestToChatArgs(request) {
|
|
32
|
+
if (!request.model)
|
|
33
|
+
throw new Error('No model provided.');
|
|
34
|
+
return {
|
|
35
|
+
model: request.model,
|
|
36
|
+
messages: messagesToOpenAIInput(request),
|
|
37
|
+
...(request.params ?? {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function rawToCanonical(raw) {
|
|
41
|
+
return { content: contentFromOpenAI(raw), usage: usageFromOpenAI(raw), raw };
|
|
42
|
+
}
|
|
43
|
+
function chunkToText(chunk) {
|
|
44
|
+
const chatChunk = chunk;
|
|
45
|
+
const content = chatChunk.choices[0]?.delta?.content;
|
|
46
|
+
if (typeof content === 'string')
|
|
47
|
+
return content;
|
|
48
|
+
const textChunk = chunk;
|
|
49
|
+
if (typeof textChunk.output_text === 'string')
|
|
50
|
+
return textChunk.output_text;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
export function patchOpenAIClient(client, axon) {
|
|
54
|
+
const openaiClient = client;
|
|
55
|
+
let patchedAny = false;
|
|
56
|
+
// Patch Legacy Responses API
|
|
57
|
+
if (openaiClient.responses) {
|
|
58
|
+
if (patchMethod({
|
|
59
|
+
axon,
|
|
60
|
+
parent: openaiClient.responses,
|
|
61
|
+
methodName: 'create',
|
|
62
|
+
ctxMetadata: { provider: 'openai', method: 'responses.create' },
|
|
63
|
+
argsToRequest: responsesArgsToRequest,
|
|
64
|
+
requestToArgs: requestToResponsesArgs,
|
|
65
|
+
rawToResponse: rawToCanonical,
|
|
66
|
+
applyCanonicalToRaw: applyContentToTextResponse,
|
|
67
|
+
})) {
|
|
68
|
+
patchedAny = true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Patch Chat Completions API
|
|
72
|
+
if (openaiClient.chat?.completions) {
|
|
73
|
+
if (patchMethod({
|
|
74
|
+
axon,
|
|
75
|
+
parent: openaiClient.chat.completions,
|
|
76
|
+
methodName: 'create',
|
|
77
|
+
ctxMetadata: { provider: 'openai', method: 'chat.completions.create' },
|
|
78
|
+
argsToRequest: chatArgsToRequest,
|
|
79
|
+
requestToArgs: requestToChatArgs,
|
|
80
|
+
rawToResponse: rawToCanonical,
|
|
81
|
+
applyCanonicalToRaw: applyContentToChatResponse,
|
|
82
|
+
chunkToText,
|
|
83
|
+
})) {
|
|
84
|
+
patchedAny = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!patchedAny && !isOpenAIClient(client)) {
|
|
88
|
+
throw new Error('OpenAI client has no patchable APIs.');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/openai/proxy.ts"],"names":[],"mappings":"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"}
|