@cdot65/prisma-airs-cli 1.0.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 +42 -0
- package/dist/airs/management.d.ts +58 -0
- package/dist/airs/management.d.ts.map +1 -0
- package/dist/airs/management.js +287 -0
- package/dist/airs/management.js.map +1 -0
- package/dist/airs/modelsecurity.d.ts +74 -0
- package/dist/airs/modelsecurity.d.ts.map +1 -0
- package/dist/airs/modelsecurity.js +337 -0
- package/dist/airs/modelsecurity.js.map +1 -0
- package/dist/airs/promptsets.d.ts +50 -0
- package/dist/airs/promptsets.d.ts.map +1 -0
- package/dist/airs/promptsets.js +133 -0
- package/dist/airs/promptsets.js.map +1 -0
- package/dist/airs/redteam.d.ts +45 -0
- package/dist/airs/redteam.d.ts.map +1 -0
- package/dist/airs/redteam.js +219 -0
- package/dist/airs/redteam.js.map +1 -0
- package/dist/airs/runtime.d.ts +27 -0
- package/dist/airs/runtime.d.ts.map +1 -0
- package/dist/airs/runtime.js +158 -0
- package/dist/airs/runtime.js.map +1 -0
- package/dist/airs/scanner.d.ts +22 -0
- package/dist/airs/scanner.d.ts.map +1 -0
- package/dist/airs/scanner.js +62 -0
- package/dist/airs/scanner.js.map +1 -0
- package/dist/airs/types.d.ts +683 -0
- package/dist/airs/types.d.ts.map +1 -0
- package/dist/airs/types.js +6 -0
- package/dist/airs/types.js.map +1 -0
- package/dist/audit/evaluator.d.ts +17 -0
- package/dist/audit/evaluator.d.ts.map +1 -0
- package/dist/audit/evaluator.js +82 -0
- package/dist/audit/evaluator.js.map +1 -0
- package/dist/audit/report.d.ts +38 -0
- package/dist/audit/report.d.ts.map +1 -0
- package/dist/audit/report.js +141 -0
- package/dist/audit/report.js.map +1 -0
- package/dist/audit/runner.d.ts +18 -0
- package/dist/audit/runner.d.ts.map +1 -0
- package/dist/audit/runner.js +60 -0
- package/dist/audit/runner.js.map +1 -0
- package/dist/audit/types.d.ts +53 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +5 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/cli/bulk-scan-state.d.ts +15 -0
- package/dist/cli/bulk-scan-state.d.ts.map +1 -0
- package/dist/cli/bulk-scan-state.js +20 -0
- package/dist/cli/bulk-scan-state.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +113 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +231 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +23 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/modelsecurity.d.ts +4 -0
- package/dist/cli/commands/modelsecurity.d.ts.map +1 -0
- package/dist/cli/commands/modelsecurity.js +499 -0
- package/dist/cli/commands/modelsecurity.js.map +1 -0
- package/dist/cli/commands/redteam.d.ts +4 -0
- package/dist/cli/commands/redteam.d.ts.map +1 -0
- package/dist/cli/commands/redteam.js +630 -0
- package/dist/cli/commands/redteam.js.map +1 -0
- package/dist/cli/commands/report.d.ts +4 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +116 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +4 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +138 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/runtime.d.ts +3 -0
- package/dist/cli/commands/runtime.d.ts.map +1 -0
- package/dist/cli/commands/runtime.js +582 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +46 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parse-input.d.ts +9 -0
- package/dist/cli/parse-input.d.ts.map +1 -0
- package/dist/cli/parse-input.js +109 -0
- package/dist/cli/parse-input.js.map +1 -0
- package/dist/cli/prompts.d.ts +9 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +90 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/renderer/audit.d.ts +8 -0
- package/dist/cli/renderer/audit.d.ts.map +1 -0
- package/dist/cli/renderer/audit.js +44 -0
- package/dist/cli/renderer/audit.js.map +1 -0
- package/dist/cli/renderer/common.d.ts +3 -0
- package/dist/cli/renderer/common.d.ts.map +1 -0
- package/dist/cli/renderer/common.js +6 -0
- package/dist/cli/renderer/common.js.map +1 -0
- package/dist/cli/renderer/generate.d.ts +29 -0
- package/dist/cli/renderer/generate.d.ts.map +1 -0
- package/dist/cli/renderer/generate.js +132 -0
- package/dist/cli/renderer/generate.js.map +1 -0
- package/dist/cli/renderer/index.d.ts +7 -0
- package/dist/cli/renderer/index.d.ts.map +1 -0
- package/dist/cli/renderer/index.js +7 -0
- package/dist/cli/renderer/index.js.map +1 -0
- package/dist/cli/renderer/modelsecurity.d.ts +34 -0
- package/dist/cli/renderer/modelsecurity.d.ts.map +1 -0
- package/dist/cli/renderer/modelsecurity.js +285 -0
- package/dist/cli/renderer/modelsecurity.js.map +1 -0
- package/dist/cli/renderer/redteam.d.ts +152 -0
- package/dist/cli/renderer/redteam.d.ts.map +1 -0
- package/dist/cli/renderer/redteam.js +294 -0
- package/dist/cli/renderer/redteam.js.map +1 -0
- package/dist/cli/renderer/runtime.d.ts +87 -0
- package/dist/cli/renderer/runtime.d.ts.map +1 -0
- package/dist/cli/renderer/runtime.js +230 -0
- package/dist/cli/renderer/runtime.js.map +1 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +65 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +78 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +44 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/constraints.d.ts +18 -0
- package/dist/core/constraints.d.ts.map +1 -0
- package/dist/core/constraints.js +75 -0
- package/dist/core/constraints.js.map +1 -0
- package/dist/core/loop.d.ts +54 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +462 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/metrics.d.ts +13 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +73 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/types.d.ts +175 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/prompts/analyze-results.d.ts +3 -0
- package/dist/llm/prompts/analyze-results.d.ts.map +1 -0
- package/dist/llm/prompts/analyze-results.js +52 -0
- package/dist/llm/prompts/analyze-results.js.map +1 -0
- package/dist/llm/prompts/generate-companion.d.ts +3 -0
- package/dist/llm/prompts/generate-companion.d.ts.map +1 -0
- package/dist/llm/prompts/generate-companion.js +42 -0
- package/dist/llm/prompts/generate-companion.js.map +1 -0
- package/dist/llm/prompts/generate-tests.d.ts +3 -0
- package/dist/llm/prompts/generate-tests.d.ts.map +1 -0
- package/dist/llm/prompts/generate-tests.js +46 -0
- package/dist/llm/prompts/generate-tests.js.map +1 -0
- package/dist/llm/prompts/generate-topic.d.ts +4 -0
- package/dist/llm/prompts/generate-topic.d.ts.map +1 -0
- package/dist/llm/prompts/generate-topic.js +41 -0
- package/dist/llm/prompts/generate-topic.js.map +1 -0
- package/dist/llm/prompts/improve-topic.d.ts +3 -0
- package/dist/llm/prompts/improve-topic.d.ts.map +1 -0
- package/dist/llm/prompts/improve-topic.js +77 -0
- package/dist/llm/prompts/improve-topic.js.map +1 -0
- package/dist/llm/prompts/simplify-topic.d.ts +3 -0
- package/dist/llm/prompts/simplify-topic.d.ts.map +1 -0
- package/dist/llm/prompts/simplify-topic.js +50 -0
- package/dist/llm/prompts/simplify-topic.js.map +1 -0
- package/dist/llm/provider.d.ts +21 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +76 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/schemas.d.ts +97 -0
- package/dist/llm/schemas.d.ts.map +1 -0
- package/dist/llm/schemas.js +24 -0
- package/dist/llm/schemas.js.map +1 -0
- package/dist/llm/service.d.ts +30 -0
- package/dist/llm/service.d.ts.map +1 -0
- package/dist/llm/service.js +273 -0
- package/dist/llm/service.js.map +1 -0
- package/dist/memory/diff.d.ts +4 -0
- package/dist/memory/diff.d.ts.map +1 -0
- package/dist/memory/diff.js +24 -0
- package/dist/memory/diff.js.map +1 -0
- package/dist/memory/extractor.d.ts +15 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +133 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +22 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +90 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/prompts/extract-learnings.d.ts +3 -0
- package/dist/memory/prompts/extract-learnings.d.ts.map +1 -0
- package/dist/memory/prompts/extract-learnings.js +40 -0
- package/dist/memory/prompts/extract-learnings.js.map +1 -0
- package/dist/memory/schemas.d.ts +63 -0
- package/dist/memory/schemas.d.ts.map +1 -0
- package/dist/memory/schemas.js +13 -0
- package/dist/memory/schemas.js.map +1 -0
- package/dist/memory/store.d.ts +28 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +103 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +55 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/persistence/store.d.ts +21 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +77 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/persistence/types.d.ts +23 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +2 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/report/html.d.ts +6 -0
- package/dist/report/html.d.ts.map +1 -0
- package/dist/report/html.js +200 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/json.d.ts +11 -0
- package/dist/report/json.d.ts.map +1 -0
- package/dist/report/json.js +74 -0
- package/dist/report/json.js.map +1 -0
- package/dist/report/types.d.ts +58 -0
- package/dist/report/types.d.ts.map +1 -0
- package/dist/report/types.js +5 -0
- package/dist/report/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ChatPromptTemplate } from '@langchain/core/prompts';
|
|
2
|
+
export const simplifyTopicPrompt = ChatPromptTemplate.fromMessages([
|
|
3
|
+
[
|
|
4
|
+
'system',
|
|
5
|
+
`You are an expert at simplifying Prisma AIRS custom topic guardrails. Your output should be the best-performing definition with at most minor wording adjustments. Do NOT add qualifiers, specificity, or new constraints.
|
|
6
|
+
|
|
7
|
+
Constraints (MUST be respected):
|
|
8
|
+
- Name: KEEP THE EXACT SAME NAME as the current definition. Do NOT rename.
|
|
9
|
+
- Description: max 250 characters. Aim for UNDER 80 characters.
|
|
10
|
+
- Examples: 2-3 examples, each max 250 characters
|
|
11
|
+
- Combined total (name + description + all examples): max 1000 characters
|
|
12
|
+
|
|
13
|
+
CRITICAL RULES:
|
|
14
|
+
- Start from the best-performing definition. Make minimal changes.
|
|
15
|
+
- Do NOT add words like "single", "specific", "one", "only", "sole", "step-by-step"
|
|
16
|
+
- Do NOT add exclusion clauses ("not X", "excludes Y") — they INCREASE false positives
|
|
17
|
+
- SHORTER is ALWAYS better on this platform. Every word you add risks degrading performance.
|
|
18
|
+
- If the best-performing definition already works, return it nearly unchanged.
|
|
19
|
+
|
|
20
|
+
GOOD vs BAD simplification:
|
|
21
|
+
- GOOD: "Cooking recipes for specific dishes" (short, broad, 40 chars)
|
|
22
|
+
- BAD: "A single cooking recipe for one specific dish with step-by-step instructions" (long, over-qualified, 76 chars)
|
|
23
|
+
- GOOD: "Financial investment advice and strategies" (42 chars)
|
|
24
|
+
- BAD: "Requests for personalized financial investment advice specifically about stock market strategies excluding general banking" (120 chars)
|
|
25
|
+
|
|
26
|
+
Intent: {intent}
|
|
27
|
+
- "block": Keep broad enough to catch violations. Remove noise causing false positives.
|
|
28
|
+
- "allow": Keep precise. No semantic bleed into adjacent domains.
|
|
29
|
+
{memorySection}`,
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
'human',
|
|
33
|
+
`Coverage is regressing due to over-refinement. Return to the simpler definition that worked.
|
|
34
|
+
|
|
35
|
+
Best-Performing Definition (achieved {bestCoverage} coverage — START HERE):
|
|
36
|
+
- Description: {bestDescription}
|
|
37
|
+
- Examples: {bestExamples}
|
|
38
|
+
|
|
39
|
+
Current Definition (over-refined, only {coverage} coverage):
|
|
40
|
+
- Name: {currentName}
|
|
41
|
+
- Description: {currentDescription}
|
|
42
|
+
- Examples: {currentExamples}
|
|
43
|
+
|
|
44
|
+
Current Performance:
|
|
45
|
+
- TPR: {tpr}, TNR: {tnr}
|
|
46
|
+
|
|
47
|
+
Return the best-performing definition with at most minor wording tweaks. Do NOT add specificity or qualifiers. Fewer words = better performance.`,
|
|
48
|
+
],
|
|
49
|
+
]);
|
|
50
|
+
//# sourceMappingURL=simplify-topic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplify-topic.js","sourceRoot":"","sources":["../../../src/llm/prompts/simplify-topic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,YAAY,CAAC;IACjE;QACE,QAAQ;QACR;;;;;;;;;;;;;;;;;;;;;;;;gBAwBY;KACb;IACD;QACE,OAAO;QACP;;;;;;;;;;;;;;iJAc6I;KAC9I;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
|
+
import type { LlmProvider } from '../config/schema.js';
|
|
3
|
+
/** Configuration for creating an LLM provider instance. */
|
|
4
|
+
export interface LlmProviderConfig {
|
|
5
|
+
provider: LlmProvider;
|
|
6
|
+
model?: string;
|
|
7
|
+
anthropicApiKey?: string;
|
|
8
|
+
googleApiKey?: string;
|
|
9
|
+
googleCloudProject?: string;
|
|
10
|
+
googleCloudLocation?: string;
|
|
11
|
+
awsRegion?: string;
|
|
12
|
+
awsAccessKeyId?: string;
|
|
13
|
+
awsSecretAccessKey?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Factory that creates a LangChain chat model for the configured provider.
|
|
17
|
+
* @param config - Provider type, model name, and auth credentials.
|
|
18
|
+
* @returns A configured LangChain BaseChatModel instance.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createLlmProvider(config: LlmProviderConfig): Promise<BaseChatModel>;
|
|
21
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAGjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAWD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgEzF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ChatAnthropic } from '@langchain/anthropic';
|
|
2
|
+
import { ChatBedrockConverse } from '@langchain/aws';
|
|
3
|
+
import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
|
|
4
|
+
import { ChatVertexAI } from '@langchain/google-vertexai';
|
|
5
|
+
const DEFAULT_MODELS = {
|
|
6
|
+
'claude-api': 'claude-opus-4-6',
|
|
7
|
+
'claude-vertex': 'claude-opus-4-6',
|
|
8
|
+
'claude-bedrock': 'anthropic.claude-opus-4-6-v1',
|
|
9
|
+
'gemini-api': 'gemini-2.5-pro',
|
|
10
|
+
'gemini-vertex': 'gemini-2.5-pro',
|
|
11
|
+
'gemini-bedrock': 'gemini-2.5-pro',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Factory that creates a LangChain chat model for the configured provider.
|
|
15
|
+
* @param config - Provider type, model name, and auth credentials.
|
|
16
|
+
* @returns A configured LangChain BaseChatModel instance.
|
|
17
|
+
*/
|
|
18
|
+
export async function createLlmProvider(config) {
|
|
19
|
+
const modelName = config.model ?? DEFAULT_MODELS[config.provider];
|
|
20
|
+
switch (config.provider) {
|
|
21
|
+
case 'claude-api':
|
|
22
|
+
return new ChatAnthropic({
|
|
23
|
+
model: modelName,
|
|
24
|
+
anthropicApiKey: config.anthropicApiKey,
|
|
25
|
+
temperature: 0,
|
|
26
|
+
});
|
|
27
|
+
case 'claude-vertex': {
|
|
28
|
+
const { AnthropicVertex } = await import('@anthropic-ai/vertex-sdk');
|
|
29
|
+
const client = new AnthropicVertex({
|
|
30
|
+
projectId: config.googleCloudProject,
|
|
31
|
+
region: config.googleCloudLocation ?? 'global',
|
|
32
|
+
});
|
|
33
|
+
return new ChatAnthropic({
|
|
34
|
+
model: modelName,
|
|
35
|
+
temperature: 0,
|
|
36
|
+
createClient: () => client,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
case 'claude-bedrock': {
|
|
40
|
+
const opts = {
|
|
41
|
+
model: modelName,
|
|
42
|
+
region: config.awsRegion ?? 'us-east-1',
|
|
43
|
+
temperature: 0,
|
|
44
|
+
};
|
|
45
|
+
if (config.awsAccessKeyId && config.awsSecretAccessKey) {
|
|
46
|
+
opts.credentials = {
|
|
47
|
+
accessKeyId: config.awsAccessKeyId,
|
|
48
|
+
secretAccessKey: config.awsSecretAccessKey,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return new ChatBedrockConverse(opts);
|
|
52
|
+
}
|
|
53
|
+
case 'gemini-api':
|
|
54
|
+
return new ChatGoogleGenerativeAI({
|
|
55
|
+
model: modelName,
|
|
56
|
+
apiKey: config.googleApiKey,
|
|
57
|
+
temperature: 0,
|
|
58
|
+
});
|
|
59
|
+
case 'gemini-vertex':
|
|
60
|
+
return new ChatVertexAI({
|
|
61
|
+
model: modelName,
|
|
62
|
+
location: config.googleCloudLocation ?? 'us-central1',
|
|
63
|
+
temperature: 0,
|
|
64
|
+
authOptions: { projectId: config.googleCloudProject },
|
|
65
|
+
});
|
|
66
|
+
case 'gemini-bedrock':
|
|
67
|
+
return new ChatBedrockConverse({
|
|
68
|
+
model: modelName,
|
|
69
|
+
region: config.awsRegion ?? 'us-east-1',
|
|
70
|
+
temperature: 0,
|
|
71
|
+
});
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(`Unknown LLM provider: ${config.provider}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAgB1D,MAAM,cAAc,GAAgC;IAClD,YAAY,EAAE,iBAAiB;IAC/B,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,8BAA8B;IAChD,YAAY,EAAE,gBAAgB;IAC9B,eAAe,EAAE,gBAAgB;IACjC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAElE,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,OAAO,IAAI,aAAa,CAAC;gBACvB,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,WAAW,EAAE,CAAC;aACf,CAAC,CAAC;QAEL,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,kBAAkB;gBACpC,MAAM,EAAE,MAAM,CAAC,mBAAmB,IAAI,QAAQ;aAC/C,CAAC,CAAC;YACH,OAAO,IAAI,aAAa,CAAC;gBACvB,KAAK,EAAE,SAAS;gBAChB,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,IAAI,GAA4B;gBACpC,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,WAAW;gBACvC,WAAW,EAAE,CAAC;aACf,CAAC;YACF,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBACvD,IAAI,CAAC,WAAW,GAAG;oBACjB,WAAW,EAAE,MAAM,CAAC,cAAc;oBAClC,eAAe,EAAE,MAAM,CAAC,kBAAkB;iBAC3C,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,YAAY;YACf,OAAO,IAAI,sBAAsB,CAAC;gBAChC,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,MAAM,CAAC,YAAY;gBAC3B,WAAW,EAAE,CAAC;aACf,CAAC,CAAC;QAEL,KAAK,eAAe;YAClB,OAAO,IAAI,YAAY,CAAC;gBACtB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,MAAM,CAAC,mBAAmB,IAAI,aAAa;gBACrD,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,kBAAkB,EAAE;aACtD,CAAC,CAAC;QAEL,KAAK,gBAAgB;YACnB,OAAO,IAAI,mBAAmB,CAAC;gBAC7B,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,WAAW;gBACvC,WAAW,EAAE,CAAC;aACf,CAAC,CAAC;QAEL;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const CustomTopicSchema: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
description: z.ZodString;
|
|
5
|
+
examples: z.ZodArray<z.ZodString, "many">;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
description: string;
|
|
8
|
+
examples: string[];
|
|
9
|
+
name: string;
|
|
10
|
+
}, {
|
|
11
|
+
description: string;
|
|
12
|
+
examples: string[];
|
|
13
|
+
name: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const TestCaseSchema: z.ZodObject<{
|
|
16
|
+
prompt: z.ZodString;
|
|
17
|
+
expectedTriggered: z.ZodBoolean;
|
|
18
|
+
category: z.ZodString;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
prompt: string;
|
|
21
|
+
category: string;
|
|
22
|
+
expectedTriggered: boolean;
|
|
23
|
+
}, {
|
|
24
|
+
prompt: string;
|
|
25
|
+
category: string;
|
|
26
|
+
expectedTriggered: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const TestSuiteSchema: z.ZodObject<{
|
|
29
|
+
positiveTests: z.ZodArray<z.ZodObject<{
|
|
30
|
+
prompt: z.ZodString;
|
|
31
|
+
expectedTriggered: z.ZodBoolean;
|
|
32
|
+
category: z.ZodString;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
prompt: string;
|
|
35
|
+
category: string;
|
|
36
|
+
expectedTriggered: boolean;
|
|
37
|
+
}, {
|
|
38
|
+
prompt: string;
|
|
39
|
+
category: string;
|
|
40
|
+
expectedTriggered: boolean;
|
|
41
|
+
}>, "many">;
|
|
42
|
+
negativeTests: z.ZodArray<z.ZodObject<{
|
|
43
|
+
prompt: z.ZodString;
|
|
44
|
+
expectedTriggered: z.ZodBoolean;
|
|
45
|
+
category: z.ZodString;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
prompt: string;
|
|
48
|
+
category: string;
|
|
49
|
+
expectedTriggered: boolean;
|
|
50
|
+
}, {
|
|
51
|
+
prompt: string;
|
|
52
|
+
category: string;
|
|
53
|
+
expectedTriggered: boolean;
|
|
54
|
+
}>, "many">;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
positiveTests: {
|
|
57
|
+
prompt: string;
|
|
58
|
+
category: string;
|
|
59
|
+
expectedTriggered: boolean;
|
|
60
|
+
}[];
|
|
61
|
+
negativeTests: {
|
|
62
|
+
prompt: string;
|
|
63
|
+
category: string;
|
|
64
|
+
expectedTriggered: boolean;
|
|
65
|
+
}[];
|
|
66
|
+
}, {
|
|
67
|
+
positiveTests: {
|
|
68
|
+
prompt: string;
|
|
69
|
+
category: string;
|
|
70
|
+
expectedTriggered: boolean;
|
|
71
|
+
}[];
|
|
72
|
+
negativeTests: {
|
|
73
|
+
prompt: string;
|
|
74
|
+
category: string;
|
|
75
|
+
expectedTriggered: boolean;
|
|
76
|
+
}[];
|
|
77
|
+
}>;
|
|
78
|
+
export declare const AnalysisReportSchema: z.ZodObject<{
|
|
79
|
+
summary: z.ZodString;
|
|
80
|
+
falsePositivePatterns: z.ZodArray<z.ZodString, "many">;
|
|
81
|
+
falseNegativePatterns: z.ZodArray<z.ZodString, "many">;
|
|
82
|
+
suggestions: z.ZodArray<z.ZodString, "many">;
|
|
83
|
+
}, "strip", z.ZodTypeAny, {
|
|
84
|
+
summary: string;
|
|
85
|
+
falsePositivePatterns: string[];
|
|
86
|
+
falseNegativePatterns: string[];
|
|
87
|
+
suggestions: string[];
|
|
88
|
+
}, {
|
|
89
|
+
summary: string;
|
|
90
|
+
falsePositivePatterns: string[];
|
|
91
|
+
falseNegativePatterns: string[];
|
|
92
|
+
suggestions: string[];
|
|
93
|
+
}>;
|
|
94
|
+
export type CustomTopicOutput = z.infer<typeof CustomTopicSchema>;
|
|
95
|
+
export type TestSuiteOutput = z.infer<typeof TestSuiteSchema>;
|
|
96
|
+
export type AnalysisReportOutput = z.infer<typeof AnalysisReportSchema>;
|
|
97
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/llm/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAM5B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAIzB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const CustomTopicSchema = z.object({
|
|
3
|
+
name: z.string().min(1),
|
|
4
|
+
description: z.string().min(1),
|
|
5
|
+
// min(2) at LLM layer: ensures meaningful test coverage. AIRS allows fewer,
|
|
6
|
+
// but the LLM should always produce at least 2 examples for effective scanning.
|
|
7
|
+
examples: z.array(z.string().min(1)).min(2).max(5),
|
|
8
|
+
});
|
|
9
|
+
export const TestCaseSchema = z.object({
|
|
10
|
+
prompt: z.string().min(1),
|
|
11
|
+
expectedTriggered: z.boolean(),
|
|
12
|
+
category: z.string().min(1),
|
|
13
|
+
});
|
|
14
|
+
export const TestSuiteSchema = z.object({
|
|
15
|
+
positiveTests: z.array(TestCaseSchema).min(1),
|
|
16
|
+
negativeTests: z.array(TestCaseSchema).min(1),
|
|
17
|
+
});
|
|
18
|
+
export const AnalysisReportSchema = z.object({
|
|
19
|
+
summary: z.string().min(1),
|
|
20
|
+
falsePositivePatterns: z.array(z.string()),
|
|
21
|
+
falseNegativePatterns: z.array(z.string()),
|
|
22
|
+
suggestions: z.array(z.string()).min(1),
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/llm/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,gFAAgF;IAChF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1C,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
|
+
import type { LlmService } from '../core/loop.js';
|
|
3
|
+
import type { AnalysisReport, CategoryBreakdown, CustomTopic, EfficacyMetrics, TestCase, TestResult } from '../core/types.js';
|
|
4
|
+
import type { MemoryInjector } from '../memory/injector.js';
|
|
5
|
+
/**
|
|
6
|
+
* LLM service implementation using LangChain structured output.
|
|
7
|
+
* Handles topic generation, test creation, result analysis, and topic improvement
|
|
8
|
+
* with automatic retry and AIRS constraint clamping.
|
|
9
|
+
*/
|
|
10
|
+
export declare class LangChainLlmService implements LlmService {
|
|
11
|
+
private model;
|
|
12
|
+
private memoryInjector?;
|
|
13
|
+
private memorySection;
|
|
14
|
+
constructor(model: BaseChatModel, memoryInjector?: MemoryInjector | undefined);
|
|
15
|
+
loadMemory(topicDescription: string): Promise<number>;
|
|
16
|
+
generateTopic(description: string, intent: string, seeds?: string[]): Promise<CustomTopic>;
|
|
17
|
+
generateCompanionTopic(blockTopicName: string, blockDescription: string): Promise<CustomTopic>;
|
|
18
|
+
generateTests(topic: CustomTopic, intent: string, categoryBreakdown?: CategoryBreakdown[]): Promise<{
|
|
19
|
+
positiveTests: TestCase[];
|
|
20
|
+
negativeTests: TestCase[];
|
|
21
|
+
}>;
|
|
22
|
+
analyzeResults(topic: CustomTopic, results: TestResult[], metrics: EfficacyMetrics, intent: string): Promise<AnalysisReport>;
|
|
23
|
+
improveTopic(topic: CustomTopic, metrics: EfficacyMetrics, analysis: AnalysisReport, results: TestResult[], iteration: number, targetCoverage: number, intent: string, bestContext?: {
|
|
24
|
+
bestCoverage: number;
|
|
25
|
+
bestIteration: number;
|
|
26
|
+
bestTopic?: CustomTopic;
|
|
27
|
+
}): Promise<CustomTopic>;
|
|
28
|
+
simplifyTopic(currentTopic: CustomTopic, bestTopic: CustomTopic, metrics: EfficacyMetrics, _analysis: AnalysisReport, intent: string): Promise<CustomTopic>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/llm/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAUjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiD5D;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IAIlD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IAJzB,OAAO,CAAC,aAAa,CAAM;gBAGjB,KAAK,EAAE,aAAa,EACpB,cAAc,CAAC,EAAE,cAAc,YAAA;IAGnC,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA+B1F,sBAAsB,CAC1B,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,WAAW,CAAC;IA6BjB,aAAa,CACjB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,GACtC,OAAO,CAAC;QAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QAAC,aAAa,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC;IAqC9D,cAAc,CAClB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC;IAwCpB,YAAY,CAChB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,WAAW,CAAA;KAAE,GACrF,OAAO,CAAC,WAAW,CAAC;IAoEjB,aAAa,CACjB,YAAY,EAAE,WAAW,EACzB,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,cAAc,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;CA2CxB"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { byteLen, MAX_COMBINED_LENGTH, MAX_DESCRIPTION_LENGTH, MAX_EXAMPLE_LENGTH, MAX_EXAMPLES, MAX_NAME_LENGTH, validateTopic, } from '../core/constraints.js';
|
|
2
|
+
import { analyzeResultsPrompt } from './prompts/analyze-results.js';
|
|
3
|
+
import { generateCompanionPrompt } from './prompts/generate-companion.js';
|
|
4
|
+
import { generateTestsPrompt } from './prompts/generate-tests.js';
|
|
5
|
+
import { buildSeedExamplesSection, generateTopicPrompt } from './prompts/generate-topic.js';
|
|
6
|
+
import { improveTopicPrompt } from './prompts/improve-topic.js';
|
|
7
|
+
import { simplifyTopicPrompt } from './prompts/simplify-topic.js';
|
|
8
|
+
import { AnalysisReportSchema, CustomTopicSchema, TestSuiteSchema, } from './schemas.js';
|
|
9
|
+
const MAX_RETRIES = 3;
|
|
10
|
+
/** Truncate a string so its UTF-8 byte length does not exceed maxBytes. */
|
|
11
|
+
function sliceToBytes(s, maxBytes) {
|
|
12
|
+
while (Buffer.byteLength(s, 'utf8') > maxBytes) {
|
|
13
|
+
s = s.slice(0, -1);
|
|
14
|
+
}
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
17
|
+
/** Clamp topic fields to fit Prisma AIRS constraints (byte-aware, including combined limit) */
|
|
18
|
+
function clampTopic(topic) {
|
|
19
|
+
const name = sliceToBytes(topic.name, MAX_NAME_LENGTH);
|
|
20
|
+
let description = sliceToBytes(topic.description, MAX_DESCRIPTION_LENGTH);
|
|
21
|
+
const examples = topic.examples
|
|
22
|
+
.slice(0, MAX_EXAMPLES)
|
|
23
|
+
.map((e) => sliceToBytes(e, MAX_EXAMPLE_LENGTH));
|
|
24
|
+
// Enforce combined byte-length limit by dropping examples from the end, then trimming description
|
|
25
|
+
const combined = () => byteLen(name) + byteLen(description) + examples.reduce((s, e) => s + byteLen(e), 0);
|
|
26
|
+
while (combined() > MAX_COMBINED_LENGTH && examples.length > 1) {
|
|
27
|
+
examples.pop();
|
|
28
|
+
}
|
|
29
|
+
/* v8 ignore next 4 -- unreachable with current MAX constants (100+250+250=600 < 1000) */
|
|
30
|
+
if (combined() > MAX_COMBINED_LENGTH) {
|
|
31
|
+
const overflow = combined() - MAX_COMBINED_LENGTH;
|
|
32
|
+
description = sliceToBytes(description, byteLen(description) - overflow);
|
|
33
|
+
}
|
|
34
|
+
return { name, description, examples };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* LLM service implementation using LangChain structured output.
|
|
38
|
+
* Handles topic generation, test creation, result analysis, and topic improvement
|
|
39
|
+
* with automatic retry and AIRS constraint clamping.
|
|
40
|
+
*/
|
|
41
|
+
export class LangChainLlmService {
|
|
42
|
+
model;
|
|
43
|
+
memoryInjector;
|
|
44
|
+
memorySection = '';
|
|
45
|
+
constructor(model, memoryInjector) {
|
|
46
|
+
this.model = model;
|
|
47
|
+
this.memoryInjector = memoryInjector;
|
|
48
|
+
}
|
|
49
|
+
async loadMemory(topicDescription) {
|
|
50
|
+
if (!this.memoryInjector)
|
|
51
|
+
return 0;
|
|
52
|
+
this.memorySection = await this.memoryInjector.buildMemorySection(topicDescription);
|
|
53
|
+
// Count lines starting with "- [" as learning count
|
|
54
|
+
return this.memorySection.split('\n').filter((l) => l.startsWith('- [')).length;
|
|
55
|
+
}
|
|
56
|
+
async generateTopic(description, intent, seeds) {
|
|
57
|
+
const structured = this.model.withStructuredOutput(CustomTopicSchema);
|
|
58
|
+
const chain = generateTopicPrompt.pipe(structured);
|
|
59
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
60
|
+
try {
|
|
61
|
+
const raw = await chain.invoke({
|
|
62
|
+
topicDescription: description,
|
|
63
|
+
intent,
|
|
64
|
+
seedExamplesSection: buildSeedExamplesSection(seeds),
|
|
65
|
+
memorySection: this.memorySection,
|
|
66
|
+
});
|
|
67
|
+
const result = clampTopic(raw);
|
|
68
|
+
const errors = validateTopic(result);
|
|
69
|
+
if (errors.length === 0)
|
|
70
|
+
return result;
|
|
71
|
+
if (attempt === MAX_RETRIES - 1) {
|
|
72
|
+
throw new Error(`LLM output violates constraints after ${MAX_RETRIES} attempts: ${errors.map((e) => e.message).join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (attempt === MAX_RETRIES - 1)
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/* v8 ignore next */
|
|
81
|
+
throw new Error('Unreachable');
|
|
82
|
+
}
|
|
83
|
+
async generateCompanionTopic(blockTopicName, blockDescription) {
|
|
84
|
+
const structured = this.model.withStructuredOutput(CustomTopicSchema);
|
|
85
|
+
const chain = generateCompanionPrompt.pipe(structured);
|
|
86
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
87
|
+
try {
|
|
88
|
+
const raw = await chain.invoke({
|
|
89
|
+
blockTopicName,
|
|
90
|
+
blockTopicDescription: blockDescription,
|
|
91
|
+
});
|
|
92
|
+
const result = clampTopic(raw);
|
|
93
|
+
const errors = validateTopic(result);
|
|
94
|
+
if (errors.length === 0)
|
|
95
|
+
return result;
|
|
96
|
+
if (attempt === MAX_RETRIES - 1) {
|
|
97
|
+
throw new Error(`LLM output violates constraints after ${MAX_RETRIES} attempts: ${errors.map((e) => e.message).join(', ')}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (attempt === MAX_RETRIES - 1)
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/* v8 ignore next */
|
|
106
|
+
throw new Error('Unreachable');
|
|
107
|
+
}
|
|
108
|
+
async generateTests(topic, intent, categoryBreakdown) {
|
|
109
|
+
const structured = this.model.withStructuredOutput(TestSuiteSchema);
|
|
110
|
+
const chain = generateTestsPrompt.pipe(structured);
|
|
111
|
+
let categoryBreakdownSection = '';
|
|
112
|
+
if (categoryBreakdown && categoryBreakdown.length > 0) {
|
|
113
|
+
const lines = categoryBreakdown.map((c) => `- ${c.category}: ${c.fp + c.fn}/${c.total} errors (${(c.errorRate * 100).toFixed(0)}%) — ${c.fp} FP, ${c.fn} FN`);
|
|
114
|
+
categoryBreakdownSection = `\nPrevious iteration per-category error rates (generate proportionally more tests for high-error categories):\n${lines.join('\n')}\n`;
|
|
115
|
+
}
|
|
116
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
117
|
+
try {
|
|
118
|
+
const raw = await chain.invoke({
|
|
119
|
+
topicName: topic.name,
|
|
120
|
+
topicDescription: topic.description,
|
|
121
|
+
topicExamples: topic.examples.length > 0
|
|
122
|
+
? topic.examples.map((e, i) => `${i + 1}. ${e}`).join('\n')
|
|
123
|
+
: 'None (description-only mode)',
|
|
124
|
+
exampleCount: topic.examples.length,
|
|
125
|
+
intent,
|
|
126
|
+
categoryBreakdownSection,
|
|
127
|
+
memorySection: this.memorySection,
|
|
128
|
+
});
|
|
129
|
+
return raw;
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (attempt === MAX_RETRIES - 1)
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/* v8 ignore next */
|
|
137
|
+
throw new Error('Unreachable');
|
|
138
|
+
}
|
|
139
|
+
async analyzeResults(topic, results, metrics, intent) {
|
|
140
|
+
const structured = this.model.withStructuredOutput(AnalysisReportSchema);
|
|
141
|
+
const chain = analyzeResultsPrompt.pipe(structured);
|
|
142
|
+
const fps = results.filter((r) => !r.testCase.expectedTriggered && r.actualTriggered);
|
|
143
|
+
const fns = results.filter((r) => r.testCase.expectedTriggered && !r.actualTriggered);
|
|
144
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
145
|
+
try {
|
|
146
|
+
const raw = await chain.invoke({
|
|
147
|
+
topicName: topic.name,
|
|
148
|
+
topicDescription: topic.description,
|
|
149
|
+
topicExamples: topic.examples.length > 0 ? topic.examples.join(', ') : 'None (description-only)',
|
|
150
|
+
exampleCount: topic.examples.length,
|
|
151
|
+
tpr: `${(metrics.truePositiveRate * 100).toFixed(1)}%`,
|
|
152
|
+
tnr: `${(metrics.trueNegativeRate * 100).toFixed(1)}%`,
|
|
153
|
+
accuracy: `${(metrics.accuracy * 100).toFixed(1)}%`,
|
|
154
|
+
coverage: `${(metrics.coverage * 100).toFixed(1)}%`,
|
|
155
|
+
falsePositives: fps.length > 0
|
|
156
|
+
? fps.map((r) => `- "${r.testCase.prompt}" (${r.testCase.category})`).join('\n')
|
|
157
|
+
: 'None',
|
|
158
|
+
falseNegatives: fns.length > 0
|
|
159
|
+
? fns.map((r) => `- "${r.testCase.prompt}" (${r.testCase.category})`).join('\n')
|
|
160
|
+
: 'None',
|
|
161
|
+
intent,
|
|
162
|
+
memorySection: this.memorySection,
|
|
163
|
+
});
|
|
164
|
+
return raw;
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (attempt === MAX_RETRIES - 1)
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/* v8 ignore next */
|
|
172
|
+
throw new Error('Unreachable');
|
|
173
|
+
}
|
|
174
|
+
async improveTopic(topic, metrics, analysis, results, iteration, targetCoverage, intent, bestContext) {
|
|
175
|
+
const structured = this.model.withStructuredOutput(CustomTopicSchema);
|
|
176
|
+
const chain = improveTopicPrompt.pipe(structured);
|
|
177
|
+
const fps = results.filter((r) => !r.testCase.expectedTriggered && r.actualTriggered);
|
|
178
|
+
const fns = results.filter((r) => r.testCase.expectedTriggered && !r.actualTriggered);
|
|
179
|
+
// Build best-context template variables
|
|
180
|
+
const bestCoverage = bestContext
|
|
181
|
+
? `${(bestContext.bestCoverage * 100).toFixed(1)}%`
|
|
182
|
+
: `${(metrics.coverage * 100).toFixed(1)}%`;
|
|
183
|
+
const bestIteration = bestContext ? bestContext.bestIteration : iteration;
|
|
184
|
+
let bestTopicSection = '';
|
|
185
|
+
if (bestContext?.bestTopic && metrics.coverage < bestContext.bestCoverage) {
|
|
186
|
+
const bt = bestContext.bestTopic;
|
|
187
|
+
bestTopicSection = `REGRESSION WARNING: Coverage has dropped from ${(bestContext.bestCoverage * 100).toFixed(1)}% (iteration ${bestContext.bestIteration}) to ${(metrics.coverage * 100).toFixed(1)}%.
|
|
188
|
+
The best-performing definition was:
|
|
189
|
+
Description: ${bt.description}
|
|
190
|
+
Examples: ${bt.examples.join(', ')}
|
|
191
|
+
Consider reverting toward this simpler definition rather than adding more specificity.`;
|
|
192
|
+
}
|
|
193
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
194
|
+
try {
|
|
195
|
+
const raw = await chain.invoke({
|
|
196
|
+
currentName: topic.name,
|
|
197
|
+
currentDescription: topic.description,
|
|
198
|
+
currentExamples: topic.examples.length > 0 ? topic.examples.join(', ') : 'None (description-only)',
|
|
199
|
+
exampleCount: topic.examples.length,
|
|
200
|
+
iteration,
|
|
201
|
+
coverage: `${(metrics.coverage * 100).toFixed(1)}%`,
|
|
202
|
+
targetCoverage: `${(targetCoverage * 100).toFixed(1)}%`,
|
|
203
|
+
tpr: `${(metrics.truePositiveRate * 100).toFixed(1)}%`,
|
|
204
|
+
tnr: `${(metrics.trueNegativeRate * 100).toFixed(1)}%`,
|
|
205
|
+
accuracy: `${(metrics.accuracy * 100).toFixed(1)}%`,
|
|
206
|
+
bestCoverage,
|
|
207
|
+
bestIteration,
|
|
208
|
+
bestTopicSection,
|
|
209
|
+
analysisSummary: analysis.summary,
|
|
210
|
+
fpPatterns: analysis.falsePositivePatterns.join('; ') || 'None',
|
|
211
|
+
fnPatterns: analysis.falseNegativePatterns.join('; ') || 'None',
|
|
212
|
+
specificFPs: fps.map((r) => `- "${r.testCase.prompt}"`).join('\n') || 'None',
|
|
213
|
+
specificFNs: fns.map((r) => `- "${r.testCase.prompt}"`).join('\n') || 'None',
|
|
214
|
+
suggestions: analysis.suggestions.join('; '),
|
|
215
|
+
intent,
|
|
216
|
+
memorySection: this.memorySection,
|
|
217
|
+
});
|
|
218
|
+
const result = clampTopic(raw);
|
|
219
|
+
const errors = validateTopic(result);
|
|
220
|
+
if (errors.length === 0)
|
|
221
|
+
return result;
|
|
222
|
+
if (attempt === MAX_RETRIES - 1) {
|
|
223
|
+
throw new Error(`LLM output violates constraints after ${MAX_RETRIES} attempts: ${errors.map((e) => e.message).join(', ')}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
if (attempt === MAX_RETRIES - 1)
|
|
228
|
+
throw err;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/* v8 ignore next */
|
|
232
|
+
throw new Error('Unreachable');
|
|
233
|
+
}
|
|
234
|
+
async simplifyTopic(currentTopic, bestTopic, metrics, _analysis, intent) {
|
|
235
|
+
const structured = this.model.withStructuredOutput(CustomTopicSchema);
|
|
236
|
+
const chain = simplifyTopicPrompt.pipe(structured);
|
|
237
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
238
|
+
try {
|
|
239
|
+
const raw = await chain.invoke({
|
|
240
|
+
currentName: currentTopic.name,
|
|
241
|
+
currentDescription: currentTopic.description,
|
|
242
|
+
currentExamples: currentTopic.examples.length > 0
|
|
243
|
+
? currentTopic.examples.join(', ')
|
|
244
|
+
: 'None (description-only)',
|
|
245
|
+
bestCoverage: `${(metrics.coverage * 100).toFixed(1)}%`,
|
|
246
|
+
bestDescription: bestTopic.description,
|
|
247
|
+
bestExamples: bestTopic.examples.length > 0
|
|
248
|
+
? bestTopic.examples.join(', ')
|
|
249
|
+
: 'None (description-only)',
|
|
250
|
+
coverage: `${(metrics.coverage * 100).toFixed(1)}%`,
|
|
251
|
+
tpr: `${(metrics.truePositiveRate * 100).toFixed(1)}%`,
|
|
252
|
+
tnr: `${(metrics.trueNegativeRate * 100).toFixed(1)}%`,
|
|
253
|
+
intent,
|
|
254
|
+
memorySection: this.memorySection,
|
|
255
|
+
});
|
|
256
|
+
const result = clampTopic(raw);
|
|
257
|
+
const errors = validateTopic(result);
|
|
258
|
+
if (errors.length === 0)
|
|
259
|
+
return result;
|
|
260
|
+
if (attempt === MAX_RETRIES - 1) {
|
|
261
|
+
throw new Error(`LLM output violates constraints after ${MAX_RETRIES} attempts: ${errors.map((e) => e.message).join(', ')}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
if (attempt === MAX_RETRIES - 1)
|
|
266
|
+
throw err;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/* v8 ignore next */
|
|
270
|
+
throw new Error('Unreachable');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/llm/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/memory/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,GAAG,aAAa,CAwB9F"}
|