stepproof 0.3.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 -2
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +35 -4
- 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 +20 -1
- 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 -2
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +38 -4
- 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 -2
- package/dist/adapters/ollama.d.ts.map +1 -1
- package/dist/adapters/ollama.js +22 -6
- package/dist/adapters/ollama.js.map +1 -1
- package/dist/adapters/openai.d.ts +7 -2
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +37 -6
- 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/baseline.d.ts +2 -1
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +18 -1
- package/dist/baseline.js.map +1 -1
- package/dist/cli.js +163 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +252 -0
- package/dist/commands/diff.js.map +1 -0
- 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/commands/watch.d.ts +7 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +84 -0
- package/dist/commands/watch.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 +191 -9
- package/dist/core/scenario-parser.js.map +1 -1
- package/dist/core/scenario-runner.d.ts +4 -0
- package/dist/core/scenario-runner.d.ts.map +1 -1
- package/dist/core/scenario-runner.js +402 -61
- package/dist/core/scenario-runner.js.map +1 -1
- package/dist/core/types.d.ts +80 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/dataset.d.ts +6 -0
- package/dist/dataset.d.ts.map +1 -0
- package/dist/dataset.js +108 -0
- package/dist/dataset.js.map +1 -0
- package/dist/reporters/github-comment.d.ts +8 -0
- package/dist/reporters/github-comment.d.ts.map +1 -0
- package/dist/reporters/github-comment.js +114 -0
- package/dist/reporters/github-comment.js.map +1 -0
- package/dist/reporters/terminal-reporter.d.ts.map +1 -1
- package/dist/reporters/terminal-reporter.js +39 -5
- package/dist/reporters/terminal-reporter.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import type { AdapterResponse, 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>;
|
|
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
|
+
}>;
|
|
7
12
|
}
|
|
8
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,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,13 +28,27 @@ export class AnthropicAdapter {
|
|
|
29
28
|
}
|
|
30
29
|
this.client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
31
30
|
}
|
|
32
|
-
async call(prompt, system) {
|
|
31
|
+
async call(prompt, system, options) {
|
|
32
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
33
|
+
}
|
|
34
|
+
async chat(messages, system, options) {
|
|
35
|
+
const apiMessages = [];
|
|
36
|
+
for (const msg of messages) {
|
|
37
|
+
if (msg.role === 'system') {
|
|
38
|
+
system = system ? `${system}\n\n${msg.content}` : msg.content;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
apiMessages.push({ role: msg.role, content: msg.content });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
33
44
|
const startMs = Date.now();
|
|
34
45
|
const response = await withRetry(() => this.client.messages.create({
|
|
35
46
|
model: this.model,
|
|
36
|
-
max_tokens: 1024,
|
|
47
|
+
max_tokens: options?.maxTokens ?? 1024,
|
|
37
48
|
...(system && { system }),
|
|
38
|
-
|
|
49
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
50
|
+
...(options?.topP !== undefined && { top_p: options.topP }),
|
|
51
|
+
messages: apiMessages,
|
|
39
52
|
}));
|
|
40
53
|
const durationMs = Date.now() - startMs;
|
|
41
54
|
const content = response.content[0];
|
|
@@ -49,5 +62,23 @@ export class AnthropicAdapter {
|
|
|
49
62
|
durationMs,
|
|
50
63
|
};
|
|
51
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
|
+
}
|
|
52
83
|
}
|
|
53
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,8 +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
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface ChatMessage {
|
|
20
|
+
role: 'user' | 'assistant' | 'system';
|
|
21
|
+
content: string;
|
|
8
22
|
}
|
|
9
23
|
export interface ProviderAdapter {
|
|
10
|
-
call(prompt: string, 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
|
+
}>;
|
|
11
30
|
}
|
|
12
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,8 +1,9 @@
|
|
|
1
|
-
import type { AdapterResponse, 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>;
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
8
|
}
|
|
8
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,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,13 +29,48 @@ export class GeminiAdapter {
|
|
|
30
29
|
}
|
|
31
30
|
this.client = new GoogleGenerativeAI(apiKey);
|
|
32
31
|
}
|
|
33
|
-
async call(prompt, system) {
|
|
32
|
+
async call(prompt, system, options) {
|
|
33
|
+
return this.chat([{ role: 'user', content: prompt }], system, options);
|
|
34
|
+
}
|
|
35
|
+
async chat(messages, system, options) {
|
|
36
|
+
let effectiveSystem = system;
|
|
37
|
+
for (const msg of messages) {
|
|
38
|
+
if (msg.role === 'system') {
|
|
39
|
+
effectiveSystem = effectiveSystem ? `${effectiveSystem}\n\n${msg.content}` : msg.content;
|
|
40
|
+
}
|
|
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;
|
|
34
49
|
const generativeModel = this.client.getGenerativeModel({
|
|
35
50
|
model: this.model,
|
|
36
|
-
...(
|
|
51
|
+
...(effectiveSystem && { systemInstruction: effectiveSystem }),
|
|
52
|
+
...(Object.keys(generationConfig).length > 0 && { generationConfig }),
|
|
37
53
|
});
|
|
54
|
+
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
55
|
+
if (nonSystemMessages.length === 1 && nonSystemMessages[0].role === 'user') {
|
|
56
|
+
const startMs = Date.now();
|
|
57
|
+
const result = await withRetry(() => generativeModel.generateContent(nonSystemMessages[0].content));
|
|
58
|
+
const durationMs = Date.now() - startMs;
|
|
59
|
+
const text = result.response.text();
|
|
60
|
+
const usageMetadata = result.response.usageMetadata;
|
|
61
|
+
const usage = usageMetadata
|
|
62
|
+
? { inputTokens: usageMetadata.promptTokenCount ?? 0, outputTokens: usageMetadata.candidatesTokenCount ?? 0 }
|
|
63
|
+
: undefined;
|
|
64
|
+
return { text, usage, durationMs };
|
|
65
|
+
}
|
|
66
|
+
const history = nonSystemMessages.slice(0, -1).map(m => ({
|
|
67
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
68
|
+
parts: [{ text: m.content }],
|
|
69
|
+
}));
|
|
70
|
+
const lastMsg = nonSystemMessages[nonSystemMessages.length - 1];
|
|
71
|
+
const chat = generativeModel.startChat({ history });
|
|
38
72
|
const startMs = Date.now();
|
|
39
|
-
const result = await withRetry(() =>
|
|
73
|
+
const result = await withRetry(() => chat.sendMessage(lastMsg.content));
|
|
40
74
|
const durationMs = Date.now() - startMs;
|
|
41
75
|
const text = result.response.text();
|
|
42
76
|
const usageMetadata = result.response.usageMetadata;
|
|
@@ -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,8 +1,9 @@
|
|
|
1
|
-
import type { AdapterResponse, 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>;
|
|
6
|
+
call(prompt: string, system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
|
+
chat(messages: ChatMessage[], system?: string, options?: CallOptions): Promise<AdapterResponse>;
|
|
7
8
|
}
|
|
8
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,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"}
|