stepproof 0.4.0 → 0.5.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/dist/adapters/anthropic.d.ts +7 -3
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +24 -8
- package/dist/adapters/anthropic.js.map +1 -1
- package/dist/adapters/azure-openai.d.ts +13 -0
- package/dist/adapters/azure-openai.d.ts.map +1 -0
- package/dist/adapters/azure-openai.js +90 -0
- package/dist/adapters/azure-openai.js.map +1 -0
- package/dist/adapters/base.d.ts +16 -2
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/bedrock.d.ts +11 -0
- package/dist/adapters/bedrock.d.ts.map +1 -0
- package/dist/adapters/bedrock.js +145 -0
- package/dist/adapters/bedrock.js.map +1 -0
- package/dist/adapters/gemini.d.ts +3 -3
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +11 -8
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +36 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/ollama.d.ts +3 -3
- package/dist/adapters/ollama.d.ts.map +1 -1
- package/dist/adapters/ollama.js +11 -5
- package/dist/adapters/ollama.js.map +1 -1
- package/dist/adapters/openai.d.ts +7 -3
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +31 -5
- package/dist/adapters/openai.js.map +1 -1
- package/dist/assertions/engine.d.ts +12 -1
- package/dist/assertions/engine.d.ts.map +1 -1
- package/dist/assertions/engine.js +343 -1
- package/dist/assertions/engine.js.map +1 -1
- package/dist/cli.js +92 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate.d.ts +12 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +112 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/core/scenario-parser.d.ts +1 -1
- package/dist/core/scenario-parser.d.ts.map +1 -1
- package/dist/core/scenario-parser.js +145 -5
- package/dist/core/scenario-parser.js.map +1 -1
- package/dist/core/scenario-runner.d.ts.map +1 -1
- package/dist/core/scenario-runner.js +102 -41
- package/dist/core/scenario-runner.js.map +1 -1
- package/dist/core/types.d.ts +38 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/reporters/terminal-reporter.d.ts.map +1 -1
- package/dist/reporters/terminal-reporter.js +11 -4
- package/dist/reporters/terminal-reporter.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import type { AdapterResponse, ChatMessage, ProviderAdapter } from './base.js';
|
|
1
|
+
import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
|
|
2
2
|
export declare class AnthropicAdapter implements ProviderAdapter {
|
|
3
3
|
private client;
|
|
4
4
|
private model;
|
|
5
5
|
constructor(model: string);
|
|
6
|
-
call(prompt: string, system?: string): Promise<AdapterResponse>;
|
|
7
|
-
chat(messages: ChatMessage[], system?: string): Promise<AdapterResponse>;
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
8
|
+
stream(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
|
|
9
|
+
token: string;
|
|
10
|
+
timestampMs: number;
|
|
11
|
+
}>;
|
|
8
12
|
}
|
|
9
13
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,gBAAiB,YAAW,eAAe;IACtD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAQnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAoC9F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAoB9H"}
|
|
@@ -10,7 +10,6 @@ async function withRetry(fn) {
|
|
|
10
10
|
catch (err) {
|
|
11
11
|
lastError = err;
|
|
12
12
|
const status = err.status;
|
|
13
|
-
// Only retry on rate limit (429) or server error (5xx)
|
|
14
13
|
if (status !== 429 && !(status && status >= 500))
|
|
15
14
|
throw err;
|
|
16
15
|
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
@@ -29,16 +28,13 @@ export class AnthropicAdapter {
|
|
|
29
28
|
}
|
|
30
29
|
this.client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
31
30
|
}
|
|
32
|
-
async call(prompt, system) {
|
|
33
|
-
return this.chat([{ role: 'user', content: prompt }], system);
|
|
31
|
+
async call(prompt, system, options) {
|
|
32
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
34
33
|
}
|
|
35
|
-
async chat(messages, system) {
|
|
36
|
-
// Anthropic API requires alternating user/assistant messages.
|
|
37
|
-
// System messages are passed via the top-level system param.
|
|
34
|
+
async chat(messages, system, options) {
|
|
38
35
|
const apiMessages = [];
|
|
39
36
|
for (const msg of messages) {
|
|
40
37
|
if (msg.role === 'system') {
|
|
41
|
-
// Fold into system param — Anthropic doesn't support system in messages array
|
|
42
38
|
system = system ? `${system}\n\n${msg.content}` : msg.content;
|
|
43
39
|
}
|
|
44
40
|
else {
|
|
@@ -48,8 +44,10 @@ export class AnthropicAdapter {
|
|
|
48
44
|
const startMs = Date.now();
|
|
49
45
|
const response = await withRetry(() => this.client.messages.create({
|
|
50
46
|
model: this.model,
|
|
51
|
-
max_tokens: 1024,
|
|
47
|
+
max_tokens: options?.maxTokens ?? 1024,
|
|
52
48
|
...(system && { system }),
|
|
49
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
50
|
+
...(options?.topP !== undefined && { top_p: options.topP }),
|
|
53
51
|
messages: apiMessages,
|
|
54
52
|
}));
|
|
55
53
|
const durationMs = Date.now() - startMs;
|
|
@@ -64,5 +62,23 @@ export class AnthropicAdapter {
|
|
|
64
62
|
durationMs,
|
|
65
63
|
};
|
|
66
64
|
}
|
|
65
|
+
async *stream(prompt, system, options) {
|
|
66
|
+
const apiMessages = [
|
|
67
|
+
{ role: 'user', content: prompt },
|
|
68
|
+
];
|
|
69
|
+
const stream = this.client.messages.stream({
|
|
70
|
+
model: this.model,
|
|
71
|
+
max_tokens: options?.maxTokens ?? 1024,
|
|
72
|
+
...(system && { system }),
|
|
73
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
74
|
+
...(options?.topP !== undefined && { top_p: options.topP }),
|
|
75
|
+
messages: apiMessages,
|
|
76
|
+
});
|
|
77
|
+
for await (const event of stream) {
|
|
78
|
+
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
|
|
79
|
+
yield { token: event.delta.text, timestampMs: Date.now() };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
67
83
|
}
|
|
68
84
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,KAAK,UAAU,SAAS,CAAI,EAAoB;IAC9C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;YACnD,
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
|
|
2
|
+
export declare class AzureOpenAIAdapter implements ProviderAdapter {
|
|
3
|
+
private client;
|
|
4
|
+
private deployment;
|
|
5
|
+
constructor(deployment: string);
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
8
|
+
stream(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
|
|
9
|
+
token: string;
|
|
10
|
+
timestampMs: number;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=azure-openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.d.ts","sourceRoot":"","sources":["../../src/adapters/azure-openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAsBxB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IA8B9F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAuB9H"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { AzureOpenAI } from 'openai';
|
|
2
|
+
const MAX_RETRIES = 3;
|
|
3
|
+
const BASE_DELAY_MS = 1000;
|
|
4
|
+
async function withRetry(fn) {
|
|
5
|
+
let lastError;
|
|
6
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
7
|
+
try {
|
|
8
|
+
return await fn();
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
lastError = err;
|
|
12
|
+
const status = err.status;
|
|
13
|
+
if (status !== 429 && !(status && status >= 500))
|
|
14
|
+
throw err;
|
|
15
|
+
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
16
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw lastError;
|
|
20
|
+
}
|
|
21
|
+
export class AzureOpenAIAdapter {
|
|
22
|
+
client;
|
|
23
|
+
deployment;
|
|
24
|
+
constructor(deployment) {
|
|
25
|
+
this.deployment = deployment;
|
|
26
|
+
const apiKey = process.env.AZURE_OPENAI_API_KEY;
|
|
27
|
+
const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
|
|
28
|
+
if (!apiKey) {
|
|
29
|
+
throw new Error('AZURE_OPENAI_API_KEY environment variable is required for azure-openai provider');
|
|
30
|
+
}
|
|
31
|
+
if (!endpoint) {
|
|
32
|
+
throw new Error('AZURE_OPENAI_ENDPOINT environment variable is required for azure-openai provider');
|
|
33
|
+
}
|
|
34
|
+
const apiVersion = process.env.AZURE_OPENAI_API_VERSION ?? '2024-10-21';
|
|
35
|
+
this.client = new AzureOpenAI({
|
|
36
|
+
apiKey,
|
|
37
|
+
endpoint,
|
|
38
|
+
apiVersion,
|
|
39
|
+
deployment,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async call(prompt, system, options) {
|
|
43
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
44
|
+
}
|
|
45
|
+
async chat(messages, system, options) {
|
|
46
|
+
const apiMessages = [];
|
|
47
|
+
if (system) {
|
|
48
|
+
apiMessages.push({ role: 'system', content: system });
|
|
49
|
+
}
|
|
50
|
+
for (const msg of messages) {
|
|
51
|
+
apiMessages.push({ role: msg.role, content: msg.content });
|
|
52
|
+
}
|
|
53
|
+
const startMs = Date.now();
|
|
54
|
+
const response = await withRetry(() => this.client.chat.completions.create({
|
|
55
|
+
model: this.deployment,
|
|
56
|
+
messages: apiMessages,
|
|
57
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
58
|
+
...(options?.topP !== undefined && { top_p: options.topP }),
|
|
59
|
+
...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),
|
|
60
|
+
}));
|
|
61
|
+
const durationMs = Date.now() - startMs;
|
|
62
|
+
const text = response.choices[0]?.message?.content ?? '';
|
|
63
|
+
const usage = response.usage
|
|
64
|
+
? { inputTokens: response.usage.prompt_tokens, outputTokens: response.usage.completion_tokens }
|
|
65
|
+
: undefined;
|
|
66
|
+
return { text, usage, durationMs };
|
|
67
|
+
}
|
|
68
|
+
async *stream(prompt, system, options) {
|
|
69
|
+
const apiMessages = [];
|
|
70
|
+
if (system) {
|
|
71
|
+
apiMessages.push({ role: 'system', content: system });
|
|
72
|
+
}
|
|
73
|
+
apiMessages.push({ role: 'user', content: prompt });
|
|
74
|
+
const stream = await this.client.chat.completions.create({
|
|
75
|
+
model: this.deployment,
|
|
76
|
+
messages: apiMessages,
|
|
77
|
+
stream: true,
|
|
78
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
79
|
+
...(options?.topP !== undefined && { top_p: options.topP }),
|
|
80
|
+
...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),
|
|
81
|
+
});
|
|
82
|
+
for await (const chunk of stream) {
|
|
83
|
+
const delta = chunk.choices[0]?.delta?.content;
|
|
84
|
+
if (delta) {
|
|
85
|
+
yield { token: delta, timestampMs: Date.now() };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=azure-openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../src/adapters/azure-openai.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/base.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export interface CallOptions {
|
|
2
|
+
temperature?: number;
|
|
3
|
+
topP?: number;
|
|
4
|
+
maxTokens?: number;
|
|
5
|
+
}
|
|
1
6
|
export interface AdapterResponse {
|
|
2
7
|
text: string;
|
|
3
8
|
usage?: {
|
|
@@ -5,13 +10,22 @@ export interface AdapterResponse {
|
|
|
5
10
|
outputTokens: number;
|
|
6
11
|
};
|
|
7
12
|
durationMs: number;
|
|
13
|
+
streamMetrics?: {
|
|
14
|
+
ttftMs: number;
|
|
15
|
+
tokensPerSecond: number;
|
|
16
|
+
interTokenLatencyMs: number;
|
|
17
|
+
};
|
|
8
18
|
}
|
|
9
19
|
export interface ChatMessage {
|
|
10
20
|
role: 'user' | 'assistant' | 'system';
|
|
11
21
|
content: string;
|
|
12
22
|
}
|
|
13
23
|
export interface ProviderAdapter {
|
|
14
|
-
call(prompt: string, system?: string): Promise<AdapterResponse>;
|
|
15
|
-
chat(messages: ChatMessage[], system?: string): Promise<AdapterResponse>;
|
|
24
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
25
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
26
|
+
stream?(prompt: string, system?: string, options?: CallOptions): AsyncGenerator<{
|
|
27
|
+
token: string;
|
|
28
|
+
timestampMs: number;
|
|
29
|
+
}>;
|
|
16
30
|
}
|
|
17
31
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAChG,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzH"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
|
|
2
|
+
export declare class BedrockAdapter implements ProviderAdapter {
|
|
3
|
+
private model;
|
|
4
|
+
private region;
|
|
5
|
+
private accessKeyId;
|
|
6
|
+
private secretAccessKey;
|
|
7
|
+
constructor(model: string);
|
|
8
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
9
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=bedrock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA2G5F,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAEpB,KAAK,EAAE,MAAM;IAenB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CA+DtG"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
const MAX_RETRIES = 3;
|
|
3
|
+
const BASE_DELAY_MS = 1000;
|
|
4
|
+
async function withRetry(fn) {
|
|
5
|
+
let lastError;
|
|
6
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
7
|
+
try {
|
|
8
|
+
return await fn();
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
lastError = err;
|
|
12
|
+
const status = err.status;
|
|
13
|
+
if (status !== 429 && !(status && status >= 500))
|
|
14
|
+
throw err;
|
|
15
|
+
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
16
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw lastError;
|
|
20
|
+
}
|
|
21
|
+
// ── Minimal AWS Signature V4 signer ─────────────────────────────────
|
|
22
|
+
// O(n) in payload size — single pass HMAC chain + SHA-256 hash
|
|
23
|
+
function hmacSha256(key, data) {
|
|
24
|
+
return crypto.createHmac('sha256', key).update(data, 'utf8').digest();
|
|
25
|
+
}
|
|
26
|
+
function sha256Hex(data) {
|
|
27
|
+
return crypto.createHash('sha256').update(data, 'utf8').digest('hex');
|
|
28
|
+
}
|
|
29
|
+
function signRequest(method, url, headers, body, region, service, accessKeyId, secretAccessKey) {
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const dateStamp = now.toISOString().replace(/[-:T]/g, '').slice(0, 8);
|
|
32
|
+
const amzDate = dateStamp + 'T' + now.toISOString().replace(/[-:T]/g, '').slice(8, 14) + 'Z';
|
|
33
|
+
const payloadHash = sha256Hex(body);
|
|
34
|
+
// Canonical headers — must be sorted by name
|
|
35
|
+
const canonicalHeaders = {
|
|
36
|
+
'content-type': headers['Content-Type'] ?? 'application/json',
|
|
37
|
+
host: url.host,
|
|
38
|
+
'x-amz-content-sha256': payloadHash,
|
|
39
|
+
'x-amz-date': amzDate,
|
|
40
|
+
};
|
|
41
|
+
const sortedHeaderNames = Object.keys(canonicalHeaders).sort();
|
|
42
|
+
const canonicalHeaderStr = sortedHeaderNames.map(k => `${k}:${canonicalHeaders[k]}\n`).join('');
|
|
43
|
+
const signedHeadersStr = sortedHeaderNames.join(';');
|
|
44
|
+
const canonicalPath = url.pathname;
|
|
45
|
+
const canonicalQueryString = url.search ? url.search.slice(1) : '';
|
|
46
|
+
const canonicalRequest = [
|
|
47
|
+
method,
|
|
48
|
+
canonicalPath,
|
|
49
|
+
canonicalQueryString,
|
|
50
|
+
canonicalHeaderStr,
|
|
51
|
+
signedHeadersStr,
|
|
52
|
+
payloadHash,
|
|
53
|
+
].join('\n');
|
|
54
|
+
const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`;
|
|
55
|
+
const stringToSign = [
|
|
56
|
+
'AWS4-HMAC-SHA256',
|
|
57
|
+
amzDate,
|
|
58
|
+
credentialScope,
|
|
59
|
+
sha256Hex(canonicalRequest),
|
|
60
|
+
].join('\n');
|
|
61
|
+
// Derive signing key: HMAC chain
|
|
62
|
+
const kDate = hmacSha256(`AWS4${secretAccessKey}`, dateStamp);
|
|
63
|
+
const kRegion = hmacSha256(kDate, region);
|
|
64
|
+
const kService = hmacSha256(kRegion, service);
|
|
65
|
+
const kSigning = hmacSha256(kService, 'aws4_request');
|
|
66
|
+
const signature = hmacSha256(kSigning, stringToSign).toString('hex');
|
|
67
|
+
return {
|
|
68
|
+
Authorization: `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, SignedHeaders=${signedHeadersStr}, Signature=${signature}`,
|
|
69
|
+
'x-amz-date': amzDate,
|
|
70
|
+
'x-amz-content-sha256': payloadHash,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export class BedrockAdapter {
|
|
74
|
+
model;
|
|
75
|
+
region;
|
|
76
|
+
accessKeyId;
|
|
77
|
+
secretAccessKey;
|
|
78
|
+
constructor(model) {
|
|
79
|
+
this.model = model;
|
|
80
|
+
this.region = process.env.AWS_REGION ?? 'us-east-1';
|
|
81
|
+
if (!process.env.AWS_ACCESS_KEY_ID) {
|
|
82
|
+
throw new Error('AWS_ACCESS_KEY_ID environment variable is required for bedrock provider');
|
|
83
|
+
}
|
|
84
|
+
if (!process.env.AWS_SECRET_ACCESS_KEY) {
|
|
85
|
+
throw new Error('AWS_SECRET_ACCESS_KEY environment variable is required for bedrock provider');
|
|
86
|
+
}
|
|
87
|
+
this.accessKeyId = process.env.AWS_ACCESS_KEY_ID;
|
|
88
|
+
this.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
|
|
89
|
+
}
|
|
90
|
+
async call(prompt, system, options) {
|
|
91
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
92
|
+
}
|
|
93
|
+
async chat(messages, system, options) {
|
|
94
|
+
// Build Anthropic Messages API format (Bedrock uses the same schema for Claude models)
|
|
95
|
+
const apiMessages = [];
|
|
96
|
+
let effectiveSystem = system;
|
|
97
|
+
for (const msg of messages) {
|
|
98
|
+
if (msg.role === 'system') {
|
|
99
|
+
effectiveSystem = effectiveSystem ? `${effectiveSystem}\n\n${msg.content}` : msg.content;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
apiMessages.push({ role: msg.role, content: msg.content });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const body = {
|
|
106
|
+
anthropic_version: 'bedrock-2023-05-31',
|
|
107
|
+
max_tokens: options?.maxTokens ?? 1024,
|
|
108
|
+
messages: apiMessages,
|
|
109
|
+
};
|
|
110
|
+
if (effectiveSystem)
|
|
111
|
+
body.system = effectiveSystem;
|
|
112
|
+
if (options?.temperature !== undefined)
|
|
113
|
+
body.temperature = options.temperature;
|
|
114
|
+
if (options?.topP !== undefined)
|
|
115
|
+
body.top_p = options.topP;
|
|
116
|
+
const bodyStr = JSON.stringify(body);
|
|
117
|
+
const encodedModel = encodeURIComponent(this.model);
|
|
118
|
+
const endpoint = `https://bedrock-runtime.${this.region}.amazonaws.com/model/${encodedModel}/invoke`;
|
|
119
|
+
const url = new URL(endpoint);
|
|
120
|
+
const reqHeaders = { 'Content-Type': 'application/json' };
|
|
121
|
+
const sigHeaders = signRequest('POST', url, reqHeaders, bodyStr, this.region, 'bedrock', this.accessKeyId, this.secretAccessKey);
|
|
122
|
+
const startMs = Date.now();
|
|
123
|
+
const response = await withRetry(() => fetch(endpoint, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
...reqHeaders,
|
|
127
|
+
...sigHeaders,
|
|
128
|
+
},
|
|
129
|
+
body: bodyStr,
|
|
130
|
+
}));
|
|
131
|
+
const durationMs = Date.now() - startMs;
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
const errorBody = await response.text().catch(() => '');
|
|
134
|
+
throw Object.assign(new Error(`Bedrock request failed: ${response.status} ${response.statusText} — ${errorBody}`), { status: response.status });
|
|
135
|
+
}
|
|
136
|
+
const data = (await response.json());
|
|
137
|
+
const textBlock = data.content?.find(c => c.type === 'text');
|
|
138
|
+
const text = textBlock?.text ?? '';
|
|
139
|
+
const usage = data.usage
|
|
140
|
+
? { inputTokens: data.usage.input_tokens, outputTokens: data.usage.output_tokens }
|
|
141
|
+
: undefined;
|
|
142
|
+
return { text, usage, durationMs };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/adapters/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { AdapterResponse, ChatMessage, ProviderAdapter } from './base.js';
|
|
1
|
+
import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
|
|
2
2
|
export declare class GeminiAdapter implements ProviderAdapter {
|
|
3
3
|
private client;
|
|
4
4
|
private model;
|
|
5
5
|
constructor(model: string);
|
|
6
|
-
call(prompt: string, system?: string): Promise<AdapterResponse>;
|
|
7
|
-
chat(messages: ChatMessage[], system?: string): Promise<AdapterResponse>;
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAqB5F,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAWnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CAqDtG"}
|
package/dist/adapters/gemini.js
CHANGED
|
@@ -10,7 +10,6 @@ async function withRetry(fn) {
|
|
|
10
10
|
catch (err) {
|
|
11
11
|
lastError = err;
|
|
12
12
|
const status = err.status;
|
|
13
|
-
// Only retry on rate limit (429) or server error (5xx)
|
|
14
13
|
if (status !== 429 && !(status && status >= 500))
|
|
15
14
|
throw err;
|
|
16
15
|
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
@@ -30,24 +29,29 @@ export class GeminiAdapter {
|
|
|
30
29
|
}
|
|
31
30
|
this.client = new GoogleGenerativeAI(apiKey);
|
|
32
31
|
}
|
|
33
|
-
async call(prompt, system) {
|
|
34
|
-
return this.chat([{ role: 'user', content: prompt }], system);
|
|
32
|
+
async call(prompt, system, options) {
|
|
33
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
35
34
|
}
|
|
36
|
-
async chat(messages, system) {
|
|
37
|
-
// Fold any system-role messages into the system instruction
|
|
35
|
+
async chat(messages, system, options) {
|
|
38
36
|
let effectiveSystem = system;
|
|
39
37
|
for (const msg of messages) {
|
|
40
38
|
if (msg.role === 'system') {
|
|
41
39
|
effectiveSystem = effectiveSystem ? `${effectiveSystem}\n\n${msg.content}` : msg.content;
|
|
42
40
|
}
|
|
43
41
|
}
|
|
42
|
+
const generationConfig = {};
|
|
43
|
+
if (options?.temperature !== undefined)
|
|
44
|
+
generationConfig.temperature = options.temperature;
|
|
45
|
+
if (options?.topP !== undefined)
|
|
46
|
+
generationConfig.topP = options.topP;
|
|
47
|
+
if (options?.maxTokens !== undefined)
|
|
48
|
+
generationConfig.maxOutputTokens = options.maxTokens;
|
|
44
49
|
const generativeModel = this.client.getGenerativeModel({
|
|
45
50
|
model: this.model,
|
|
46
51
|
...(effectiveSystem && { systemInstruction: effectiveSystem }),
|
|
52
|
+
...(Object.keys(generationConfig).length > 0 && { generationConfig }),
|
|
47
53
|
});
|
|
48
|
-
// Gemini uses "user" and "model" roles in history, final message sent via sendMessage
|
|
49
54
|
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
50
|
-
// If only one user message, use simple generateContent
|
|
51
55
|
if (nonSystemMessages.length === 1 && nonSystemMessages[0].role === 'user') {
|
|
52
56
|
const startMs = Date.now();
|
|
53
57
|
const result = await withRetry(() => generativeModel.generateContent(nonSystemMessages[0].content));
|
|
@@ -59,7 +63,6 @@ export class GeminiAdapter {
|
|
|
59
63
|
: undefined;
|
|
60
64
|
return { text, usage, durationMs };
|
|
61
65
|
}
|
|
62
|
-
// Multi-turn: use startChat with history, send the last message
|
|
63
66
|
const history = nonSystemMessages.slice(0, -1).map(m => ({
|
|
64
67
|
role: m.role === 'assistant' ? 'model' : 'user',
|
|
65
68
|
parts: [{ text: m.content }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,KAAK,UAAU,SAAS,CAAI,EAAoB;IAC9C,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;YACnD,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { ProviderAdapter } from './base.js';
|
|
2
2
|
export declare function getAdapter(provider: string, model: string): ProviderAdapter;
|
|
3
|
+
/**
|
|
4
|
+
* Load a custom provider plugin from a JS file and wrap it as a ProviderAdapter.
|
|
5
|
+
* The plugin must export an object/class with at least a `call(prompt, system?)` method.
|
|
6
|
+
* An optional `chat(messages, system?)` method is used if present; otherwise chat
|
|
7
|
+
* falls back to call() with the last user message.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getCustomAdapter(pluginPath: string): Promise<ProviderAdapter>;
|
|
3
10
|
export type { ProviderAdapter };
|
|
4
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA6C,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAiB3E;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BnF;AAED,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/adapters/index.js
CHANGED
|
@@ -2,6 +2,8 @@ import { OpenAIAdapter } from './openai.js';
|
|
|
2
2
|
import { AnthropicAdapter } from './anthropic.js';
|
|
3
3
|
import { GeminiAdapter } from './gemini.js';
|
|
4
4
|
import { OllamaAdapter } from './ollama.js';
|
|
5
|
+
import { AzureOpenAIAdapter } from './azure-openai.js';
|
|
6
|
+
import { BedrockAdapter } from './bedrock.js';
|
|
5
7
|
export function getAdapter(provider, model) {
|
|
6
8
|
switch (provider) {
|
|
7
9
|
case 'openai':
|
|
@@ -12,8 +14,41 @@ export function getAdapter(provider, model) {
|
|
|
12
14
|
return new GeminiAdapter(model);
|
|
13
15
|
case 'ollama':
|
|
14
16
|
return new OllamaAdapter(model);
|
|
17
|
+
case 'azure-openai':
|
|
18
|
+
return new AzureOpenAIAdapter(model);
|
|
19
|
+
case 'bedrock':
|
|
20
|
+
return new BedrockAdapter(model);
|
|
15
21
|
default:
|
|
16
|
-
throw new Error(`Unknown provider: "${provider}". Supported providers: openai, anthropic, gemini, ollama`);
|
|
22
|
+
throw new Error(`Unknown provider: "${provider}". Supported providers: openai, anthropic, gemini, ollama, azure-openai, bedrock`);
|
|
17
23
|
}
|
|
18
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Load a custom provider plugin from a JS file and wrap it as a ProviderAdapter.
|
|
27
|
+
* The plugin must export an object/class with at least a `call(prompt, system?)` method.
|
|
28
|
+
* An optional `chat(messages, system?)` method is used if present; otherwise chat
|
|
29
|
+
* falls back to call() with the last user message.
|
|
30
|
+
*/
|
|
31
|
+
export async function getCustomAdapter(pluginPath) {
|
|
32
|
+
let mod;
|
|
33
|
+
try {
|
|
34
|
+
mod = await import(pluginPath);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
throw new Error(`Failed to load custom provider plugin: ${pluginPath}: ${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
// Support both CJS (module.exports = { call }) and ESM (export default { call })
|
|
40
|
+
const plugin = (typeof mod.default === 'object' && mod.default !== null ? mod.default : mod);
|
|
41
|
+
if (typeof plugin.call !== 'function') {
|
|
42
|
+
throw new Error(`Custom provider plugin must export a "call(prompt, system?)" method: ${pluginPath}`);
|
|
43
|
+
}
|
|
44
|
+
const callFn = plugin.call.bind(plugin);
|
|
45
|
+
const chatFn = typeof plugin.chat === 'function'
|
|
46
|
+
? plugin.chat.bind(plugin)
|
|
47
|
+
: async (messages, system, _options) => {
|
|
48
|
+
// Fallback: concatenate messages into a single prompt
|
|
49
|
+
const lastUser = [...messages].reverse().find(m => m.role === 'user');
|
|
50
|
+
return callFn(lastUser?.content ?? '', system);
|
|
51
|
+
};
|
|
52
|
+
return { call: callFn, chat: chatFn };
|
|
53
|
+
}
|
|
19
54
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAa;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,cAAc;YACjB,OAAO,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,kFAAkF,CAAC,CAAC;IACtI,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,UAAU,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,iFAAiF;IACjF,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAA4B,CAAC;IAExH,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,wEAAwE,UAAU,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAyF,CAAC;IAEhI,MAAM,MAAM,GAA4B,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;QACvE,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAmG;QAC7H,CAAC,CAAC,KAAK,EAAE,QAAuB,EAAE,MAAe,EAAE,QAAsB,EAAE,EAAE;YACzE,sDAAsD;YACtD,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC;IAEN,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { AdapterResponse, ChatMessage, ProviderAdapter } from './base.js';
|
|
1
|
+
import type { AdapterResponse, CallOptions, ChatMessage, ProviderAdapter } from './base.js';
|
|
2
2
|
export declare class OllamaAdapter implements ProviderAdapter {
|
|
3
3
|
private baseUrl;
|
|
4
4
|
private model;
|
|
5
5
|
constructor(model: string);
|
|
6
|
-
call(prompt: string, system?: string): Promise<AdapterResponse>;
|
|
7
|
-
chat(messages: ChatMessage[], system?: string): Promise<AdapterResponse>;
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AA2B5F,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAKnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAItF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;CA4CtG"}
|