jest-fuzzy 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -46
- package/dist/cjs/config.d.ts +5 -2
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +4 -1
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/anthropic.d.ts +2 -2
- package/dist/cjs/providers/anthropic.d.ts.map +1 -1
- package/dist/cjs/providers/anthropic.js +45 -73
- package/dist/cjs/providers/anthropic.js.map +1 -1
- package/dist/cjs/providers/google.d.ts +2 -2
- package/dist/cjs/providers/google.d.ts.map +1 -1
- package/dist/cjs/providers/google.js +50 -75
- package/dist/cjs/providers/google.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +2 -2
- package/dist/cjs/providers/index.d.ts.map +1 -1
- package/dist/cjs/providers/index.js +4 -4
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/providers/openai.d.ts +2 -2
- package/dist/cjs/providers/openai.d.ts.map +1 -1
- package/dist/cjs/providers/openai.js +37 -58
- package/dist/cjs/providers/openai.js.map +1 -1
- package/dist/cjs/types.d.ts +6 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/config.d.ts +5 -2
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +4 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/providers/anthropic.d.ts +2 -2
- package/dist/esm/providers/anthropic.d.ts.map +1 -1
- package/dist/esm/providers/anthropic.js +45 -40
- package/dist/esm/providers/anthropic.js.map +1 -1
- package/dist/esm/providers/google.d.ts +2 -2
- package/dist/esm/providers/google.d.ts.map +1 -1
- package/dist/esm/providers/google.js +50 -42
- package/dist/esm/providers/google.js.map +1 -1
- package/dist/esm/providers/index.d.ts +2 -2
- package/dist/esm/providers/index.d.ts.map +1 -1
- package/dist/esm/providers/index.js +4 -4
- package/dist/esm/providers/index.js.map +1 -1
- package/dist/esm/providers/openai.d.ts +2 -2
- package/dist/esm/providers/openai.d.ts.map +1 -1
- package/dist/esm/providers/openai.js +37 -25
- package/dist/esm/providers/openai.js.map +1 -1
- package/dist/esm/types.d.ts +6 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -20
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ModelName, LLMProvider } from "../types.js";
|
|
1
|
+
import type { ModelName, ApiKeys, LLMProvider } from "../types.js";
|
|
2
2
|
import { AnthropicProvider } from "./anthropic.js";
|
|
3
3
|
import { GoogleProvider } from "./google.js";
|
|
4
4
|
import { OpenAIProvider } from "./openai.js";
|
|
5
|
-
export declare function createProvider(model: ModelName): Promise<LLMProvider>;
|
|
5
|
+
export declare function createProvider(model: ModelName, apiKeys?: ApiKeys): Promise<LLMProvider>;
|
|
6
6
|
export { AnthropicProvider, GoogleProvider, OpenAIProvider };
|
|
7
7
|
export type { LLMProvider };
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAW9F;AAED,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -8,14 +8,14 @@ const google_js_1 = require("./google.js");
|
|
|
8
8
|
Object.defineProperty(exports, "GoogleProvider", { enumerable: true, get: function () { return google_js_1.GoogleProvider; } });
|
|
9
9
|
const openai_js_1 = require("./openai.js");
|
|
10
10
|
Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_js_1.OpenAIProvider; } });
|
|
11
|
-
async function createProvider(model) {
|
|
11
|
+
async function createProvider(model, apiKeys) {
|
|
12
12
|
switch (model) {
|
|
13
13
|
case "claude-haiku-4-5":
|
|
14
|
-
return anthropic_js_1.AnthropicProvider.create();
|
|
14
|
+
return anthropic_js_1.AnthropicProvider.create(apiKeys?.anthropic);
|
|
15
15
|
case "gemini-3-flash-preview":
|
|
16
|
-
return google_js_1.GoogleProvider.create();
|
|
16
|
+
return google_js_1.GoogleProvider.create(apiKeys?.google);
|
|
17
17
|
case "gpt-5-nano":
|
|
18
|
-
return openai_js_1.OpenAIProvider.create();
|
|
18
|
+
return openai_js_1.OpenAIProvider.create(apiKeys?.openai);
|
|
19
19
|
default:
|
|
20
20
|
throw new Error(`jest-fuzzy: Unknown model: ${model}`);
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;AAKA,wCAWC;AAfD,iDAAmD;AAiB1C,kGAjBA,gCAAiB,OAiBA;AAhB1B,2CAA6C;AAgBjB,+FAhBnB,0BAAc,OAgBmB;AAf1C,2CAA6C;AAeD,+FAfnC,0BAAc,OAemC;AAbnD,KAAK,UAAU,cAAc,CAAC,KAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;AAKA,wCAWC;AAfD,iDAAmD;AAiB1C,kGAjBA,gCAAiB,OAiBA;AAhB1B,2CAA6C;AAgBjB,+FAhBnB,0BAAc,OAgBmB;AAf1C,2CAA6C;AAeD,+FAfnC,0BAAc,OAemC;AAbnD,KAAK,UAAU,cAAc,CAAC,KAAgB,EAAE,OAAiB;IACtE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,kBAAkB;YACrB,OAAO,gCAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,KAAK,wBAAwB;YAC3B,OAAO,0BAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,KAAK,YAAY;YACf,OAAO,0BAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { LLMProvider, JudgmentResult } from "../types.js";
|
|
2
2
|
export declare class OpenAIProvider implements LLMProvider {
|
|
3
|
-
private
|
|
3
|
+
private apiKey;
|
|
4
4
|
private constructor();
|
|
5
|
-
static create(): Promise<OpenAIProvider>;
|
|
5
|
+
static create(apiKey?: string): Promise<OpenAIProvider>;
|
|
6
6
|
judge(prompt: string): Promise<JudgmentResult>;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoB/D,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAIM,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAWvD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAgDrD"}
|
|
@@ -1,39 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.OpenAIProvider = void 0;
|
|
4
|
+
const OPENAI_API_URL = "https://api.openai.com/v1/chat/completions";
|
|
37
5
|
const JUDGMENT_SCHEMA = {
|
|
38
6
|
type: "object",
|
|
39
7
|
properties: {
|
|
@@ -50,31 +18,37 @@ const JUDGMENT_SCHEMA = {
|
|
|
50
18
|
additionalProperties: false,
|
|
51
19
|
};
|
|
52
20
|
class OpenAIProvider {
|
|
53
|
-
|
|
54
|
-
constructor(
|
|
55
|
-
this.
|
|
21
|
+
apiKey;
|
|
22
|
+
constructor(apiKey) {
|
|
23
|
+
this.apiKey = apiKey;
|
|
56
24
|
}
|
|
57
|
-
static async create() {
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
60
|
-
throw new Error("jest-fuzzy: Missing
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
const module = await Promise.resolve().then(() => __importStar(require("openai")));
|
|
64
|
-
const OpenAI = module.default;
|
|
65
|
-
const client = new OpenAI({ apiKey });
|
|
66
|
-
return new OpenAIProvider(client);
|
|
67
|
-
}
|
|
68
|
-
catch (e) {
|
|
69
|
-
throw new Error("jest-fuzzy: To use gpt-5-nano, install openai");
|
|
25
|
+
static async create(apiKey) {
|
|
26
|
+
const key = apiKey ?? process.env.OPENAI_API_KEY;
|
|
27
|
+
if (!key) {
|
|
28
|
+
throw new Error("jest-fuzzy: Missing API key for gpt-5-nano model. " +
|
|
29
|
+
"Either pass it via configure({ apiKeys: { openai: '...' } }) or set OPENAI_API_KEY environment variable.");
|
|
70
30
|
}
|
|
31
|
+
return new OpenAIProvider(key);
|
|
71
32
|
}
|
|
72
33
|
async judge(prompt) {
|
|
73
|
-
|
|
74
|
-
|
|
34
|
+
const response = await fetch(OPENAI_API_URL, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: {
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify({
|
|
75
41
|
model: "gpt-4o-mini",
|
|
76
|
-
messages: [{ role: "user", content: prompt }],
|
|
77
42
|
max_tokens: 1024,
|
|
43
|
+
messages: [
|
|
44
|
+
{
|
|
45
|
+
role: "system",
|
|
46
|
+
content: 'You must respond with valid JSON matching this schema: {"verdict": boolean, "explanation": string}. ' +
|
|
47
|
+
'"verdict" should be true if the condition is satisfied, false otherwise. ' +
|
|
48
|
+
'"explanation" should briefly explain your reasoning.',
|
|
49
|
+
},
|
|
50
|
+
{ role: "user", content: prompt },
|
|
51
|
+
],
|
|
78
52
|
response_format: {
|
|
79
53
|
type: "json_schema",
|
|
80
54
|
json_schema: {
|
|
@@ -83,14 +57,19 @@ class OpenAIProvider {
|
|
|
83
57
|
schema: JUDGMENT_SCHEMA,
|
|
84
58
|
},
|
|
85
59
|
},
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
const errorText = await response.text();
|
|
64
|
+
throw new Error(`jest-fuzzy: OpenAI API error (${response.status}): ${errorText}`);
|
|
90
65
|
}
|
|
91
|
-
|
|
92
|
-
|
|
66
|
+
const data = (await response.json());
|
|
67
|
+
const content = data.choices?.[0]?.message?.content;
|
|
68
|
+
if (!content) {
|
|
69
|
+
throw new Error("jest-fuzzy: OpenAI API returned no content");
|
|
93
70
|
}
|
|
71
|
+
const parsed = JSON.parse(content);
|
|
72
|
+
return { verdict: parsed.verdict, explanation: parsed.explanation };
|
|
94
73
|
}
|
|
95
74
|
}
|
|
96
75
|
exports.OpenAIProvider = OpenAIProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/providers/openai.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG,4CAA4C,CAAC;AAEpE,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAkB;YACxB,WAAW,EAAE,qDAAqD;SACnE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,WAAW,EAAE,oCAAoC;SAClD;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAU;IAC7C,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAa,cAAc;IACjB,MAAM,CAAS;IAEvB,YAAoB,MAAc;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAe;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,oDAAoD;gBAClD,0GAA0G,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,OAAO,EACL,sGAAsG;4BACtG,2EAA2E;4BAC3E,sDAAsD;qBACzD;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBAClC;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE;wBACX,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,eAAe;qBACxB;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8C,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACF;AAlED,wCAkEC"}
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export type ModelName = "claude-haiku-4-5" | "gemini-3-flash-preview" | "gpt-5-nano";
|
|
2
|
+
export interface ApiKeys {
|
|
3
|
+
anthropic?: string;
|
|
4
|
+
google?: string;
|
|
5
|
+
openai?: string;
|
|
6
|
+
}
|
|
2
7
|
export interface JestFuzzyConfig {
|
|
3
8
|
model?: ModelName;
|
|
9
|
+
apiKeys?: ApiKeys;
|
|
4
10
|
}
|
|
5
11
|
export interface SemanticMatchOptions {
|
|
6
12
|
threshold?: "strict" | "loose";
|
package/dist/cjs/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,wBAAwB,GACxB,YAAY,CAAC;AAEjB,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,IAAI,CAAC;QACb,UAAU,QAAQ,CAAC,CAAC;YAClB,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAAC;YACd,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACzC;KACF;CACF"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,wBAAwB,GACxB,YAAY,CAAC;AAEjB,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,IAAI,CAAC;QACb,UAAU,QAAQ,CAAC,CAAC;YAClB,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,CAAC,CAAC,CAAC;YACd,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;SACzC;KACF;CACF"}
|
package/dist/esm/config.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type { JestFuzzyConfig, LLMProvider } from "./types.js";
|
|
1
|
+
import type { JestFuzzyConfig, ModelName, ApiKeys, LLMProvider } from "./types.js";
|
|
2
2
|
export declare function configure(config?: JestFuzzyConfig): void;
|
|
3
|
-
export declare function getConfig():
|
|
3
|
+
export declare function getConfig(): {
|
|
4
|
+
model: ModelName;
|
|
5
|
+
apiKeys?: ApiKeys;
|
|
6
|
+
};
|
|
4
7
|
export declare function getProvider(): Promise<LLMProvider>;
|
|
5
8
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/esm/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYnF,wBAAgB,SAAS,CAAC,MAAM,GAAE,eAAoB,GAAG,IAAI,CAS5D;AAED,wBAAgB,SAAS,IAAI;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAKnE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAcxD"}
|
package/dist/esm/config.js
CHANGED
|
@@ -8,6 +8,7 @@ let providerPromise = null;
|
|
|
8
8
|
export function configure(config = {}) {
|
|
9
9
|
currentConfig = {
|
|
10
10
|
model: config.model ?? DEFAULT_MODEL,
|
|
11
|
+
apiKeys: config.apiKeys,
|
|
11
12
|
};
|
|
12
13
|
// Reset provider so it will be re-created with new config
|
|
13
14
|
providerInstance = null;
|
|
@@ -16,6 +17,7 @@ export function configure(config = {}) {
|
|
|
16
17
|
export function getConfig() {
|
|
17
18
|
return {
|
|
18
19
|
model: currentConfig.model ?? DEFAULT_MODEL,
|
|
20
|
+
apiKeys: currentConfig.apiKeys,
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
export async function getProvider() {
|
|
@@ -23,7 +25,8 @@ export async function getProvider() {
|
|
|
23
25
|
return providerInstance;
|
|
24
26
|
}
|
|
25
27
|
if (!providerPromise) {
|
|
26
|
-
|
|
28
|
+
const config = getConfig();
|
|
29
|
+
providerPromise = createProvider(config.model, config.apiKeys).then((provider) => {
|
|
27
30
|
providerInstance = provider;
|
|
28
31
|
return provider;
|
|
29
32
|
});
|
package/dist/esm/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,aAAa,GAAc,kBAAkB,CAAC;AAEpD,IAAI,aAAa,GAAoB;IACnC,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,IAAI,gBAAgB,GAAuB,IAAI,CAAC;AAChD,IAAI,eAAe,GAAgC,IAAI,CAAC;AAExD,MAAM,UAAU,SAAS,CAAC,SAA0B,EAAE;IACpD,aAAa,GAAG;QACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAa;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,aAAa,GAAc,kBAAkB,CAAC;AAEpD,IAAI,aAAa,GAAoB;IACnC,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,IAAI,gBAAgB,GAAuB,IAAI,CAAC;AAChD,IAAI,eAAe,GAAgC,IAAI,CAAC;AAExD,MAAM,UAAU,SAAS,CAAC,SAA0B,EAAE;IACpD,aAAa,GAAG;QACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAa;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IAEF,0DAA0D;IAC1D,gBAAgB,GAAG,IAAI,CAAC;IACxB,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,aAAa;QAC3C,OAAO,EAAE,aAAa,CAAC,OAAO;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/E,gBAAgB,GAAG,QAAQ,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { configure, getConfig, getProvider } from "./config.js";
|
|
2
|
-
import type { JestFuzzyConfig, SemanticMatchOptions, ModelName, LLMProvider } from "./types.js";
|
|
2
|
+
import type { JestFuzzyConfig, SemanticMatchOptions, ModelName, ApiKeys, LLMProvider } from "./types.js";
|
|
3
3
|
export { configure, getConfig, getProvider };
|
|
4
|
-
export type { JestFuzzyConfig, SemanticMatchOptions, ModelName, LLMProvider, };
|
|
4
|
+
export type { JestFuzzyConfig, SemanticMatchOptions, ModelName, ApiKeys, LLMProvider, };
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAUpB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAC7C,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,WAAW,GACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,OAAO,EACP,WAAW,EACZ,MAAM,YAAY,CAAC;AAUpB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAC7C,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,OAAO,EACP,WAAW,GACZ,CAAC"}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AASpD,8BAA8B;AAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,MAAM,CAAC,MAAM,CAAC;QACZ,mBAAmB;QACnB,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { LLMProvider, JudgmentResult } from "../types.js";
|
|
2
2
|
export declare class AnthropicProvider implements LLMProvider {
|
|
3
|
-
private
|
|
3
|
+
private apiKey;
|
|
4
4
|
private constructor();
|
|
5
|
-
static create(): Promise<AnthropicProvider>;
|
|
5
|
+
static create(apiKey?: string): Promise<AnthropicProvider>;
|
|
6
6
|
judge(prompt: string): Promise<JudgmentResult>;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoB/D,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAIM,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAW1D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAmCrD"}
|
|
@@ -1,57 +1,62 @@
|
|
|
1
|
+
const ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
|
|
1
2
|
const JUDGMENT_SCHEMA = {
|
|
2
|
-
type: "
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type: "string",
|
|
12
|
-
description: "Brief explanation of the reasoning",
|
|
13
|
-
},
|
|
3
|
+
type: "object",
|
|
4
|
+
properties: {
|
|
5
|
+
verdict: {
|
|
6
|
+
type: "boolean",
|
|
7
|
+
description: "true if the condition is satisfied, false otherwise",
|
|
8
|
+
},
|
|
9
|
+
explanation: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "Brief explanation of the reasoning",
|
|
14
12
|
},
|
|
15
|
-
required: ["verdict", "explanation"],
|
|
16
|
-
additionalProperties: false,
|
|
17
13
|
},
|
|
14
|
+
required: ["verdict", "explanation"],
|
|
15
|
+
additionalProperties: false,
|
|
18
16
|
};
|
|
19
17
|
export class AnthropicProvider {
|
|
20
|
-
|
|
21
|
-
constructor(
|
|
22
|
-
this.
|
|
18
|
+
apiKey;
|
|
19
|
+
constructor(apiKey) {
|
|
20
|
+
this.apiKey = apiKey;
|
|
23
21
|
}
|
|
24
|
-
static async create() {
|
|
25
|
-
const
|
|
26
|
-
if (!
|
|
27
|
-
throw new Error("jest-fuzzy: Missing
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
const module = await import("@anthropic-ai/sdk");
|
|
31
|
-
const Anthropic = module.default;
|
|
32
|
-
const client = new Anthropic({ apiKey });
|
|
33
|
-
return new AnthropicProvider(client);
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
throw new Error("jest-fuzzy: To use claude-haiku-4-5, install @anthropic-ai/sdk");
|
|
22
|
+
static async create(apiKey) {
|
|
23
|
+
const key = apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
24
|
+
if (!key) {
|
|
25
|
+
throw new Error("jest-fuzzy: Missing API key for claude-haiku-4-5 model. " +
|
|
26
|
+
"Either pass it via configure({ apiKeys: { anthropic: '...' } }) or set ANTHROPIC_API_KEY environment variable.");
|
|
37
27
|
}
|
|
28
|
+
return new AnthropicProvider(key);
|
|
38
29
|
}
|
|
39
30
|
async judge(prompt) {
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
const response = await fetch(ANTHROPIC_API_URL, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"content-type": "application/json",
|
|
35
|
+
"x-api-key": this.apiKey,
|
|
36
|
+
"anthropic-version": "2023-06-01",
|
|
37
|
+
"anthropic-beta": "structured-outputs-2025-11-13",
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({
|
|
42
40
|
model: "claude-haiku-4-5",
|
|
43
41
|
max_tokens: 1024,
|
|
44
|
-
betas: ["structured-outputs-2025-11-13"],
|
|
45
42
|
messages: [{ role: "user", content: prompt }],
|
|
46
|
-
output_format:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
output_format: {
|
|
44
|
+
type: "json_schema",
|
|
45
|
+
schema: JUDGMENT_SCHEMA,
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const errorText = await response.text();
|
|
51
|
+
throw new Error(`jest-fuzzy: Anthropic API error (${response.status}): ${errorText}`);
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
const data = (await response.json());
|
|
54
|
+
const text = data.content?.[0]?.text;
|
|
55
|
+
if (!text) {
|
|
56
|
+
throw new Error("jest-fuzzy: Anthropic API returned no content");
|
|
54
57
|
}
|
|
58
|
+
const parsed = JSON.parse(text);
|
|
59
|
+
return { verdict: parsed.verdict, explanation: parsed.explanation };
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,MAAM,
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/providers/anthropic.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAElE,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAiB;IACvB,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAkB;YACxB,WAAW,EAAE,qDAAqD;SACnE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,WAAW,EAAE,oCAAoC;SAClD;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;IACpC,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAS;IAEvB,YAAoB,MAAc;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAe;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,0DAA0D;gBACxD,gHAAgH,CACnH,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,mBAAmB,EAAE,YAAY;gBACjC,gBAAgB,EAAE,+BAA+B;aAClD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,kBAAkB;gBACzB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,aAAa,EAAE;oBACb,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,eAAe;iBACxB;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2C,CAAC;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAErC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8C,CAAC;QAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { LLMProvider, JudgmentResult } from "../types.js";
|
|
2
2
|
export declare class GoogleProvider implements LLMProvider {
|
|
3
|
-
private
|
|
3
|
+
private apiKey;
|
|
4
4
|
private constructor();
|
|
5
|
-
static create(): Promise<GoogleProvider>;
|
|
5
|
+
static create(apiKey?: string): Promise<GoogleProvider>;
|
|
6
6
|
judge(prompt: string): Promise<JudgmentResult>;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=google.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmB/D,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAIM,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAWvD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAsCrD"}
|
|
@@ -1,53 +1,61 @@
|
|
|
1
|
+
const GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent";
|
|
2
|
+
const JUDGMENT_SCHEMA = {
|
|
3
|
+
type: "OBJECT",
|
|
4
|
+
properties: {
|
|
5
|
+
verdict: {
|
|
6
|
+
type: "BOOLEAN",
|
|
7
|
+
description: "true if the condition is satisfied, false otherwise",
|
|
8
|
+
},
|
|
9
|
+
explanation: {
|
|
10
|
+
type: "STRING",
|
|
11
|
+
description: "Brief explanation of the reasoning",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ["verdict", "explanation"],
|
|
15
|
+
};
|
|
1
16
|
export class GoogleProvider {
|
|
2
|
-
|
|
3
|
-
constructor(
|
|
4
|
-
this.
|
|
17
|
+
apiKey;
|
|
18
|
+
constructor(apiKey) {
|
|
19
|
+
this.apiKey = apiKey;
|
|
5
20
|
}
|
|
6
|
-
static async create() {
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
9
|
-
throw new Error("jest-fuzzy: Missing
|
|
21
|
+
static async create(apiKey) {
|
|
22
|
+
const key = apiKey ?? process.env.GOOGLE_API_KEY;
|
|
23
|
+
if (!key) {
|
|
24
|
+
throw new Error("jest-fuzzy: Missing API key for gemini-3-flash-preview model. " +
|
|
25
|
+
"Either pass it via configure({ apiKeys: { google: '...' } }) or set GOOGLE_API_KEY environment variable.");
|
|
10
26
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
return new GoogleProvider(key);
|
|
28
|
+
}
|
|
29
|
+
async judge(prompt) {
|
|
30
|
+
const url = `${GEMINI_API_URL}?key=${this.apiKey}`;
|
|
31
|
+
const response = await fetch(url, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
contents: [
|
|
38
|
+
{
|
|
39
|
+
parts: [{ text: prompt }],
|
|
40
|
+
},
|
|
41
|
+
],
|
|
17
42
|
generationConfig: {
|
|
18
43
|
responseMimeType: "application/json",
|
|
19
|
-
responseSchema:
|
|
20
|
-
type: SchemaType.OBJECT,
|
|
21
|
-
properties: {
|
|
22
|
-
verdict: {
|
|
23
|
-
type: SchemaType.BOOLEAN,
|
|
24
|
-
description: "true if the condition is satisfied, false otherwise",
|
|
25
|
-
},
|
|
26
|
-
explanation: {
|
|
27
|
-
type: SchemaType.STRING,
|
|
28
|
-
description: "Brief explanation of the reasoning",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
required: ["verdict", "explanation"],
|
|
32
|
-
},
|
|
44
|
+
responseSchema: JUDGMENT_SCHEMA,
|
|
33
45
|
},
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
throw new Error(
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async judge(prompt) {
|
|
42
|
-
try {
|
|
43
|
-
const result = await this.model.generateContent(prompt);
|
|
44
|
-
const text = result.response.text();
|
|
45
|
-
const parsed = JSON.parse(text);
|
|
46
|
-
return { verdict: parsed.verdict, explanation: parsed.explanation };
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const errorText = await response.text();
|
|
50
|
+
throw new Error(`jest-fuzzy: Google API error (${response.status}): ${errorText}`);
|
|
47
51
|
}
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
const data = (await response.json());
|
|
53
|
+
const text = data.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
54
|
+
if (!text) {
|
|
55
|
+
throw new Error("jest-fuzzy: Google API returned no content");
|
|
50
56
|
}
|
|
57
|
+
const parsed = JSON.parse(text);
|
|
58
|
+
return { verdict: parsed.verdict, explanation: parsed.explanation };
|
|
51
59
|
}
|
|
52
60
|
}
|
|
53
61
|
//# sourceMappingURL=google.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACjB,
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/providers/google.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,0FAA0F,CAAC;AAElH,MAAM,eAAe,GAAG;IACtB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,qDAAqD;SACnE;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,oCAAoC;SAClD;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;CACrC,CAAC;AAEF,MAAM,OAAO,cAAc;IACjB,MAAM,CAAS;IAEvB,YAAoB,MAAc;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAe;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,gEAAgE;gBAC9D,0GAA0G,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,MAAM,GAAG,GAAG,GAAG,cAAc,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE;oBACR;wBACE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qBAC1B;iBACF;gBACD,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,kBAAkB;oBACpC,cAAc,EAAE,eAAe;iBAChC;aACF,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAE7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8C,CAAC;QAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ModelName, LLMProvider } from "../types.js";
|
|
1
|
+
import type { ModelName, ApiKeys, LLMProvider } from "../types.js";
|
|
2
2
|
import { AnthropicProvider } from "./anthropic.js";
|
|
3
3
|
import { GoogleProvider } from "./google.js";
|
|
4
4
|
import { OpenAIProvider } from "./openai.js";
|
|
5
|
-
export declare function createProvider(model: ModelName): Promise<LLMProvider>;
|
|
5
|
+
export declare function createProvider(model: ModelName, apiKeys?: ApiKeys): Promise<LLMProvider>;
|
|
6
6
|
export { AnthropicProvider, GoogleProvider, OpenAIProvider };
|
|
7
7
|
export type { LLMProvider };
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAW9F;AAED,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { AnthropicProvider } from "./anthropic.js";
|
|
2
2
|
import { GoogleProvider } from "./google.js";
|
|
3
3
|
import { OpenAIProvider } from "./openai.js";
|
|
4
|
-
export async function createProvider(model) {
|
|
4
|
+
export async function createProvider(model, apiKeys) {
|
|
5
5
|
switch (model) {
|
|
6
6
|
case "claude-haiku-4-5":
|
|
7
|
-
return AnthropicProvider.create();
|
|
7
|
+
return AnthropicProvider.create(apiKeys?.anthropic);
|
|
8
8
|
case "gemini-3-flash-preview":
|
|
9
|
-
return GoogleProvider.create();
|
|
9
|
+
return GoogleProvider.create(apiKeys?.google);
|
|
10
10
|
case "gpt-5-nano":
|
|
11
|
-
return OpenAIProvider.create();
|
|
11
|
+
return OpenAIProvider.create(apiKeys?.openai);
|
|
12
12
|
default:
|
|
13
13
|
throw new Error(`jest-fuzzy: Unknown model: ${model}`);
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAgB,EAAE,OAAiB;IACtE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,kBAAkB;YACrB,OAAO,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,KAAK,wBAAwB;YAC3B,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,KAAK,YAAY;YACf,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|