@goreal-ai/echo-pdk 0.6.0 → 0.8.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/README.md +1 -1
- package/dist/ai-judge/index.d.ts +11 -21
- package/dist/ai-judge/index.d.ts.map +1 -1
- package/dist/ai-judge/index.js +36 -90
- package/dist/ai-judge/index.js.map +1 -1
- package/dist/embeddings/cosine.d.ts +15 -0
- package/dist/embeddings/cosine.d.ts.map +1 -0
- package/dist/embeddings/cosine.js +37 -0
- package/dist/embeddings/cosine.js.map +1 -0
- package/dist/embeddings/index.d.ts +9 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +11 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/openai.d.ts +11 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +38 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/registry.d.ts +13 -0
- package/dist/embeddings/registry.d.ts.map +1 -0
- package/dist/embeddings/registry.js +29 -0
- package/dist/embeddings/registry.js.map +1 -0
- package/dist/embeddings/types.d.ts +35 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +8 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/embeddings/voyage.d.ts +12 -0
- package/dist/embeddings/voyage.d.ts.map +1 -0
- package/dist/embeddings/voyage.js +39 -0
- package/dist/embeddings/voyage.js.map +1 -0
- package/dist/eval/assertions.d.ts +35 -0
- package/dist/eval/assertions.d.ts.map +1 -0
- package/dist/eval/assertions.js +349 -0
- package/dist/eval/assertions.js.map +1 -0
- package/dist/eval/dataset.d.ts +42 -0
- package/dist/eval/dataset.d.ts.map +1 -0
- package/dist/eval/dataset.js +101 -0
- package/dist/eval/dataset.js.map +1 -0
- package/dist/eval/index.d.ts +14 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +17 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/loader.d.ts +30 -0
- package/dist/eval/loader.d.ts.map +1 -0
- package/dist/eval/loader.js +170 -0
- package/dist/eval/loader.js.map +1 -0
- package/dist/eval/reporter.d.ts +26 -0
- package/dist/eval/reporter.d.ts.map +1 -0
- package/dist/eval/reporter.js +164 -0
- package/dist/eval/reporter.js.map +1 -0
- package/dist/eval/runner.d.ts +28 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +232 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/types.d.ts +257 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +11 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/evaluator/evaluator.d.ts +2 -2
- package/dist/evaluator/evaluator.js +5 -5
- package/dist/evaluator/evaluator.js.map +1 -1
- package/dist/evaluator/index.d.ts +1 -1
- package/dist/evaluator/index.d.ts.map +1 -1
- package/dist/evaluator/index.js +1 -1
- package/dist/evaluator/index.js.map +1 -1
- package/dist/evaluator/operators.d.ts +9 -5
- package/dist/evaluator/operators.d.ts.map +1 -1
- package/dist/evaluator/operators.js +26 -33
- package/dist/evaluator/operators.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -20
- package/dist/index.js.map +1 -1
- package/dist/parser/ast.js +1 -1
- package/dist/parser/ast.js.map +1 -1
- package/dist/parser/lexer.d.ts +1 -1
- package/dist/parser/lexer.js +1 -1
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +10 -3
- package/dist/project/index.js.map +1 -1
- package/dist/project/types.d.ts +19 -4
- package/dist/project/types.d.ts.map +1 -1
- package/dist/project/types.js +3 -0
- package/dist/project/types.js.map +1 -1
- package/dist/providers/anthropic.d.ts +18 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +123 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +45 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +107 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +16 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +106 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +80 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +118 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/run-prompt.d.ts +69 -0
- package/dist/providers/run-prompt.d.ts.map +1 -0
- package/dist/providers/run-prompt.js +79 -0
- package/dist/providers/run-prompt.js.map +1 -0
- package/dist/providers/types.d.ts +123 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +9 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +9 -2
- package/dist/utils/file-utils.js.map +1 -1
- package/package.json +12 -6
- package/scripts/bundle-for-graaljs.mjs +220 -0
- package/scripts/stubs/crypto.mjs +12 -0
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ console.log(result);
|
|
|
79
79
|
| `#greater_than(n)` | `#gt` | Greater than |
|
|
80
80
|
| `#less_than(n)` | `#lt` | Less than |
|
|
81
81
|
| `#one_of(a,b,c)` | `#in` | Value in list |
|
|
82
|
-
| `#
|
|
82
|
+
| `#ai_gate(question)` | - | LLM-evaluated condition |
|
|
83
83
|
|
|
84
84
|
### Composition
|
|
85
85
|
```
|
package/dist/ai-judge/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview AI
|
|
2
|
+
* @fileoverview AI Gate - LLM-based condition evaluation
|
|
3
3
|
*
|
|
4
|
-
* This module handles the #
|
|
5
|
-
* to evaluate boolean conditions.
|
|
4
|
+
* This module handles the #ai_gate operator (and deprecated #ai_judge alias)
|
|
5
|
+
* which queries an LLM to evaluate boolean conditions.
|
|
6
6
|
*
|
|
7
7
|
* FEATURES:
|
|
8
8
|
* - Provider abstraction for different backends (OpenAI, Anthropic)
|
|
@@ -31,26 +31,13 @@ export interface AIProvider {
|
|
|
31
31
|
evaluate(value: unknown, question: string): Promise<boolean>;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Create an
|
|
34
|
+
* Create an AI provider for the AI Judge operator.
|
|
35
|
+
* Delegates to the unified provider system from providers/registry.
|
|
35
36
|
*
|
|
36
37
|
* @param config - Configuration with API key and model
|
|
37
|
-
* @returns AIProvider
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const provider = createOpenAIProvider({
|
|
42
|
-
* type: 'openai',
|
|
43
|
-
* apiKey: process.env.OPENAI_API_KEY,
|
|
44
|
-
* model: 'gpt-4o-mini',
|
|
45
|
-
* });
|
|
46
|
-
*
|
|
47
|
-
* const result = await provider.evaluate(
|
|
48
|
-
* 'This is a family-friendly movie.',
|
|
49
|
-
* 'Is this content appropriate for children?'
|
|
50
|
-
* );
|
|
51
|
-
* ```
|
|
38
|
+
* @returns AIProvider for boolean evaluation
|
|
52
39
|
*/
|
|
53
|
-
export declare function
|
|
40
|
+
export declare function createAIJudgeProvider(config: AIProviderConfig): AIProvider;
|
|
54
41
|
/**
|
|
55
42
|
* Build the prompt for the AI judge.
|
|
56
43
|
*
|
|
@@ -160,7 +147,10 @@ export interface WithCacheOptions {
|
|
|
160
147
|
*
|
|
161
148
|
* @example
|
|
162
149
|
* ```typescript
|
|
163
|
-
* const provider =
|
|
150
|
+
* const provider = createAIJudge({
|
|
151
|
+
* type: 'openai',
|
|
152
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
153
|
+
* });
|
|
164
154
|
* const cachedProvider = withCache(provider, {
|
|
165
155
|
* providerType: 'openai',
|
|
166
156
|
* model: 'gpt-4o-mini',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-judge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-judge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAcD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAgD1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUpE;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAElE;AAYD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,KAAK,EAAE,OAAO,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAI/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAW1D;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAK3D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,GAAG,UAAU,CA2BrF"}
|
package/dist/ai-judge/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview AI
|
|
2
|
+
* @fileoverview AI Gate - LLM-based condition evaluation
|
|
3
3
|
*
|
|
4
|
-
* This module handles the #
|
|
5
|
-
* to evaluate boolean conditions.
|
|
4
|
+
* This module handles the #ai_gate operator (and deprecated #ai_judge alias)
|
|
5
|
+
* which queries an LLM to evaluate boolean conditions.
|
|
6
6
|
*
|
|
7
7
|
* FEATURES:
|
|
8
8
|
* - Provider abstraction for different backends (OpenAI, Anthropic)
|
|
@@ -17,71 +17,53 @@
|
|
|
17
17
|
* 3. Config file: echo.config.yaml (aiProvider.apiKey)
|
|
18
18
|
*/
|
|
19
19
|
import { createHash } from 'crypto';
|
|
20
|
+
import { createProvider } from '../providers/registry.js';
|
|
20
21
|
// =============================================================================
|
|
21
|
-
//
|
|
22
|
+
// AI JUDGE PROVIDER (delegates to unified provider system)
|
|
22
23
|
// =============================================================================
|
|
23
24
|
/**
|
|
24
|
-
* Create an
|
|
25
|
+
* Create an AI provider for the AI Judge operator.
|
|
26
|
+
* Delegates to the unified provider system from providers/registry.
|
|
25
27
|
*
|
|
26
28
|
* @param config - Configuration with API key and model
|
|
27
|
-
* @returns AIProvider
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```typescript
|
|
31
|
-
* const provider = createOpenAIProvider({
|
|
32
|
-
* type: 'openai',
|
|
33
|
-
* apiKey: process.env.OPENAI_API_KEY,
|
|
34
|
-
* model: 'gpt-4o-mini',
|
|
35
|
-
* });
|
|
36
|
-
*
|
|
37
|
-
* const result = await provider.evaluate(
|
|
38
|
-
* 'This is a family-friendly movie.',
|
|
39
|
-
* 'Is this content appropriate for children?'
|
|
40
|
-
* );
|
|
41
|
-
* ```
|
|
29
|
+
* @returns AIProvider for boolean evaluation
|
|
42
30
|
*/
|
|
43
|
-
export function
|
|
44
|
-
const
|
|
31
|
+
export function createAIJudgeProvider(config) {
|
|
32
|
+
const providerType = config.type ?? 'openai';
|
|
45
33
|
const model = config.model ?? 'gpt-4o-mini';
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
34
|
+
const instance = createProvider({
|
|
35
|
+
type: providerType,
|
|
36
|
+
apiKey: config.apiKey,
|
|
37
|
+
model,
|
|
38
|
+
timeout: config.timeout,
|
|
39
|
+
});
|
|
50
40
|
return {
|
|
51
41
|
async evaluate(value, question) {
|
|
52
42
|
const prompt = buildPrompt(value, question);
|
|
53
|
-
const messages = [
|
|
54
|
-
{
|
|
55
|
-
role: 'system',
|
|
56
|
-
content: 'You are a precise yes/no evaluator. Answer ONLY with "yes" or "no" (lowercase, no punctuation). Do not explain or elaborate.',
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
role: 'user',
|
|
60
|
-
content: prompt,
|
|
61
|
-
},
|
|
62
|
-
];
|
|
63
43
|
try {
|
|
64
|
-
const response = await
|
|
65
|
-
|
|
66
|
-
|
|
44
|
+
const response = await instance.complete([
|
|
45
|
+
{
|
|
46
|
+
role: 'system',
|
|
47
|
+
content: 'You are a precise yes/no evaluator. Answer ONLY with "yes" or "no" (lowercase, no punctuation). Do not explain or elaborate.',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
role: 'user',
|
|
51
|
+
content: prompt,
|
|
52
|
+
},
|
|
53
|
+
], { model, temperature: 0, maxTokens: 10 });
|
|
54
|
+
const answer = response.text.trim().toLowerCase();
|
|
55
|
+
if (answer === 'yes')
|
|
67
56
|
return true;
|
|
68
|
-
|
|
69
|
-
if (answer === 'no') {
|
|
57
|
+
if (answer === 'no')
|
|
70
58
|
return false;
|
|
71
|
-
|
|
72
|
-
// Unexpected response - try to interpret
|
|
73
|
-
if (answer?.includes('yes')) {
|
|
59
|
+
if (answer.includes('yes'))
|
|
74
60
|
return true;
|
|
75
|
-
|
|
76
|
-
if (answer?.includes('no')) {
|
|
61
|
+
if (answer.includes('no'))
|
|
77
62
|
return false;
|
|
78
|
-
}
|
|
79
|
-
// Default to false for ambiguous responses
|
|
80
63
|
console.warn(`AI Judge returned unexpected response: "${answer}". Defaulting to false.`);
|
|
81
64
|
return false;
|
|
82
65
|
}
|
|
83
66
|
catch (error) {
|
|
84
|
-
// Re-throw with more context
|
|
85
67
|
if (error instanceof Error) {
|
|
86
68
|
throw new Error(`AI Judge evaluation failed: ${error.message}`);
|
|
87
69
|
}
|
|
@@ -90,37 +72,6 @@ export function createOpenAIProvider(config) {
|
|
|
90
72
|
},
|
|
91
73
|
};
|
|
92
74
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Call the OpenAI Chat Completions API.
|
|
95
|
-
*/
|
|
96
|
-
async function callOpenAI(apiKey, model, messages, timeout) {
|
|
97
|
-
const controller = new AbortController();
|
|
98
|
-
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
99
|
-
try {
|
|
100
|
-
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
101
|
-
method: 'POST',
|
|
102
|
-
headers: {
|
|
103
|
-
'Content-Type': 'application/json',
|
|
104
|
-
Authorization: `Bearer ${apiKey}`,
|
|
105
|
-
},
|
|
106
|
-
body: JSON.stringify({
|
|
107
|
-
model,
|
|
108
|
-
messages,
|
|
109
|
-
max_tokens: 10,
|
|
110
|
-
temperature: 0, // Deterministic responses
|
|
111
|
-
}),
|
|
112
|
-
signal: controller.signal,
|
|
113
|
-
});
|
|
114
|
-
if (!response.ok) {
|
|
115
|
-
const errorBody = await response.text();
|
|
116
|
-
throw new Error(`OpenAI API error (${response.status}): ${errorBody}`);
|
|
117
|
-
}
|
|
118
|
-
return (await response.json());
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
clearTimeout(timeoutId);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
75
|
/**
|
|
125
76
|
* Build the prompt for the AI judge.
|
|
126
77
|
*
|
|
@@ -160,15 +111,7 @@ ${question}`;
|
|
|
160
111
|
* ```
|
|
161
112
|
*/
|
|
162
113
|
export function createAIJudge(config) {
|
|
163
|
-
|
|
164
|
-
case 'openai':
|
|
165
|
-
return createOpenAIProvider(config);
|
|
166
|
-
case 'anthropic':
|
|
167
|
-
// TODO: Implement Anthropic provider
|
|
168
|
-
throw new Error('Anthropic provider not yet implemented. Use OpenAI for now.');
|
|
169
|
-
default:
|
|
170
|
-
throw new Error(`Unknown AI provider type: ${config.type}`);
|
|
171
|
-
}
|
|
114
|
+
return createAIJudgeProvider(config);
|
|
172
115
|
}
|
|
173
116
|
// =============================================================================
|
|
174
117
|
// CACHING
|
|
@@ -260,7 +203,10 @@ export function getCacheSize() {
|
|
|
260
203
|
*
|
|
261
204
|
* @example
|
|
262
205
|
* ```typescript
|
|
263
|
-
* const provider =
|
|
206
|
+
* const provider = createAIJudge({
|
|
207
|
+
* type: 'openai',
|
|
208
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
209
|
+
* });
|
|
264
210
|
* const cachedProvider = withCache(provider, {
|
|
265
211
|
* providerType: 'openai',
|
|
266
212
|
* model: 'gpt-4o-mini',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai-judge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai-judge/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Cosine similarity — pure math, no dependencies.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute cosine similarity between two vectors.
|
|
6
|
+
*
|
|
7
|
+
* Returns a value in [-1, 1]:
|
|
8
|
+
* 1.0 = identical direction
|
|
9
|
+
* 0.0 = orthogonal
|
|
10
|
+
* -1.0 = opposite direction
|
|
11
|
+
*
|
|
12
|
+
* @throws Error if vectors have different dimensions or are zero-length.
|
|
13
|
+
*/
|
|
14
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
15
|
+
//# sourceMappingURL=cosine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.d.ts","sourceRoot":"","sources":["../../src/embeddings/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BjE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Cosine similarity — pure math, no dependencies.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute cosine similarity between two vectors.
|
|
6
|
+
*
|
|
7
|
+
* Returns a value in [-1, 1]:
|
|
8
|
+
* 1.0 = identical direction
|
|
9
|
+
* 0.0 = orthogonal
|
|
10
|
+
* -1.0 = opposite direction
|
|
11
|
+
*
|
|
12
|
+
* @throws Error if vectors have different dimensions or are zero-length.
|
|
13
|
+
*/
|
|
14
|
+
export function cosineSimilarity(a, b) {
|
|
15
|
+
if (a.length !== b.length) {
|
|
16
|
+
throw new Error(`Dimension mismatch: vector A has ${a.length} dimensions, vector B has ${b.length}`);
|
|
17
|
+
}
|
|
18
|
+
if (a.length === 0) {
|
|
19
|
+
throw new Error('Cannot compute cosine similarity of zero-length vectors');
|
|
20
|
+
}
|
|
21
|
+
let dot = 0;
|
|
22
|
+
let magA = 0;
|
|
23
|
+
let magB = 0;
|
|
24
|
+
for (let i = 0; i < a.length; i++) {
|
|
25
|
+
const ai = a[i];
|
|
26
|
+
const bi = b[i];
|
|
27
|
+
dot += ai * bi;
|
|
28
|
+
magA += ai * ai;
|
|
29
|
+
magB += bi * bi;
|
|
30
|
+
}
|
|
31
|
+
const magnitude = Math.sqrt(magA) * Math.sqrt(magB);
|
|
32
|
+
if (magnitude === 0) {
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
return dot / magnitude;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cosine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../src/embeddings/cosine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,oCAAoC,CAAC,CAAC,MAAM,6BAA6B,CAAC,CAAC,MAAM,EAAE,CACpF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,GAAG,GAAG,SAAS,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Embeddings module — barrel exports
|
|
3
|
+
*/
|
|
4
|
+
export type { EmbeddingProviderType, EmbeddingConfig, EmbeddingProvider, } from './types.js';
|
|
5
|
+
export { cosineSimilarity } from './cosine.js';
|
|
6
|
+
export { createOpenAIEmbeddingProvider } from './openai.js';
|
|
7
|
+
export { createVoyageEmbeddingProvider } from './voyage.js';
|
|
8
|
+
export { createEmbeddingProvider, isEmbeddingProviderType } from './registry.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Embeddings module — barrel exports
|
|
3
|
+
*/
|
|
4
|
+
// Pure math
|
|
5
|
+
export { cosineSimilarity } from './cosine.js';
|
|
6
|
+
// Provider factories
|
|
7
|
+
export { createOpenAIEmbeddingProvider } from './openai.js';
|
|
8
|
+
export { createVoyageEmbeddingProvider } from './voyage.js';
|
|
9
|
+
// Registry
|
|
10
|
+
export { createEmbeddingProvider, isEmbeddingProviderType } from './registry.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAqB;AACrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAE5D,WAAW;AACX,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OpenAI embedding provider
|
|
3
|
+
*
|
|
4
|
+
* Uses the POST /v1/embeddings endpoint with text-embedding-3-small by default.
|
|
5
|
+
*/
|
|
6
|
+
import type { EmbeddingConfig, EmbeddingProvider } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create an OpenAI embedding provider.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createOpenAIEmbeddingProvider(config: EmbeddingConfig): EmbeddingProvider;
|
|
11
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAUrE;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAiCnB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OpenAI embedding provider
|
|
3
|
+
*
|
|
4
|
+
* Uses the POST /v1/embeddings endpoint with text-embedding-3-small by default.
|
|
5
|
+
*/
|
|
6
|
+
import { fetchWithTimeout, extractApiError } from '../providers/base.js';
|
|
7
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
8
|
+
const DEFAULT_BASE_URL = 'https://api.openai.com';
|
|
9
|
+
const DEFAULT_TIMEOUT = 30_000;
|
|
10
|
+
/**
|
|
11
|
+
* Create an OpenAI embedding provider.
|
|
12
|
+
*/
|
|
13
|
+
export function createOpenAIEmbeddingProvider(config) {
|
|
14
|
+
const model = config.model ?? DEFAULT_MODEL;
|
|
15
|
+
const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
16
|
+
const timeout = config.timeout ?? DEFAULT_TIMEOUT;
|
|
17
|
+
return {
|
|
18
|
+
type: 'openai',
|
|
19
|
+
async embed(texts) {
|
|
20
|
+
const response = await fetchWithTimeout(`${baseUrl}/v1/embeddings`, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
25
|
+
},
|
|
26
|
+
body: JSON.stringify({ input: texts, model }),
|
|
27
|
+
}, timeout);
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(await extractApiError(response, 'OpenAI Embeddings'));
|
|
30
|
+
}
|
|
31
|
+
const body = (await response.json());
|
|
32
|
+
// API may return embeddings out of order — sort by index
|
|
33
|
+
const sorted = body.data.sort((a, b) => a.index - b.index);
|
|
34
|
+
return sorted.map((d) => d.embedding);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGzE,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAClD,MAAM,eAAe,GAAG,MAAM,CAAC;AAM/B;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,QAAQ;QAEd,KAAK,CAAC,KAAK,CAAC,KAAe;YACzB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,GAAG,OAAO,gBAAgB,EAC1B;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;iBACzC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aAC9C,EACD,OAAO,CACR,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAEhE,yDAAyD;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Embedding provider registry — dispatcher + type guard.
|
|
3
|
+
*/
|
|
4
|
+
import type { EmbeddingConfig, EmbeddingProvider, EmbeddingProviderType } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Type guard for embedding provider types.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isEmbeddingProviderType(value: string): value is EmbeddingProviderType;
|
|
9
|
+
/**
|
|
10
|
+
* Create an embedding provider from config.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createEmbeddingProvider(config: EmbeddingConfig): EmbeddingProvider;
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/embeddings/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAS5F;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,qBAAqB,CAEhC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CASnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Embedding provider registry — dispatcher + type guard.
|
|
3
|
+
*/
|
|
4
|
+
import { createOpenAIEmbeddingProvider } from './openai.js';
|
|
5
|
+
import { createVoyageEmbeddingProvider } from './voyage.js';
|
|
6
|
+
const VALID_TYPES = new Set([
|
|
7
|
+
'openai',
|
|
8
|
+
'voyage',
|
|
9
|
+
]);
|
|
10
|
+
/**
|
|
11
|
+
* Type guard for embedding provider types.
|
|
12
|
+
*/
|
|
13
|
+
export function isEmbeddingProviderType(value) {
|
|
14
|
+
return VALID_TYPES.has(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create an embedding provider from config.
|
|
18
|
+
*/
|
|
19
|
+
export function createEmbeddingProvider(config) {
|
|
20
|
+
switch (config.type) {
|
|
21
|
+
case 'openai':
|
|
22
|
+
return createOpenAIEmbeddingProvider(config);
|
|
23
|
+
case 'voyage':
|
|
24
|
+
return createVoyageEmbeddingProvider(config);
|
|
25
|
+
default:
|
|
26
|
+
throw new Error(`Unknown embedding provider type: ${config.type}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/embeddings/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAwB;IACtE,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAa;IAEb,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAuB;IAEvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,QAAQ;YACX,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAC/C;YACE,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAc,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Embedding provider types
|
|
3
|
+
*
|
|
4
|
+
* Separate from AIProviderInstance because embedding-only providers
|
|
5
|
+
* (like Voyage AI) can't implement completions/judge/listModels.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Supported embedding provider types.
|
|
9
|
+
*/
|
|
10
|
+
export type EmbeddingProviderType = 'openai' | 'voyage';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for creating an embedding provider.
|
|
13
|
+
*/
|
|
14
|
+
export interface EmbeddingConfig {
|
|
15
|
+
/** Provider type */
|
|
16
|
+
type: EmbeddingProviderType;
|
|
17
|
+
/** API key */
|
|
18
|
+
apiKey: string;
|
|
19
|
+
/** Model override (defaults: 'text-embedding-3-small' / 'voyage-3-lite') */
|
|
20
|
+
model?: string;
|
|
21
|
+
/** Custom base URL */
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
24
|
+
timeout?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Lightweight embedding provider — compute vectors, nothing else.
|
|
28
|
+
*/
|
|
29
|
+
export interface EmbeddingProvider {
|
|
30
|
+
/** Provider type */
|
|
31
|
+
readonly type: EmbeddingProviderType;
|
|
32
|
+
/** Embed one or more texts, returns one vector per input text. */
|
|
33
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAMxD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,kEAAkE;IAClE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Voyage AI embedding provider
|
|
3
|
+
*
|
|
4
|
+
* Voyage AI (for Anthropic users without OpenAI keys).
|
|
5
|
+
* Uses POST /v1/embeddings with voyage-3-lite by default.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingConfig, EmbeddingProvider } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a Voyage AI embedding provider.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createVoyageEmbeddingProvider(config: EmbeddingConfig): EmbeddingProvider;
|
|
12
|
+
//# sourceMappingURL=voyage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voyage.d.ts","sourceRoot":"","sources":["../../src/embeddings/voyage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAUrE;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAiCnB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Voyage AI embedding provider
|
|
3
|
+
*
|
|
4
|
+
* Voyage AI (for Anthropic users without OpenAI keys).
|
|
5
|
+
* Uses POST /v1/embeddings with voyage-3-lite by default.
|
|
6
|
+
*/
|
|
7
|
+
import { fetchWithTimeout, extractApiError } from '../providers/base.js';
|
|
8
|
+
const DEFAULT_MODEL = 'voyage-3-lite';
|
|
9
|
+
const DEFAULT_BASE_URL = 'https://api.voyageai.com';
|
|
10
|
+
const DEFAULT_TIMEOUT = 30_000;
|
|
11
|
+
/**
|
|
12
|
+
* Create a Voyage AI embedding provider.
|
|
13
|
+
*/
|
|
14
|
+
export function createVoyageEmbeddingProvider(config) {
|
|
15
|
+
const model = config.model ?? DEFAULT_MODEL;
|
|
16
|
+
const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
17
|
+
const timeout = config.timeout ?? DEFAULT_TIMEOUT;
|
|
18
|
+
return {
|
|
19
|
+
type: 'voyage',
|
|
20
|
+
async embed(texts) {
|
|
21
|
+
const response = await fetchWithTimeout(`${baseUrl}/v1/embeddings`, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({ input: texts, model }),
|
|
28
|
+
}, timeout);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(await extractApiError(response, 'Voyage AI Embeddings'));
|
|
31
|
+
}
|
|
32
|
+
const body = (await response.json());
|
|
33
|
+
// Sort by index to guarantee correct ordering
|
|
34
|
+
const sorted = body.data.sort((a, b) => a.index - b.index);
|
|
35
|
+
return sorted.map((d) => d.embedding);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=voyage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voyage.js","sourceRoot":"","sources":["../../src/embeddings/voyage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGzE,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,eAAe,GAAG,MAAM,CAAC;AAM/B;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,QAAQ;QAEd,KAAK,CAAC,KAAK,CAAC,KAAe;YACzB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,GAAG,OAAO,gBAAgB,EAC1B;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;iBACzC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aAC9C,EACD,OAAO,CACR,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAEhE,8CAA8C;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Assertion implementations for eval tests
|
|
3
|
+
*
|
|
4
|
+
* Each assertion takes a text output and returns a pass/fail result.
|
|
5
|
+
* Assertions are organized by category:
|
|
6
|
+
* - Text assertions (contains, equals, matches, etc.)
|
|
7
|
+
* - Structural assertions (json_valid, json_schema)
|
|
8
|
+
* - AI/Semantic assertions (llm_judge, similar_to, sentiment)
|
|
9
|
+
* - Performance assertions (latency, token_count, cost)
|
|
10
|
+
*/
|
|
11
|
+
import type { Assertion, AssertionResult, LLMProvider, LLMResponse } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Context passed to assertion handlers.
|
|
14
|
+
*/
|
|
15
|
+
export interface AssertionContext {
|
|
16
|
+
/** The text to assert against */
|
|
17
|
+
text: string;
|
|
18
|
+
/** LLM response metadata (for performance assertions) */
|
|
19
|
+
llmResponse?: LLMResponse;
|
|
20
|
+
/** LLM provider for AI assertions */
|
|
21
|
+
llmProvider?: LLMProvider;
|
|
22
|
+
/** Function to load a dataset's golden response */
|
|
23
|
+
loadGolden?: (datasetName: string) => Promise<string | undefined>;
|
|
24
|
+
/** Embeddings-based similarity function (preferred over LLM when available) */
|
|
25
|
+
embeddingSimilarity?: (textA: string, textB: string) => Promise<number>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run a single assertion against the given context.
|
|
29
|
+
*/
|
|
30
|
+
export declare function runAssertion(assertion: Assertion, ctx: AssertionContext): Promise<AssertionResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Run multiple assertions against the given context.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runAssertions(assertions: Assertion[], ctx: AssertionContext): Promise<AssertionResult[]>;
|
|
35
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/eval/assertions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMvF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,qCAAqC;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,SAAS,EAAE,EACvB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B"}
|