@memorilabs/axon 0.1.0 → 0.1.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.
- package/README.md +82 -67
- package/dist/core/axon.d.ts +2 -16
- package/dist/core/axon.d.ts.map +1 -1
- package/dist/core/axon.js +2 -10
- package/dist/core/axon.js.map +1 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +1 -1
- package/dist/errors/hook-error.d.ts.map +1 -1
- package/dist/errors/hook-error.js +1 -1
- package/dist/errors/hook-error.js.map +1 -1
- package/dist/errors/unsupported-provider-error.d.ts.map +1 -1
- package/dist/errors/unsupported-provider-error.js +2 -1
- package/dist/errors/unsupported-provider-error.js.map +1 -1
- package/dist/hooks/registry.d.ts +16 -7
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +14 -2
- package/dist/hooks/registry.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/registry.d.ts +10 -4
- package/dist/llm/registry.d.ts.map +1 -1
- package/dist/llm/registry.js +9 -2
- package/dist/llm/registry.js.map +1 -1
- package/dist/providers/anthropic/common.d.ts.map +1 -1
- package/dist/providers/anthropic/common.js +4 -1
- package/dist/providers/anthropic/common.js.map +1 -1
- package/dist/providers/anthropic/detect.d.ts +5 -0
- package/dist/providers/anthropic/detect.d.ts.map +1 -1
- package/dist/providers/anthropic/detect.js +5 -0
- package/dist/providers/anthropic/detect.js.map +1 -1
- package/dist/providers/anthropic/proxy.d.ts.map +1 -1
- package/dist/providers/anthropic/proxy.js +19 -4
- package/dist/providers/anthropic/proxy.js.map +1 -1
- package/dist/providers/anthropic/responses.d.ts +22 -0
- package/dist/providers/anthropic/responses.d.ts.map +1 -0
- package/dist/providers/anthropic/responses.js +2 -0
- package/dist/providers/anthropic/responses.js.map +1 -0
- package/dist/providers/anthropic/types.d.ts +11 -27
- package/dist/providers/anthropic/types.d.ts.map +1 -1
- package/dist/providers/gemini/common.d.ts +8 -0
- package/dist/providers/gemini/common.d.ts.map +1 -0
- package/dist/providers/gemini/common.js +46 -0
- package/dist/providers/gemini/common.js.map +1 -0
- package/dist/providers/gemini/detect.d.ts +7 -0
- package/dist/providers/gemini/detect.d.ts.map +1 -0
- package/dist/providers/gemini/detect.js +12 -0
- package/dist/providers/gemini/detect.js.map +1 -0
- package/dist/providers/gemini/index.d.ts +5 -0
- package/dist/providers/gemini/index.d.ts.map +1 -0
- package/dist/providers/gemini/index.js +10 -0
- package/dist/providers/gemini/index.js.map +1 -0
- package/dist/providers/gemini/proxy.d.ts +3 -0
- package/dist/providers/gemini/proxy.d.ts.map +1 -0
- package/dist/providers/gemini/proxy.js +72 -0
- package/dist/providers/gemini/proxy.js.map +1 -0
- package/dist/providers/gemini/responses.d.ts +17 -0
- package/dist/providers/gemini/responses.d.ts.map +1 -0
- package/dist/providers/gemini/responses.js +2 -0
- package/dist/providers/gemini/responses.js.map +1 -0
- package/dist/providers/gemini/types.d.ts +23 -0
- package/dist/providers/gemini/types.d.ts.map +1 -0
- package/dist/providers/gemini/types.js +2 -0
- package/dist/providers/gemini/types.js.map +1 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai/detect.d.ts +5 -0
- package/dist/providers/openai/detect.d.ts.map +1 -1
- package/dist/providers/openai/detect.js +5 -0
- package/dist/providers/openai/detect.js.map +1 -1
- package/dist/providers/openai/proxy.d.ts.map +1 -1
- package/dist/providers/openai/proxy.js +9 -2
- package/dist/providers/openai/proxy.js.map +1 -1
- package/dist/providers/openai/responses.d.ts +9 -9
- package/dist/providers/openai/responses.d.ts.map +1 -1
- package/dist/providers/openai/types.d.ts +5 -0
- package/dist/providers/openai/types.d.ts.map +1 -1
- package/dist/providers/patcher.d.ts.map +1 -1
- package/dist/providers/patcher.js +2 -9
- package/dist/providers/patcher.js.map +1 -1
- package/dist/providers/telemetry.d.ts +16 -0
- package/dist/providers/telemetry.d.ts.map +1 -0
- package/dist/providers/telemetry.js +41 -0
- package/dist/providers/telemetry.js.map +1 -0
- package/dist/types/context.d.ts +9 -5
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/context.js +6 -2
- package/dist/types/context.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/llm.d.ts +15 -0
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/registry.d.ts +14 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +2 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/utils/constants.d.ts +19 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +14 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +27 -14
- package/dist/core/config.d.ts +0 -6
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js +0 -9
- package/dist/core/config.js.map +0 -1
- package/dist/types/config.d.ts +0 -23
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -2
- package/dist/types/config.js.map +0 -1
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { anthropicInputToMessages, messagesToAnthropicInput, contentFromAnthropic, usageFromAnthropic, applyContentToResponse, } from './common.js';
|
|
2
2
|
import { patchMethod } from '../patcher.js';
|
|
3
|
+
import { extractSDKVersion } from '../telemetry.js';
|
|
4
|
+
import { PROVIDERS } from '../../utils/constants.js';
|
|
3
5
|
function extractParams(args) {
|
|
4
6
|
// Separate model and messages from extra provider-specific parameters
|
|
5
|
-
const { model: _model, messages: _messages, ...params } = args;
|
|
7
|
+
const { model: _model, messages: _messages, system: _system, ...params } = args;
|
|
6
8
|
return params;
|
|
7
9
|
}
|
|
8
10
|
function argsToRequest(args) {
|
|
11
|
+
const messages = anthropicInputToMessages(args.messages);
|
|
12
|
+
// If there's a system parameter at the top level, convert it to a system message
|
|
13
|
+
if (args.system) {
|
|
14
|
+
messages.unshift({ role: 'system', content: args.system });
|
|
15
|
+
}
|
|
9
16
|
return {
|
|
10
|
-
messages
|
|
17
|
+
messages,
|
|
11
18
|
model: args.model,
|
|
12
19
|
params: extractParams(args),
|
|
13
20
|
};
|
|
@@ -15,11 +22,18 @@ function argsToRequest(args) {
|
|
|
15
22
|
function requestToArgs(request) {
|
|
16
23
|
if (!request.model)
|
|
17
24
|
throw new Error('No model provided.');
|
|
18
|
-
|
|
25
|
+
// Extract system message if present
|
|
26
|
+
const systemMessage = request.messages.find((m) => m.role === 'system');
|
|
27
|
+
const args = {
|
|
19
28
|
model: request.model,
|
|
20
29
|
messages: messagesToAnthropicInput(request),
|
|
21
30
|
...(request.params ?? {}),
|
|
22
31
|
};
|
|
32
|
+
// Add system parameter at top level if system message exists
|
|
33
|
+
if (systemMessage) {
|
|
34
|
+
args.system = systemMessage.content;
|
|
35
|
+
}
|
|
36
|
+
return args;
|
|
23
37
|
}
|
|
24
38
|
function rawToCanonical(raw) {
|
|
25
39
|
return { content: contentFromAnthropic(raw), usage: usageFromAnthropic(raw), raw };
|
|
@@ -39,6 +53,7 @@ function chunkToText(chunk) {
|
|
|
39
53
|
*/
|
|
40
54
|
export function patchAnthropicClient(client, axon) {
|
|
41
55
|
const antClient = client;
|
|
56
|
+
const sdkVersion = extractSDKVersion(antClient);
|
|
42
57
|
if (!antClient.messages) {
|
|
43
58
|
throw new Error('Anthropic client has no messages API.');
|
|
44
59
|
}
|
|
@@ -46,7 +61,7 @@ export function patchAnthropicClient(client, axon) {
|
|
|
46
61
|
axon,
|
|
47
62
|
parent: antClient.messages,
|
|
48
63
|
methodName: 'create',
|
|
49
|
-
ctxMetadata: { provider:
|
|
64
|
+
ctxMetadata: { provider: PROVIDERS.ANTHROPIC.id, method: 'messages.create', sdkVersion },
|
|
50
65
|
argsToRequest,
|
|
51
66
|
requestToArgs,
|
|
52
67
|
rawToResponse: rawToCanonical,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/anthropic/proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/anthropic/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface AnthropicResponse {
|
|
2
|
+
content: Array<{
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
}>;
|
|
6
|
+
usage?: AnthropicUsage;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface AnthropicUsage {
|
|
10
|
+
input_tokens: number;
|
|
11
|
+
output_tokens: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AnthropicStreamEvent {
|
|
14
|
+
type: string;
|
|
15
|
+
delta?: {
|
|
16
|
+
type: string;
|
|
17
|
+
text?: string;
|
|
18
|
+
};
|
|
19
|
+
usage?: AnthropicUsage;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/responses.ts"],"names":[],"mappings":"AAAA,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,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/providers/anthropic/responses.ts"],"names":[],"mappings":""}
|
|
@@ -1,41 +1,25 @@
|
|
|
1
|
-
export interface AnthropicMessage {
|
|
2
|
-
role: string;
|
|
3
|
-
content: string | Array<{
|
|
4
|
-
type: string;
|
|
5
|
-
text?: string;
|
|
6
|
-
[key: string]: unknown;
|
|
7
|
-
}>;
|
|
8
|
-
}
|
|
9
1
|
export interface AnthropicCreateArgs {
|
|
10
2
|
model: string;
|
|
11
3
|
messages: AnthropicMessage[];
|
|
4
|
+
system?: string;
|
|
12
5
|
stream?: boolean;
|
|
13
6
|
max_tokens?: number;
|
|
14
7
|
[key: string]: unknown;
|
|
15
8
|
}
|
|
16
|
-
export interface
|
|
17
|
-
|
|
18
|
-
|
|
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?: {
|
|
9
|
+
export interface AnthropicMessage {
|
|
10
|
+
role: string;
|
|
11
|
+
content: string | Array<{
|
|
31
12
|
type: string;
|
|
32
13
|
text?: string;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
[key: string]: unknown;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}>;
|
|
36
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* The minimal expected shape of an initialized Anthropic client instance.
|
|
19
|
+
* Axon uses this interface to detect and safely patch the `messages.create` method.
|
|
20
|
+
*/
|
|
37
21
|
export interface AnthropicClient {
|
|
38
|
-
messages
|
|
22
|
+
messages?: {
|
|
39
23
|
create: (args: AnthropicCreateArgs) => Promise<unknown>;
|
|
40
24
|
__axon_patched__?: boolean;
|
|
41
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,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;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Message, LLMRequest, Usage, LLMResponse } from '../../types/index.js';
|
|
2
|
+
import { GeminiGenerateContentArgs } from './types.js';
|
|
3
|
+
export declare function geminiInputToMessages(contents: GeminiGenerateContentArgs['contents']): Message[];
|
|
4
|
+
export declare function messagesToGeminiInput(request: LLMRequest): GeminiGenerateContentArgs['contents'];
|
|
5
|
+
export declare function contentFromGemini(response: unknown): string;
|
|
6
|
+
export declare function usageFromGemini(response: unknown): Usage | undefined;
|
|
7
|
+
export declare function applyContentToGeminiResponse(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/gemini/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAAG,OAAO,EAAE,CAShG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAKhG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAO3D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CASpE;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAOvF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function geminiInputToMessages(contents) {
|
|
2
|
+
if (typeof contents === 'string')
|
|
3
|
+
return [{ role: 'user', content: contents }];
|
|
4
|
+
if (Array.isArray(contents)) {
|
|
5
|
+
return contents.map((c) => ({
|
|
6
|
+
role: (c.role === 'model' ? 'assistant' : 'user'),
|
|
7
|
+
content: c.parts.map((p) => p.text).join(''),
|
|
8
|
+
}));
|
|
9
|
+
}
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
export function messagesToGeminiInput(request) {
|
|
13
|
+
return request.messages.map((m) => ({
|
|
14
|
+
role: m.role === 'assistant' ? 'model' : m.role,
|
|
15
|
+
parts: [{ text: m.content }],
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
export function contentFromGemini(response) {
|
|
19
|
+
const r = response;
|
|
20
|
+
if (r.text)
|
|
21
|
+
return r.text;
|
|
22
|
+
if (r.candidates?.[0]?.content?.parts?.[0]?.text) {
|
|
23
|
+
return r.candidates[0].content.parts[0].text;
|
|
24
|
+
}
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
export function usageFromGemini(response) {
|
|
28
|
+
const r = response;
|
|
29
|
+
if (!r.usageMetadata)
|
|
30
|
+
return undefined;
|
|
31
|
+
return {
|
|
32
|
+
promptTokens: r.usageMetadata.promptTokenCount,
|
|
33
|
+
completionTokens: r.usageMetadata.candidatesTokenCount,
|
|
34
|
+
totalTokens: r.usageMetadata.totalTokenCount,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function applyContentToGeminiResponse(raw, canonical) {
|
|
38
|
+
const r = raw;
|
|
39
|
+
if (r.candidates?.[0]?.content?.parts?.[0]) {
|
|
40
|
+
r.candidates[0].content.parts[0].text = canonical.content;
|
|
41
|
+
}
|
|
42
|
+
else if (r.text !== undefined) {
|
|
43
|
+
r.text = canonical.content;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/providers/gemini/common.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,qBAAqB,CAAC,QAA+C;IACnF,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAoB;YACpE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAmB;IACvD,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,MAAM,CAAC,GAAG,QAA0B,CAAC;IACrC,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAC1B,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACjD,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,MAAM,CAAC,GAAG,QAA0B,CAAC;IACrC,IAAI,CAAC,CAAC,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAEvC,OAAO;QACL,YAAY,EAAE,CAAC,CAAC,aAAa,CAAC,gBAAgB;QAC9C,gBAAgB,EAAE,CAAC,CAAC,aAAa,CAAC,oBAAoB;QACtD,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,eAAe;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAY,EAAE,SAAsB;IAC/E,MAAM,CAAC,GAAG,GAAqB,CAAC;IAChC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;IAC5D,CAAC;SAAM,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if the provided object is an initialized Google Gemini client instance.
|
|
3
|
+
* @param client - The object to inspect.
|
|
4
|
+
* @returns True if it matches the Gemini client shape.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isGeminiClient(client: unknown): boolean;
|
|
7
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/detect.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAKvD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if the provided object is an initialized Google Gemini client instance.
|
|
3
|
+
* @param client - The object to inspect.
|
|
4
|
+
* @returns True if it matches the Gemini client shape.
|
|
5
|
+
*/
|
|
6
|
+
export function isGeminiClient(client) {
|
|
7
|
+
if (!client || typeof client !== 'object')
|
|
8
|
+
return false;
|
|
9
|
+
const obj = client;
|
|
10
|
+
return !!(obj.models && typeof obj.models.generateContent === 'function');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/providers/gemini/detect.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,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,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,UAAU,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAID,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LLMRegistry } from '../../llm/registry.js';
|
|
2
|
+
import { isGeminiClient } from './detect.js';
|
|
3
|
+
import { patchGeminiClient } from './proxy.js';
|
|
4
|
+
export function register() {
|
|
5
|
+
LLMRegistry.registerProvider(isGeminiClient, patchGeminiClient);
|
|
6
|
+
}
|
|
7
|
+
register();
|
|
8
|
+
export { isGeminiClient };
|
|
9
|
+
export * from './types.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/gemini/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,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/gemini/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AA6C/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CA2CnE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { patchMethod } from '../patcher.js';
|
|
2
|
+
import { geminiInputToMessages, messagesToGeminiInput, contentFromGemini, usageFromGemini, applyContentToGeminiResponse, } from './common.js';
|
|
3
|
+
import { extractSDKVersion } from '../telemetry.js';
|
|
4
|
+
import { PROVIDERS } from '../../utils/constants.js';
|
|
5
|
+
function argsToRequest(args) {
|
|
6
|
+
const { model: _model, contents: _contents, ...params } = args;
|
|
7
|
+
return {
|
|
8
|
+
messages: geminiInputToMessages(args.contents),
|
|
9
|
+
model: args.model,
|
|
10
|
+
params,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function requestToArgs(request) {
|
|
14
|
+
if (!request.model)
|
|
15
|
+
throw new Error('No model provided.');
|
|
16
|
+
return {
|
|
17
|
+
model: request.model,
|
|
18
|
+
contents: messagesToGeminiInput(request),
|
|
19
|
+
...(request.params ?? {}),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function rawToCanonical(raw) {
|
|
23
|
+
return { content: contentFromGemini(raw), usage: usageFromGemini(raw), raw };
|
|
24
|
+
}
|
|
25
|
+
function chunkToText(chunk) {
|
|
26
|
+
const r = chunk;
|
|
27
|
+
if (typeof r.text === 'string')
|
|
28
|
+
return r.text;
|
|
29
|
+
return r.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
30
|
+
}
|
|
31
|
+
export function patchGeminiClient(client, axon) {
|
|
32
|
+
const geminiClient = client;
|
|
33
|
+
const sdkVersion = extractSDKVersion(geminiClient);
|
|
34
|
+
if (!geminiClient.models) {
|
|
35
|
+
throw new Error('Gemini client has no models API.');
|
|
36
|
+
}
|
|
37
|
+
// Patch the standard (unary) method
|
|
38
|
+
patchMethod({
|
|
39
|
+
axon,
|
|
40
|
+
parent: geminiClient.models,
|
|
41
|
+
methodName: 'generateContent',
|
|
42
|
+
ctxMetadata: { provider: PROVIDERS.GEMINI.id, method: 'models.generateContent', sdkVersion },
|
|
43
|
+
argsToRequest,
|
|
44
|
+
requestToArgs,
|
|
45
|
+
rawToResponse: rawToCanonical,
|
|
46
|
+
applyCanonicalToRaw: applyContentToGeminiResponse,
|
|
47
|
+
chunkToText,
|
|
48
|
+
});
|
|
49
|
+
// Patch the explicit streaming method
|
|
50
|
+
patchMethod({
|
|
51
|
+
axon,
|
|
52
|
+
parent: geminiClient.models,
|
|
53
|
+
methodName: 'generateContentStream',
|
|
54
|
+
ctxMetadata: {
|
|
55
|
+
provider: PROVIDERS.GEMINI.id,
|
|
56
|
+
method: 'models.generateContentStream',
|
|
57
|
+
sdkVersion,
|
|
58
|
+
},
|
|
59
|
+
argsToRequest: (args) => {
|
|
60
|
+
const baseRequest = argsToRequest(args);
|
|
61
|
+
return {
|
|
62
|
+
...baseRequest,
|
|
63
|
+
params: { ...baseRequest.params, stream: true },
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
requestToArgs,
|
|
67
|
+
rawToResponse: rawToCanonical,
|
|
68
|
+
applyCanonicalToRaw: applyContentToGeminiResponse,
|
|
69
|
+
chunkToText,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/gemini/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface GeminiResponse {
|
|
2
|
+
text?: string;
|
|
3
|
+
candidates?: Array<{
|
|
4
|
+
content?: {
|
|
5
|
+
parts?: Array<{
|
|
6
|
+
text?: string;
|
|
7
|
+
}>;
|
|
8
|
+
};
|
|
9
|
+
}>;
|
|
10
|
+
usageMetadata?: GeminiUsage;
|
|
11
|
+
}
|
|
12
|
+
export interface GeminiUsage {
|
|
13
|
+
promptTokenCount?: number;
|
|
14
|
+
candidatesTokenCount?: number;
|
|
15
|
+
totalTokenCount?: number;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/responses.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,KAAK,CAAC;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IACvE,aAAa,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/providers/gemini/responses.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface GeminiGenerateContentArgs {
|
|
2
|
+
model: string;
|
|
3
|
+
contents: string | Array<{
|
|
4
|
+
role?: string;
|
|
5
|
+
parts: Array<{
|
|
6
|
+
text?: string;
|
|
7
|
+
}>;
|
|
8
|
+
}>;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The minimal expected shape of an initialized Google Gemini client instance.
|
|
13
|
+
* Axon uses this interface to detect and safely patch the `models.generateContent`
|
|
14
|
+
* and `models.generateContentStream` methods.
|
|
15
|
+
*/
|
|
16
|
+
export interface GeminiClient {
|
|
17
|
+
models?: {
|
|
18
|
+
generateContent: (args: GeminiGenerateContentArgs) => Promise<unknown>;
|
|
19
|
+
generateContentStream?: (args: GeminiGenerateContentArgs) => Promise<unknown>;
|
|
20
|
+
__axon_patched__?: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7E,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE;QACP,eAAe,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACvE,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/providers/gemini/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +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"}
|
|
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,mBAAmB,CAAC;AAC3B,OAAO,EAAE,CAAC"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,mBAAmB,CAAC"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if the provided object is an initialized OpenAI client instance.
|
|
3
|
+
* @param client - The object to inspect.
|
|
4
|
+
* @returns True if it matches the OpenAI client shape.
|
|
5
|
+
*/
|
|
1
6
|
export declare function isOpenAIClient(client: unknown): boolean;
|
|
2
7
|
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/detect.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAQvD"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects if the provided object is an initialized OpenAI client instance.
|
|
3
|
+
* @param client - The object to inspect.
|
|
4
|
+
* @returns True if it matches the OpenAI client shape.
|
|
5
|
+
*/
|
|
1
6
|
export function isOpenAIClient(client) {
|
|
2
7
|
if (!client || typeof client !== 'object')
|
|
3
8
|
return false;
|
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/providers/openai/detect.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,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"}
|
|
@@ -1 +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;
|
|
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;AA8E/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAiDnE"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { openaiInputToMessages, messagesToOpenAIInput, contentFromOpenAI, usageFromOpenAI, applyContentToTextResponse, applyContentToChatResponse, } from './common.js';
|
|
2
2
|
import { isOpenAIClient } from './detect.js';
|
|
3
3
|
import { patchMethod } from '../patcher.js';
|
|
4
|
+
import { extractSDKVersion } from '../telemetry.js';
|
|
5
|
+
import { PROVIDERS } from '../../utils/constants.js';
|
|
4
6
|
function extractParams(args, inputKey) {
|
|
5
7
|
const { model: _model, [inputKey]: _input, ...params } = args;
|
|
6
8
|
return params;
|
|
@@ -52,6 +54,7 @@ function chunkToText(chunk) {
|
|
|
52
54
|
}
|
|
53
55
|
export function patchOpenAIClient(client, axon) {
|
|
54
56
|
const openaiClient = client;
|
|
57
|
+
const sdkVersion = extractSDKVersion(openaiClient);
|
|
55
58
|
let patchedAny = false;
|
|
56
59
|
// Patch Legacy Responses API
|
|
57
60
|
if (openaiClient.responses) {
|
|
@@ -59,7 +62,7 @@ export function patchOpenAIClient(client, axon) {
|
|
|
59
62
|
axon,
|
|
60
63
|
parent: openaiClient.responses,
|
|
61
64
|
methodName: 'create',
|
|
62
|
-
ctxMetadata: { provider:
|
|
65
|
+
ctxMetadata: { provider: PROVIDERS.OPENAI.id, method: 'responses.create', sdkVersion },
|
|
63
66
|
argsToRequest: responsesArgsToRequest,
|
|
64
67
|
requestToArgs: requestToResponsesArgs,
|
|
65
68
|
rawToResponse: rawToCanonical,
|
|
@@ -74,7 +77,11 @@ export function patchOpenAIClient(client, axon) {
|
|
|
74
77
|
axon,
|
|
75
78
|
parent: openaiClient.chat.completions,
|
|
76
79
|
methodName: 'create',
|
|
77
|
-
ctxMetadata: {
|
|
80
|
+
ctxMetadata: {
|
|
81
|
+
provider: PROVIDERS.OPENAI.id,
|
|
82
|
+
method: 'chat.completions.create',
|
|
83
|
+
sdkVersion,
|
|
84
|
+
},
|
|
78
85
|
argsToRequest: chatArgsToRequest,
|
|
79
86
|
requestToArgs: requestToChatArgs,
|
|
80
87
|
rawToResponse: rawToCanonical,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/openai/proxy.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/providers/openai/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
export interface
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
total_tokens?: number;
|
|
5
|
-
input_tokens?: number;
|
|
6
|
-
output_tokens?: number;
|
|
1
|
+
export interface OpenAITextResponse {
|
|
2
|
+
output_text: string;
|
|
3
|
+
usage?: OpenAIUsage;
|
|
7
4
|
}
|
|
8
5
|
export interface OpenAIChatCompletionResponse {
|
|
9
6
|
choices: Array<{
|
|
@@ -16,9 +13,12 @@ export interface OpenAIChatCompletionResponse {
|
|
|
16
13
|
}>;
|
|
17
14
|
usage?: OpenAIUsage;
|
|
18
15
|
}
|
|
19
|
-
export interface
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
export interface OpenAIUsage {
|
|
17
|
+
prompt_tokens?: number;
|
|
18
|
+
completion_tokens?: number;
|
|
19
|
+
total_tokens?: number;
|
|
20
|
+
input_tokens?: number;
|
|
21
|
+
output_tokens?: number;
|
|
22
22
|
}
|
|
23
23
|
export declare function hasUsage(response: unknown): response is {
|
|
24
24
|
usage: OpenAIUsage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/responses.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/responses.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,KAAK,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAE9E"}
|
|
@@ -15,6 +15,11 @@ export interface OpenAIChatCompletionsCreateArgs {
|
|
|
15
15
|
stream?: boolean;
|
|
16
16
|
[key: string]: unknown;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* The minimal expected shape of an initialized OpenAI client instance.
|
|
20
|
+
* Axon uses this interface to detect and safely patch the `chat.completions.create`
|
|
21
|
+
* and legacy `responses.create` methods.
|
|
22
|
+
*/
|
|
18
23
|
export interface OpenAIClient {
|
|
19
24
|
responses?: {
|
|
20
25
|
create: (args: OpenAIResponsesCreateArgs) => Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,WAAW,CAAC,EAAE;YACZ,MAAM,EAAE,CAAC,IAAI,EAAE,+BAA+B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;YACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;SAC5B,CAAC;KACH,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,CAAC,IAAI,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,WAAW,CAAC,EAAE;YACZ,MAAM,EAAE,CAAC,IAAI,EAAE,+BAA+B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;YACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;SAC5B,CAAC;KACH,CAAC;CACH"}
|