@memorilabs/axon 0.1.3-beta → 0.1.3
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 +39 -9
- package/dist/core/axon.d.ts.map +1 -1
- package/dist/core/axon.js +22 -12
- package/dist/core/axon.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/pipeline.d.ts +27 -0
- package/dist/hooks/pipeline.d.ts.map +1 -0
- package/dist/hooks/{registry.js → pipeline.js} +11 -9
- package/dist/hooks/pipeline.js.map +1 -0
- 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 +17 -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 +48 -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 +103 -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 +31 -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 +7 -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.map +1 -1
- package/dist/providers/telemetry.js +3 -0
- package/dist/providers/telemetry.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- 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 +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +13 -5
- package/dist/hooks/registry.d.ts +0 -28
- package/dist/hooks/registry.d.ts.map +0 -1
- package/dist/hooks/registry.js.map +0 -1
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { anthropicInputToMessages, messagesToAnthropicInput, contentFromAnthropic, usageFromAnthropic, applyContentToResponse, } from './common.js';
|
|
2
2
|
import { patchMethod } from '../patcher.js';
|
|
3
3
|
import { extractSDKVersion } from '../telemetry.js';
|
|
4
|
+
import { PROVIDERS } from '../../utils/constants.js';
|
|
4
5
|
function extractParams(args) {
|
|
5
6
|
// Separate model and messages from extra provider-specific parameters
|
|
6
|
-
const { model: _model, messages: _messages, ...params } = args;
|
|
7
|
+
const { model: _model, messages: _messages, system: _system, ...params } = args;
|
|
7
8
|
return params;
|
|
8
9
|
}
|
|
9
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
|
+
}
|
|
10
16
|
return {
|
|
11
|
-
messages
|
|
17
|
+
messages,
|
|
12
18
|
model: args.model,
|
|
13
19
|
params: extractParams(args),
|
|
14
20
|
};
|
|
@@ -16,11 +22,18 @@ function argsToRequest(args) {
|
|
|
16
22
|
function requestToArgs(request) {
|
|
17
23
|
if (!request.model)
|
|
18
24
|
throw new Error('No model provided.');
|
|
19
|
-
|
|
25
|
+
// Extract system message if present
|
|
26
|
+
const systemMessage = request.messages.find((m) => m.role === 'system');
|
|
27
|
+
const args = {
|
|
20
28
|
model: request.model,
|
|
21
29
|
messages: messagesToAnthropicInput(request),
|
|
22
30
|
...(request.params ?? {}),
|
|
23
31
|
};
|
|
32
|
+
// Add system parameter at top level if system message exists
|
|
33
|
+
if (systemMessage) {
|
|
34
|
+
args.system = systemMessage.content;
|
|
35
|
+
}
|
|
36
|
+
return args;
|
|
24
37
|
}
|
|
25
38
|
function rawToCanonical(raw) {
|
|
26
39
|
return { content: contentFromAnthropic(raw), usage: usageFromAnthropic(raw), raw };
|
|
@@ -48,7 +61,7 @@ export function patchAnthropicClient(client, axon) {
|
|
|
48
61
|
axon,
|
|
49
62
|
parent: antClient.messages,
|
|
50
63
|
methodName: 'create',
|
|
51
|
-
ctxMetadata: { provider:
|
|
64
|
+
ctxMetadata: { provider: PROVIDERS.ANTHROPIC.id, method: 'messages.create', sdkVersion },
|
|
52
65
|
argsToRequest,
|
|
53
66
|
requestToArgs,
|
|
54
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,CAOhG;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,48 @@
|
|
|
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
|
|
14
|
+
.filter((m) => m.role !== 'system')
|
|
15
|
+
.map((m) => ({
|
|
16
|
+
role: m.role === 'assistant' ? 'model' : m.role,
|
|
17
|
+
parts: [{ text: m.content }],
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
export function contentFromGemini(response) {
|
|
21
|
+
const r = response;
|
|
22
|
+
if (r.text)
|
|
23
|
+
return r.text;
|
|
24
|
+
if (r.candidates?.[0]?.content?.parts?.[0]?.text) {
|
|
25
|
+
return r.candidates[0].content.parts[0].text;
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
export function usageFromGemini(response) {
|
|
30
|
+
const r = response;
|
|
31
|
+
if (!r.usageMetadata)
|
|
32
|
+
return undefined;
|
|
33
|
+
return {
|
|
34
|
+
promptTokens: r.usageMetadata.promptTokenCount,
|
|
35
|
+
completionTokens: r.usageMetadata.candidatesTokenCount,
|
|
36
|
+
totalTokens: r.usageMetadata.totalTokenCount,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function applyContentToGeminiResponse(raw, canonical) {
|
|
40
|
+
const r = raw;
|
|
41
|
+
if (r.candidates?.[0]?.content?.parts?.[0]) {
|
|
42
|
+
r.candidates[0].content.parts[0].text = canonical.content;
|
|
43
|
+
}
|
|
44
|
+
else if (r.text !== undefined) {
|
|
45
|
+
r.text = canonical.content;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# 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;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,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;AACR,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;AA4F/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAsCnE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 extractSystemInstruction(config) {
|
|
6
|
+
if (!config?.systemInstruction)
|
|
7
|
+
return '';
|
|
8
|
+
const instruction = config.systemInstruction;
|
|
9
|
+
if (typeof instruction === 'string') {
|
|
10
|
+
return instruction;
|
|
11
|
+
}
|
|
12
|
+
if (typeof instruction === 'object') {
|
|
13
|
+
const parts = instruction.parts;
|
|
14
|
+
if (Array.isArray(parts)) {
|
|
15
|
+
return parts
|
|
16
|
+
.map((p) => p.text)
|
|
17
|
+
.filter((text) => typeof text === 'string')
|
|
18
|
+
.join('');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
function argsToRequest(args) {
|
|
24
|
+
const { model, contents, ...params } = args;
|
|
25
|
+
const messages = geminiInputToMessages(contents);
|
|
26
|
+
const systemContent = extractSystemInstruction(params.config);
|
|
27
|
+
if (systemContent) {
|
|
28
|
+
messages.unshift({ role: 'system', content: systemContent });
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
messages,
|
|
32
|
+
model,
|
|
33
|
+
params,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function requestToArgs(request) {
|
|
37
|
+
if (!request.model)
|
|
38
|
+
throw new Error('No model provided.');
|
|
39
|
+
const systemMessages = request.messages.filter((m) => m.role === 'system');
|
|
40
|
+
const otherMessages = request.messages.filter((m) => m.role !== 'system');
|
|
41
|
+
const args = {
|
|
42
|
+
model: request.model,
|
|
43
|
+
contents: messagesToGeminiInput({ ...request, messages: otherMessages }),
|
|
44
|
+
...(request.params ?? {}),
|
|
45
|
+
};
|
|
46
|
+
if (systemMessages.length > 0) {
|
|
47
|
+
args.config = {
|
|
48
|
+
...(args.config ?? {}),
|
|
49
|
+
systemInstruction: systemMessages.map((m) => m.content).join('\n\n'),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return args;
|
|
53
|
+
}
|
|
54
|
+
function rawToCanonical(raw) {
|
|
55
|
+
return { content: contentFromGemini(raw), usage: usageFromGemini(raw), raw };
|
|
56
|
+
}
|
|
57
|
+
function isGeminiResponse(raw) {
|
|
58
|
+
return typeof raw === 'object' && raw !== null;
|
|
59
|
+
}
|
|
60
|
+
function chunkToText(chunk) {
|
|
61
|
+
if (!isGeminiResponse(chunk))
|
|
62
|
+
return undefined;
|
|
63
|
+
if (typeof chunk.text === 'string')
|
|
64
|
+
return chunk.text;
|
|
65
|
+
const firstCandidate = chunk.candidates?.[0];
|
|
66
|
+
const firstPart = firstCandidate?.content?.parts?.[0];
|
|
67
|
+
return firstPart?.text;
|
|
68
|
+
}
|
|
69
|
+
export function patchGeminiClient(client, axon) {
|
|
70
|
+
const geminiClient = client;
|
|
71
|
+
const sdkVersion = extractSDKVersion(geminiClient);
|
|
72
|
+
if (!geminiClient.models) {
|
|
73
|
+
throw new Error('Gemini client has no models API.');
|
|
74
|
+
}
|
|
75
|
+
const sharedCtxMetadata = { provider: PROVIDERS.GEMINI.id, sdkVersion };
|
|
76
|
+
const baseConfig = {
|
|
77
|
+
axon,
|
|
78
|
+
parent: geminiClient.models,
|
|
79
|
+
requestToArgs,
|
|
80
|
+
rawToResponse: rawToCanonical,
|
|
81
|
+
applyCanonicalToRaw: applyContentToGeminiResponse,
|
|
82
|
+
chunkToText,
|
|
83
|
+
};
|
|
84
|
+
patchMethod({
|
|
85
|
+
...baseConfig,
|
|
86
|
+
methodName: 'generateContent',
|
|
87
|
+
ctxMetadata: { ...sharedCtxMetadata, method: 'models.generateContent' },
|
|
88
|
+
argsToRequest,
|
|
89
|
+
});
|
|
90
|
+
patchMethod({
|
|
91
|
+
...baseConfig,
|
|
92
|
+
methodName: 'generateContentStream',
|
|
93
|
+
ctxMetadata: { ...sharedCtxMetadata, method: 'models.generateContentStream' },
|
|
94
|
+
argsToRequest: (args) => {
|
|
95
|
+
const req = argsToRequest(args);
|
|
96
|
+
return {
|
|
97
|
+
...req,
|
|
98
|
+
params: { ...req.params, stream: true },
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# 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,31 @@
|
|
|
1
|
+
export interface GeminiGenerateContentArgs {
|
|
2
|
+
model: string;
|
|
3
|
+
contents: string | Array<{
|
|
4
|
+
role?: string;
|
|
5
|
+
parts: Array<{
|
|
6
|
+
text?: string;
|
|
7
|
+
}>;
|
|
8
|
+
}>;
|
|
9
|
+
config?: {
|
|
10
|
+
systemInstruction?: string | {
|
|
11
|
+
parts?: Array<{
|
|
12
|
+
text?: string;
|
|
13
|
+
}>;
|
|
14
|
+
};
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
};
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The minimal expected shape of an initialized Google Gemini client instance.
|
|
21
|
+
* Axon uses this interface to detect and safely patch the `models.generateContent`
|
|
22
|
+
* and `models.generateContentStream` methods.
|
|
23
|
+
*/
|
|
24
|
+
export interface GeminiClient {
|
|
25
|
+
models?: {
|
|
26
|
+
generateContent: (args: GeminiGenerateContentArgs) => Promise<unknown>;
|
|
27
|
+
generateContentStream?: (args: GeminiGenerateContentArgs) => Promise<unknown>;
|
|
28
|
+
__axon_patched__?: boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# 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,MAAM,CAAC,EAAE;QACP,iBAAiB,CAAC,EAAE,MAAM,GAAG;YAAE,KAAK,CAAC,EAAE,KAAK,CAAC;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC;QAClE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,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"}
|
|
@@ -2,6 +2,7 @@ import { openaiInputToMessages, messagesToOpenAIInput, contentFromOpenAI, usageF
|
|
|
2
2
|
import { isOpenAIClient } from './detect.js';
|
|
3
3
|
import { patchMethod } from '../patcher.js';
|
|
4
4
|
import { extractSDKVersion } from '../telemetry.js';
|
|
5
|
+
import { PROVIDERS } from '../../utils/constants.js';
|
|
5
6
|
function extractParams(args, inputKey) {
|
|
6
7
|
const { model: _model, [inputKey]: _input, ...params } = args;
|
|
7
8
|
return params;
|
|
@@ -61,7 +62,7 @@ export function patchOpenAIClient(client, axon) {
|
|
|
61
62
|
axon,
|
|
62
63
|
parent: openaiClient.responses,
|
|
63
64
|
methodName: 'create',
|
|
64
|
-
ctxMetadata: { provider:
|
|
65
|
+
ctxMetadata: { provider: PROVIDERS.OPENAI.id, method: 'responses.create', sdkVersion },
|
|
65
66
|
argsToRequest: responsesArgsToRequest,
|
|
66
67
|
requestToArgs: requestToResponsesArgs,
|
|
67
68
|
rawToResponse: rawToCanonical,
|
|
@@ -76,7 +77,11 @@ export function patchOpenAIClient(client, axon) {
|
|
|
76
77
|
axon,
|
|
77
78
|
parent: openaiClient.chat.completions,
|
|
78
79
|
methodName: 'create',
|
|
79
|
-
ctxMetadata: {
|
|
80
|
+
ctxMetadata: {
|
|
81
|
+
provider: PROVIDERS.OPENAI.id,
|
|
82
|
+
method: 'chat.completions.create',
|
|
83
|
+
sdkVersion,
|
|
84
|
+
},
|
|
80
85
|
argsToRequest: chatArgsToRequest,
|
|
81
86
|
requestToArgs: requestToChatArgs,
|
|
82
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;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,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"}
|