ai-output-assert 0.3.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 +183 -0
- package/dist/__tests__/matchers/content.test.d.ts +2 -0
- package/dist/__tests__/matchers/content.test.d.ts.map +1 -0
- package/dist/__tests__/matchers/content.test.js +66 -0
- package/dist/__tests__/matchers/content.test.js.map +1 -0
- package/dist/__tests__/matchers/format.test.d.ts +2 -0
- package/dist/__tests__/matchers/format.test.d.ts.map +1 -0
- package/dist/__tests__/matchers/format.test.js +100 -0
- package/dist/__tests__/matchers/format.test.js.map +1 -0
- package/dist/__tests__/matchers/quality.test.d.ts +2 -0
- package/dist/__tests__/matchers/quality.test.d.ts.map +1 -0
- package/dist/__tests__/matchers/quality.test.js +98 -0
- package/dist/__tests__/matchers/quality.test.js.map +1 -0
- package/dist/__tests__/matchers/safety.test.d.ts +2 -0
- package/dist/__tests__/matchers/safety.test.d.ts.map +1 -0
- package/dist/__tests__/matchers/safety.test.js +120 -0
- package/dist/__tests__/matchers/safety.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +2 -0
- package/dist/__tests__/setup.test.d.ts.map +1 -0
- package/dist/__tests__/setup.test.js +49 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +50 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/utils/cosine-similarity.test.d.ts +2 -0
- package/dist/__tests__/utils/cosine-similarity.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cosine-similarity.test.js +30 -0
- package/dist/__tests__/utils/cosine-similarity.test.js.map +1 -0
- package/dist/__tests__/utils/embedding-cache.test.d.ts +2 -0
- package/dist/__tests__/utils/embedding-cache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/embedding-cache.test.js +41 -0
- package/dist/__tests__/utils/embedding-cache.test.js.map +1 -0
- package/dist/__tests__/utils/json-extract.test.d.ts +2 -0
- package/dist/__tests__/utils/json-extract.test.d.ts.map +1 -0
- package/dist/__tests__/utils/json-extract.test.js +32 -0
- package/dist/__tests__/utils/json-extract.test.js.map +1 -0
- package/dist/__tests__/utils/luhn.test.d.ts +2 -0
- package/dist/__tests__/utils/luhn.test.d.ts.map +1 -0
- package/dist/__tests__/utils/luhn.test.js +25 -0
- package/dist/__tests__/utils/luhn.test.js.map +1 -0
- package/dist/__tests__/utils/ngrams.test.d.ts +2 -0
- package/dist/__tests__/utils/ngrams.test.d.ts.map +1 -0
- package/dist/__tests__/utils/ngrams.test.js +28 -0
- package/dist/__tests__/utils/ngrams.test.js.map +1 -0
- package/dist/__tests__/utils/regex-escape.test.d.ts +2 -0
- package/dist/__tests__/utils/regex-escape.test.d.ts.map +1 -0
- package/dist/__tests__/utils/regex-escape.test.js +48 -0
- package/dist/__tests__/utils/regex-escape.test.js.map +1 -0
- package/dist/__tests__/utils/sentences.test.d.ts +2 -0
- package/dist/__tests__/utils/sentences.test.d.ts.map +1 -0
- package/dist/__tests__/utils/sentences.test.js +39 -0
- package/dist/__tests__/utils/sentences.test.js.map +1 -0
- package/dist/__tests__/utils/tokenizer.test.d.ts +2 -0
- package/dist/__tests__/utils/tokenizer.test.d.ts.map +1 -0
- package/dist/__tests__/utils/tokenizer.test.js +25 -0
- package/dist/__tests__/utils/tokenizer.test.js.map +1 -0
- package/dist/catalogs/hedging-phrases.d.ts +4 -0
- package/dist/catalogs/hedging-phrases.d.ts.map +1 -0
- package/dist/catalogs/hedging-phrases.js +49 -0
- package/dist/catalogs/hedging-phrases.js.map +1 -0
- package/dist/catalogs/pii-patterns.d.ts +3 -0
- package/dist/catalogs/pii-patterns.d.ts.map +1 -0
- package/dist/catalogs/pii-patterns.js +35 -0
- package/dist/catalogs/pii-patterns.js.map +1 -0
- package/dist/catalogs/toxic-words.d.ts +3 -0
- package/dist/catalogs/toxic-words.d.ts.map +1 -0
- package/dist/catalogs/toxic-words.js +32 -0
- package/dist/catalogs/toxic-words.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/matchers/content.d.ts +6 -0
- package/dist/matchers/content.d.ts.map +1 -0
- package/dist/matchers/content.js +54 -0
- package/dist/matchers/content.js.map +1 -0
- package/dist/matchers/format.d.ts +6 -0
- package/dist/matchers/format.d.ts.map +1 -0
- package/dist/matchers/format.js +121 -0
- package/dist/matchers/format.js.map +1 -0
- package/dist/matchers/quality.d.ts +9 -0
- package/dist/matchers/quality.d.ts.map +1 -0
- package/dist/matchers/quality.js +107 -0
- package/dist/matchers/quality.js.map +1 -0
- package/dist/matchers/safety.d.ts +6 -0
- package/dist/matchers/safety.d.ts.map +1 -0
- package/dist/matchers/safety.js +87 -0
- package/dist/matchers/safety.js.map +1 -0
- package/dist/matchers/semantic.d.ts +12 -0
- package/dist/matchers/semantic.d.ts.map +1 -0
- package/dist/matchers/semantic.js +79 -0
- package/dist/matchers/semantic.js.map +1 -0
- package/dist/matchers/structural.d.ts +7 -0
- package/dist/matchers/structural.d.ts.map +1 -0
- package/dist/matchers/structural.js +154 -0
- package/dist/matchers/structural.js.map +1 -0
- package/dist/matchers/tone.d.ts +9 -0
- package/dist/matchers/tone.d.ts.map +1 -0
- package/dist/matchers/tone.js +138 -0
- package/dist/matchers/tone.js.map +1 -0
- package/dist/setup.d.ts +4 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +92 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cosine-similarity.d.ts +2 -0
- package/dist/utils/cosine-similarity.d.ts.map +1 -0
- package/dist/utils/cosine-similarity.js +18 -0
- package/dist/utils/cosine-similarity.js.map +1 -0
- package/dist/utils/embedding-cache.d.ts +3 -0
- package/dist/utils/embedding-cache.d.ts.map +1 -0
- package/dist/utils/embedding-cache.js +14 -0
- package/dist/utils/embedding-cache.js.map +1 -0
- package/dist/utils/json-extract.d.ts +2 -0
- package/dist/utils/json-extract.d.ts.map +1 -0
- package/dist/utils/json-extract.js +8 -0
- package/dist/utils/json-extract.js.map +1 -0
- package/dist/utils/luhn.d.ts +2 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +22 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/ngrams.d.ts +2 -0
- package/dist/utils/ngrams.d.ts.map +1 -0
- package/dist/utils/ngrams.js +13 -0
- package/dist/utils/ngrams.js.map +1 -0
- package/dist/utils/regex-escape.d.ts +2 -0
- package/dist/utils/regex-escape.d.ts.map +1 -0
- package/dist/utils/regex-escape.js +7 -0
- package/dist/utils/regex-escape.js.map +1 -0
- package/dist/utils/sentences.d.ts +2 -0
- package/dist/utils/sentences.d.ts.map +1 -0
- package/dist/utils/sentences.js +36 -0
- package/dist/utils/sentences.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +2 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +7 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +36 -0
package/dist/setup.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setupAIAssertions = setupAIAssertions;
|
|
4
|
+
exports.getGlobalOptions = getGlobalOptions;
|
|
5
|
+
const format_1 = require("./matchers/format");
|
|
6
|
+
const content_1 = require("./matchers/content");
|
|
7
|
+
const tone_1 = require("./matchers/tone");
|
|
8
|
+
const structural_1 = require("./matchers/structural");
|
|
9
|
+
const safety_1 = require("./matchers/safety");
|
|
10
|
+
const quality_1 = require("./matchers/quality");
|
|
11
|
+
const semantic_1 = require("./matchers/semantic");
|
|
12
|
+
let globalOptions = {};
|
|
13
|
+
function setupAIAssertions(options) {
|
|
14
|
+
globalOptions = { ...globalOptions, ...options };
|
|
15
|
+
const expectFn = typeof globalThis.expect !== 'undefined'
|
|
16
|
+
? globalThis.expect
|
|
17
|
+
: null;
|
|
18
|
+
if (expectFn && typeof expectFn.extend === 'function') {
|
|
19
|
+
expectFn.extend(buildMatchers(globalOptions));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function getGlobalOptions() {
|
|
23
|
+
return globalOptions;
|
|
24
|
+
}
|
|
25
|
+
function wrapSync(fn) {
|
|
26
|
+
return function (received, ...args) {
|
|
27
|
+
const result = fn(received, ...args);
|
|
28
|
+
return {
|
|
29
|
+
pass: result.pass,
|
|
30
|
+
message: result.message,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function wrapAsync(fn) {
|
|
35
|
+
return async function (received, ...args) {
|
|
36
|
+
const result = await fn(received, ...args);
|
|
37
|
+
return {
|
|
38
|
+
pass: result.pass,
|
|
39
|
+
message: result.message,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function buildMatchers(opts) {
|
|
44
|
+
return {
|
|
45
|
+
// format
|
|
46
|
+
toStartWith: wrapSync((r, prefix) => (0, format_1.toStartWith)(r, prefix)),
|
|
47
|
+
toEndWith: wrapSync((r, suffix) => (0, format_1.toEndWith)(r, suffix)),
|
|
48
|
+
toBeFormattedAs: wrapSync((r, fmt) => (0, format_1.toBeFormattedAs)(r, fmt)),
|
|
49
|
+
toHaveListItems: wrapSync((r, items) => (0, format_1.toHaveListItems)(r, items)),
|
|
50
|
+
// content
|
|
51
|
+
toContainAllOf: wrapSync((r, phrases) => (0, content_1.toContainAllOf)(r, phrases)),
|
|
52
|
+
toContainAnyOf: wrapSync((r, phrases) => (0, content_1.toContainAnyOf)(r, phrases)),
|
|
53
|
+
toNotContain: wrapSync((r, phrase) => (0, content_1.toNotContain)(r, phrase)),
|
|
54
|
+
toMentionEntity: wrapSync((r, entity, aliases) => (0, content_1.toMentionEntity)(r, entity, aliases)),
|
|
55
|
+
// tone
|
|
56
|
+
toHaveSentiment: wrapSync((r, sentiment) => (0, tone_1.toHaveSentiment)(r, sentiment)),
|
|
57
|
+
toHaveTone: wrapSync((r, tone) => (0, tone_1.toHaveTone)(r, tone)),
|
|
58
|
+
toBeConcise: wrapSync((r, maxWords) => (0, tone_1.toBeConcise)(r, maxWords)),
|
|
59
|
+
toNotBeVerbose: wrapSync((r, options) => (0, tone_1.toNotBeVerbose)(r, options)),
|
|
60
|
+
// structural
|
|
61
|
+
toBeValidJSON: wrapSync((r) => (0, structural_1.toBeValidJSON)(r)),
|
|
62
|
+
toMatchSchema: wrapSync((r, schema) => (0, structural_1.toMatchSchema)(r, schema)),
|
|
63
|
+
toHaveJSONFields: wrapSync((r, fields) => (0, structural_1.toHaveJSONFields)(r, fields)),
|
|
64
|
+
toBeValidMarkdown: wrapSync((r) => (0, structural_1.toBeValidMarkdown)(r)),
|
|
65
|
+
toContainCodeBlock: wrapSync((r, lang) => (0, structural_1.toContainCodeBlock)(r, lang)),
|
|
66
|
+
// safety
|
|
67
|
+
toNotContainPII: wrapSync((r, patterns) => (0, safety_1.toNotContainPII)(r, patterns)),
|
|
68
|
+
toNotContainToxicContent: wrapSync((r, words) => (0, safety_1.toNotContainToxicContent)(r, words)),
|
|
69
|
+
toNotLeakSystemPrompt: wrapSync((r, patterns) => (0, safety_1.toNotLeakSystemPrompt)(r, patterns)),
|
|
70
|
+
toNotBeRefusal: wrapSync((r, phrases) => (0, safety_1.toNotBeRefusal)(r, phrases)),
|
|
71
|
+
// quality
|
|
72
|
+
toNotBeTruncated: wrapSync((r) => (0, quality_1.toNotBeTruncated)(r)),
|
|
73
|
+
toNotBeHedged: wrapSync((r, phrases, threshold) => (0, quality_1.toNotBeHedged)(r, phrases, threshold)),
|
|
74
|
+
toBeCompleteJSON: wrapSync((r) => (0, quality_1.toBeCompleteJSON)(r)),
|
|
75
|
+
toNotRepeat: wrapSync((r, options) => (0, quality_1.toNotRepeat)(r, options)),
|
|
76
|
+
// semantic (async)
|
|
77
|
+
toBeSemanticallySimilarTo: wrapAsync((r, expected, options) => (0, semantic_1.toBeSemanticallySimilarTo)(r, expected, {
|
|
78
|
+
...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
|
|
79
|
+
...(opts.semanticThreshold ? { threshold: opts.semanticThreshold } : {}),
|
|
80
|
+
...(options ?? {}),
|
|
81
|
+
})),
|
|
82
|
+
toAnswerQuestion: wrapAsync((r, question, options) => (0, semantic_1.toAnswerQuestion)(r, question, {
|
|
83
|
+
...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
|
|
84
|
+
...(options ?? {}),
|
|
85
|
+
})),
|
|
86
|
+
toBeFactuallyConsistentWith: wrapAsync((r, reference, options) => (0, semantic_1.toBeFactuallyConsistentWith)(r, reference, {
|
|
87
|
+
...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
|
|
88
|
+
...(options ?? {}),
|
|
89
|
+
})),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface MatcherResult {
|
|
2
|
+
pass: boolean;
|
|
3
|
+
message: () => string;
|
|
4
|
+
details: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export type EmbedFn = (text: string) => Promise<number[]>;
|
|
7
|
+
export type Tone = 'formal' | 'casual' | 'technical' | 'friendly';
|
|
8
|
+
export type ToneScores = Record<Tone, number>;
|
|
9
|
+
export type Sentiment = 'positive' | 'negative' | 'neutral';
|
|
10
|
+
export type OutputFormat = 'json' | 'markdown' | 'list' | 'csv' | 'xml' | 'yaml' | 'table';
|
|
11
|
+
export interface PIIPattern {
|
|
12
|
+
type: string;
|
|
13
|
+
pattern: RegExp;
|
|
14
|
+
validate?: (match: string) => boolean;
|
|
15
|
+
label: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ToxicWord {
|
|
18
|
+
word: string;
|
|
19
|
+
severity: 'critical' | 'warning' | 'info';
|
|
20
|
+
}
|
|
21
|
+
export type PIIMatch = {
|
|
22
|
+
type: string;
|
|
23
|
+
value: string;
|
|
24
|
+
position: [number, number];
|
|
25
|
+
};
|
|
26
|
+
export interface AIAssertionOptions {
|
|
27
|
+
embedFn?: EmbedFn;
|
|
28
|
+
semanticThreshold?: number;
|
|
29
|
+
answerThreshold?: number;
|
|
30
|
+
consistencyThreshold?: number;
|
|
31
|
+
conciseMaxTokens?: number;
|
|
32
|
+
verboseMaxSentences?: number;
|
|
33
|
+
hedgingMaxRatio?: number;
|
|
34
|
+
repeatMaxRepetitions?: number;
|
|
35
|
+
systemPromptLeakThreshold?: number;
|
|
36
|
+
sentimentNeutralRange?: [number, number];
|
|
37
|
+
customPIIPatterns?: PIIPattern[];
|
|
38
|
+
customToxicWords?: ToxicWord[];
|
|
39
|
+
customEntityAliases?: Record<string, string[]>;
|
|
40
|
+
customHedgingPhrases?: string[];
|
|
41
|
+
customRefusalPhrases?: string[];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;CAC3C;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC;IACjC,gBAAgB,CAAC,EAAE,SAAS,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine-similarity.d.ts","sourceRoot":"","sources":["../../src/utils/cosine-similarity.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
4
|
+
function cosineSimilarity(a, b) {
|
|
5
|
+
if (a.length !== b.length) {
|
|
6
|
+
throw new Error(`Dimension mismatch: ${a.length} vs ${b.length}`);
|
|
7
|
+
}
|
|
8
|
+
let dot = 0, normA = 0, normB = 0;
|
|
9
|
+
for (let i = 0; i < a.length; i++) {
|
|
10
|
+
dot += a[i] * b[i];
|
|
11
|
+
normA += a[i] * a[i];
|
|
12
|
+
normB += b[i] * b[i];
|
|
13
|
+
}
|
|
14
|
+
if (normA === 0 || normB === 0)
|
|
15
|
+
return 0;
|
|
16
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cosine-similarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine-similarity.js","sourceRoot":"","sources":["../../src/utils/cosine-similarity.ts"],"names":[],"mappings":";;AAAA,4CAYC;AAZD,SAAgB,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.d.ts","sourceRoot":"","sources":["../../src/utils/embedding-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQ7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCachedEmbedFn = createCachedEmbedFn;
|
|
4
|
+
function createCachedEmbedFn(embedFn) {
|
|
5
|
+
const cache = new Map();
|
|
6
|
+
return async (text) => {
|
|
7
|
+
if (cache.has(text))
|
|
8
|
+
return cache.get(text);
|
|
9
|
+
const embedding = await embedFn(text);
|
|
10
|
+
cache.set(text, embedding);
|
|
11
|
+
return embedding;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=embedding-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-cache.js","sourceRoot":"","sources":["../../src/utils/embedding-cache.ts"],"names":[],"mappings":";;AAEA,kDAQC;AARD,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,OAAO,KAAK,EAAE,IAAY,EAAE,EAAE;QAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-extract.d.ts","sourceRoot":"","sources":["../../src/utils/json-extract.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractJSONFromCodeFence = extractJSONFromCodeFence;
|
|
4
|
+
function extractJSONFromCodeFence(text) {
|
|
5
|
+
const match = text.match(/```(?:json)?\s*\n([\s\S]*?)\n```/i);
|
|
6
|
+
return match ? match[1].trim() : null;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=json-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-extract.js","sourceRoot":"","sources":["../../src/utils/json-extract.ts"],"names":[],"mappings":";;AAAA,4DAGC;AAHD,SAAgB,wBAAwB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"luhn.d.ts","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAe9C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.luhnCheck = luhnCheck;
|
|
4
|
+
function luhnCheck(num) {
|
|
5
|
+
const digits = num.replace(/\D/g, '');
|
|
6
|
+
if (digits.length === 0)
|
|
7
|
+
return false;
|
|
8
|
+
let sum = 0;
|
|
9
|
+
let isEven = false;
|
|
10
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
11
|
+
let d = parseInt(digits[i], 10);
|
|
12
|
+
if (isEven) {
|
|
13
|
+
d *= 2;
|
|
14
|
+
if (d > 9)
|
|
15
|
+
d -= 9;
|
|
16
|
+
}
|
|
17
|
+
sum += d;
|
|
18
|
+
isEven = !isEven;
|
|
19
|
+
}
|
|
20
|
+
return sum % 10 === 0;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=luhn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"luhn.js","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":";;AAAA,8BAeC;AAfD,SAAgB,SAAS,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;QACT,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrams.d.ts","sourceRoot":"","sources":["../../src/utils/ngrams.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractNgrams = extractNgrams;
|
|
4
|
+
function extractNgrams(tokens, n) {
|
|
5
|
+
if (n <= 0 || tokens.length < n)
|
|
6
|
+
return [];
|
|
7
|
+
const result = [];
|
|
8
|
+
for (let i = 0; i <= tokens.length - n; i++) {
|
|
9
|
+
result.push(tokens.slice(i, i + n).join(' '));
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ngrams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrams.js","sourceRoot":"","sources":["../../src/utils/ngrams.ts"],"names":[],"mappings":";;AAAA,sCAOC;AAPD,SAAgB,aAAa,CAAC,MAAgB,EAAE,CAAS;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-escape.d.ts","sourceRoot":"","sources":["../../src/utils/regex-escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-escape.js","sourceRoot":"","sources":["../../src/utils/regex-escape.ts"],"names":[],"mappings":";;AAAA,kCAEC;AAFD,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentences.d.ts","sourceRoot":"","sources":["../../src/utils/sentences.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgCrD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.splitSentences = splitSentences;
|
|
4
|
+
const ABBREV_PATTERN = /\b(?:Mr|Mrs|Ms|Dr|Prof|Sr|Jr|Inc|Ltd|Corp|vs|etc|e\.g|i\.e|U\.S|U\.K|Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\.$/i;
|
|
5
|
+
function splitSentences(text) {
|
|
6
|
+
if (!text || text.trim().length === 0)
|
|
7
|
+
return [];
|
|
8
|
+
const result = [];
|
|
9
|
+
// Split on sentence-ending punctuation followed by whitespace + uppercase letter
|
|
10
|
+
// We use a manual approach to skip abbreviations
|
|
11
|
+
const raw = text.split(/(?<=[.!?]['")]*)\s+(?=[A-Z"])/);
|
|
12
|
+
for (const part of raw) {
|
|
13
|
+
const trimmed = part.trim();
|
|
14
|
+
if (trimmed.length === 0)
|
|
15
|
+
continue;
|
|
16
|
+
// Check if the last "sentence" ends with a known abbreviation — if so, it got
|
|
17
|
+
// split incorrectly and we should merge it back with the next part.
|
|
18
|
+
// Because we already split, we instead check each segment itself.
|
|
19
|
+
// If a segment ends with an abbreviation dot (e.g. "Dr."), it should have been
|
|
20
|
+
// attached to the next segment. We handle this by checking if the TRIMMED segment
|
|
21
|
+
// (without trailing whitespace) ends with an abbreviation.
|
|
22
|
+
if (result.length > 0) {
|
|
23
|
+
const prev = result[result.length - 1];
|
|
24
|
+
// If prev ends with a known abbreviation, merge
|
|
25
|
+
if (ABBREV_PATTERN.test(prev)) {
|
|
26
|
+
result[result.length - 1] = prev + ' ' + trimmed;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
result.push(trimmed);
|
|
31
|
+
}
|
|
32
|
+
// Final pass: if the last element ends with an abbreviation (no merge needed),
|
|
33
|
+
// it's still a valid sentence — leave it as is.
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sentences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentences.js","sourceRoot":"","sources":["../../src/utils/sentences.ts"],"names":[],"mappings":";;AAEA,wCAgCC;AAlCD,MAAM,cAAc,GAAG,uHAAuH,CAAC;AAE/I,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,iFAAiF;IACjF,iDAAiD;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,8EAA8E;QAC9E,oEAAoE;QACpE,kEAAkE;QAClE,+EAA+E;QAC/E,kFAAkF;QAClF,2DAA2D;QAC3D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,gDAAgD;YAChD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC;gBACjD,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,+EAA+E;IAC/E,gDAAgD;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/utils/tokenizer.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/utils/tokenizer.ts"],"names":[],"mappings":";;AAAA,4BAEC;AAFD,SAAgB,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-output-assert",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Rich assertion library for LLM outputs as Jest/Vitest matchers",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"lint": "eslint src/",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^25.5.0",
|
|
27
|
+
"@typescript-eslint/eslint-plugin": "^8.57.1",
|
|
28
|
+
"@typescript-eslint/parser": "^8.57.1",
|
|
29
|
+
"eslint": "^10.1.0",
|
|
30
|
+
"typescript": "^5.9.3",
|
|
31
|
+
"vitest": "^4.1.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"ajv": "^8.18.0"
|
|
35
|
+
}
|
|
36
|
+
}
|