@chanl/scenarios-core 0.4.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/LICENSE +21 -0
- package/dist/__tests__/e2e/test-helpers.d.ts +79 -0
- package/dist/__tests__/e2e/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/e2e/test-helpers.js +162 -0
- package/dist/__tests__/e2e/test-helpers.js.map +1 -0
- package/dist/adapters/adapter-registry.d.ts +14 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +53 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/agent-adapter.interface.d.ts +70 -0
- package/dist/adapters/agent-adapter.interface.d.ts.map +1 -0
- package/dist/adapters/agent-adapter.interface.js +3 -0
- package/dist/adapters/agent-adapter.interface.js.map +1 -0
- package/dist/adapters/anthropic.adapter.d.ts +17 -0
- package/dist/adapters/anthropic.adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic.adapter.js +145 -0
- package/dist/adapters/anthropic.adapter.js.map +1 -0
- package/dist/adapters/http.adapter.d.ts +17 -0
- package/dist/adapters/http.adapter.d.ts.map +1 -0
- package/dist/adapters/http.adapter.js +95 -0
- package/dist/adapters/http.adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +22 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openai.adapter.d.ts +17 -0
- package/dist/adapters/openai.adapter.d.ts.map +1 -0
- package/dist/adapters/openai.adapter.js +133 -0
- package/dist/adapters/openai.adapter.js.map +1 -0
- package/dist/dataset/convert.d.ts +28 -0
- package/dist/dataset/convert.d.ts.map +1 -0
- package/dist/dataset/convert.js +94 -0
- package/dist/dataset/convert.js.map +1 -0
- package/dist/dataset/formats/dpo.d.ts +41 -0
- package/dist/dataset/formats/dpo.d.ts.map +1 -0
- package/dist/dataset/formats/dpo.js +79 -0
- package/dist/dataset/formats/dpo.js.map +1 -0
- package/dist/dataset/formats/index.d.ts +4 -0
- package/dist/dataset/formats/index.d.ts.map +1 -0
- package/dist/dataset/formats/index.js +13 -0
- package/dist/dataset/formats/index.js.map +1 -0
- package/dist/dataset/formats/openai.d.ts +29 -0
- package/dist/dataset/formats/openai.d.ts.map +1 -0
- package/dist/dataset/formats/openai.js +98 -0
- package/dist/dataset/formats/openai.js.map +1 -0
- package/dist/dataset/formats/sharegpt.d.ts +31 -0
- package/dist/dataset/formats/sharegpt.d.ts.map +1 -0
- package/dist/dataset/formats/sharegpt.js +76 -0
- package/dist/dataset/formats/sharegpt.js.map +1 -0
- package/dist/dataset/index.d.ts +4 -0
- package/dist/dataset/index.d.ts.map +1 -0
- package/dist/dataset/index.js +20 -0
- package/dist/dataset/index.js.map +1 -0
- package/dist/dataset/types.d.ts +108 -0
- package/dist/dataset/types.d.ts.map +1 -0
- package/dist/dataset/types.js +7 -0
- package/dist/dataset/types.js.map +1 -0
- package/dist/execution/agent-config-resolver.d.ts +44 -0
- package/dist/execution/agent-config-resolver.d.ts.map +1 -0
- package/dist/execution/agent-config-resolver.js +76 -0
- package/dist/execution/agent-config-resolver.js.map +1 -0
- package/dist/execution/execution-processor.d.ts +75 -0
- package/dist/execution/execution-processor.d.ts.map +1 -0
- package/dist/execution/execution-processor.js +569 -0
- package/dist/execution/execution-processor.js.map +1 -0
- package/dist/execution/execution.module.d.ts +3 -0
- package/dist/execution/execution.module.d.ts.map +1 -0
- package/dist/execution/execution.module.js +56 -0
- package/dist/execution/execution.module.js.map +1 -0
- package/dist/execution/execution.service.d.ts +52 -0
- package/dist/execution/execution.service.d.ts.map +1 -0
- package/dist/execution/execution.service.js +182 -0
- package/dist/execution/execution.service.js.map +1 -0
- package/dist/execution/index.d.ts +11 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +30 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/interfaces/job-data.interface.d.ts +38 -0
- package/dist/execution/interfaces/job-data.interface.d.ts.map +1 -0
- package/dist/execution/interfaces/job-data.interface.js +3 -0
- package/dist/execution/interfaces/job-data.interface.js.map +1 -0
- package/dist/execution/judge-llm.d.ts +35 -0
- package/dist/execution/judge-llm.d.ts.map +1 -0
- package/dist/execution/judge-llm.js +129 -0
- package/dist/execution/judge-llm.js.map +1 -0
- package/dist/execution/llm-config-resolver.d.ts +26 -0
- package/dist/execution/llm-config-resolver.d.ts.map +1 -0
- package/dist/execution/llm-config-resolver.js +99 -0
- package/dist/execution/llm-config-resolver.js.map +1 -0
- package/dist/execution/persona-llm.d.ts +29 -0
- package/dist/execution/persona-llm.d.ts.map +1 -0
- package/dist/execution/persona-llm.js +98 -0
- package/dist/execution/persona-llm.js.map +1 -0
- package/dist/execution/persona-strategy-registry.d.ts +14 -0
- package/dist/execution/persona-strategy-registry.d.ts.map +1 -0
- package/dist/execution/persona-strategy-registry.js +51 -0
- package/dist/execution/persona-strategy-registry.js.map +1 -0
- package/dist/execution/persona-strategy.interface.d.ts +88 -0
- package/dist/execution/persona-strategy.interface.d.ts.map +1 -0
- package/dist/execution/persona-strategy.interface.js +3 -0
- package/dist/execution/persona-strategy.interface.js.map +1 -0
- package/dist/execution/queue-producer.service.d.ts +21 -0
- package/dist/execution/queue-producer.service.d.ts.map +1 -0
- package/dist/execution/queue-producer.service.js +60 -0
- package/dist/execution/queue-producer.service.js.map +1 -0
- package/dist/execution/queues.config.d.ts +39 -0
- package/dist/execution/queues.config.d.ts.map +1 -0
- package/dist/execution/queues.config.js +43 -0
- package/dist/execution/queues.config.js.map +1 -0
- package/dist/execution/strategies/default.strategy.d.ts +11 -0
- package/dist/execution/strategies/default.strategy.d.ts.map +1 -0
- package/dist/execution/strategies/default.strategy.js +31 -0
- package/dist/execution/strategies/default.strategy.js.map +1 -0
- package/dist/execution/strategies/reactive.strategy.d.ts +28 -0
- package/dist/execution/strategies/reactive.strategy.d.ts.map +1 -0
- package/dist/execution/strategies/reactive.strategy.js +220 -0
- package/dist/execution/strategies/reactive.strategy.js.map +1 -0
- package/dist/execution/template-renderer.d.ts +52 -0
- package/dist/execution/template-renderer.d.ts.map +1 -0
- package/dist/execution/template-renderer.js +90 -0
- package/dist/execution/template-renderer.js.map +1 -0
- package/dist/generation/index.d.ts +2 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +6 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/generation/scenario-generator.service.d.ts +77 -0
- package/dist/generation/scenario-generator.service.d.ts.map +1 -0
- package/dist/generation/scenario-generator.service.js +272 -0
- package/dist/generation/scenario-generator.service.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/personas/dto/create-persona.dto.d.ts +61 -0
- package/dist/personas/dto/create-persona.dto.d.ts.map +1 -0
- package/dist/personas/dto/create-persona.dto.js +146 -0
- package/dist/personas/dto/create-persona.dto.js.map +1 -0
- package/dist/personas/dto/index.d.ts +3 -0
- package/dist/personas/dto/index.d.ts.map +1 -0
- package/dist/personas/dto/index.js +19 -0
- package/dist/personas/dto/index.js.map +1 -0
- package/dist/personas/dto/update-persona.dto.d.ts +8 -0
- package/dist/personas/dto/update-persona.dto.d.ts.map +1 -0
- package/dist/personas/dto/update-persona.dto.js +29 -0
- package/dist/personas/dto/update-persona.dto.js.map +1 -0
- package/dist/personas/index.d.ts +6 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +22 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/persona.controller.d.ts +69 -0
- package/dist/personas/persona.controller.d.ts.map +1 -0
- package/dist/personas/persona.controller.js +282 -0
- package/dist/personas/persona.controller.js.map +1 -0
- package/dist/personas/persona.module.d.ts +3 -0
- package/dist/personas/persona.module.d.ts.map +1 -0
- package/dist/personas/persona.module.js +28 -0
- package/dist/personas/persona.module.js.map +1 -0
- package/dist/personas/persona.service.d.ts +85 -0
- package/dist/personas/persona.service.d.ts.map +1 -0
- package/dist/personas/persona.service.js +382 -0
- package/dist/personas/persona.service.js.map +1 -0
- package/dist/personas/schemas/persona.schema.d.ts +90 -0
- package/dist/personas/schemas/persona.schema.d.ts.map +1 -0
- package/dist/personas/schemas/persona.schema.js +321 -0
- package/dist/personas/schemas/persona.schema.js.map +1 -0
- package/dist/scenarios/controllers/scenario-execution.controller.d.ts +48 -0
- package/dist/scenarios/controllers/scenario-execution.controller.d.ts.map +1 -0
- package/dist/scenarios/controllers/scenario-execution.controller.js +260 -0
- package/dist/scenarios/controllers/scenario-execution.controller.js.map +1 -0
- package/dist/scenarios/controllers/scenario.controller.d.ts +81 -0
- package/dist/scenarios/controllers/scenario.controller.d.ts.map +1 -0
- package/dist/scenarios/controllers/scenario.controller.js +345 -0
- package/dist/scenarios/controllers/scenario.controller.js.map +1 -0
- package/dist/scenarios/dto/create-scenario.dto.d.ts +31 -0
- package/dist/scenarios/dto/create-scenario.dto.d.ts.map +1 -0
- package/dist/scenarios/dto/create-scenario.dto.js +102 -0
- package/dist/scenarios/dto/create-scenario.dto.js.map +1 -0
- package/dist/scenarios/dto/execute-scenario.dto.d.ts +34 -0
- package/dist/scenarios/dto/execute-scenario.dto.d.ts.map +1 -0
- package/dist/scenarios/dto/execute-scenario.dto.js +150 -0
- package/dist/scenarios/dto/execute-scenario.dto.js.map +1 -0
- package/dist/scenarios/dto/index.d.ts +4 -0
- package/dist/scenarios/dto/index.d.ts.map +1 -0
- package/dist/scenarios/dto/index.js +20 -0
- package/dist/scenarios/dto/index.js.map +1 -0
- package/dist/scenarios/dto/update-scenario.dto.d.ts +6 -0
- package/dist/scenarios/dto/update-scenario.dto.d.ts.map +1 -0
- package/dist/scenarios/dto/update-scenario.dto.js +9 -0
- package/dist/scenarios/dto/update-scenario.dto.js.map +1 -0
- package/dist/scenarios/index.d.ts +9 -0
- package/dist/scenarios/index.d.ts.map +1 -0
- package/dist/scenarios/index.js +25 -0
- package/dist/scenarios/index.js.map +1 -0
- package/dist/scenarios/scenario.module.d.ts +3 -0
- package/dist/scenarios/scenario.module.d.ts.map +1 -0
- package/dist/scenarios/scenario.module.js +42 -0
- package/dist/scenarios/scenario.module.js.map +1 -0
- package/dist/scenarios/schemas/scenario-execution.schema.d.ts +133 -0
- package/dist/scenarios/schemas/scenario-execution.schema.d.ts.map +1 -0
- package/dist/scenarios/schemas/scenario-execution.schema.js +292 -0
- package/dist/scenarios/schemas/scenario-execution.schema.js.map +1 -0
- package/dist/scenarios/schemas/scenario.schema.d.ts +106 -0
- package/dist/scenarios/schemas/scenario.schema.d.ts.map +1 -0
- package/dist/scenarios/schemas/scenario.schema.js +205 -0
- package/dist/scenarios/schemas/scenario.schema.js.map +1 -0
- package/dist/scenarios/services/scenario-execution.service.d.ts +73 -0
- package/dist/scenarios/services/scenario-execution.service.d.ts.map +1 -0
- package/dist/scenarios/services/scenario-execution.service.js +505 -0
- package/dist/scenarios/services/scenario-execution.service.js.map +1 -0
- package/dist/scenarios/services/scenario.service.d.ts +110 -0
- package/dist/scenarios/services/scenario.service.d.ts.map +1 -0
- package/dist/scenarios/services/scenario.service.js +608 -0
- package/dist/scenarios/services/scenario.service.js.map +1 -0
- package/dist/simulator/index.d.ts +2 -0
- package/dist/simulator/index.d.ts.map +1 -0
- package/dist/simulator/index.js +18 -0
- package/dist/simulator/index.js.map +1 -0
- package/dist/simulator/persona-simulator.service.d.ts +81 -0
- package/dist/simulator/persona-simulator.service.d.ts.map +1 -0
- package/dist/simulator/persona-simulator.service.js +358 -0
- package/dist/simulator/persona-simulator.service.js.map +1 -0
- package/dist/templates/dto/create-template.dto.d.ts +16 -0
- package/dist/templates/dto/create-template.dto.d.ts.map +1 -0
- package/dist/templates/dto/create-template.dto.js +75 -0
- package/dist/templates/dto/create-template.dto.js.map +1 -0
- package/dist/templates/dto/index.d.ts +4 -0
- package/dist/templates/dto/index.d.ts.map +1 -0
- package/dist/templates/dto/index.js +10 -0
- package/dist/templates/dto/index.js.map +1 -0
- package/dist/templates/dto/instantiate-template.dto.d.ts +7 -0
- package/dist/templates/dto/instantiate-template.dto.d.ts.map +1 -0
- package/dist/templates/dto/instantiate-template.dto.js +38 -0
- package/dist/templates/dto/instantiate-template.dto.js.map +1 -0
- package/dist/templates/dto/update-template.dto.d.ts +6 -0
- package/dist/templates/dto/update-template.dto.d.ts.map +1 -0
- package/dist/templates/dto/update-template.dto.js +9 -0
- package/dist/templates/dto/update-template.dto.js.map +1 -0
- package/dist/templates/index.d.ts +6 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +22 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/scenario-template.controller.d.ts +42 -0
- package/dist/templates/scenario-template.controller.d.ts.map +1 -0
- package/dist/templates/scenario-template.controller.js +148 -0
- package/dist/templates/scenario-template.controller.js.map +1 -0
- package/dist/templates/scenario-template.module.d.ts +3 -0
- package/dist/templates/scenario-template.module.d.ts.map +1 -0
- package/dist/templates/scenario-template.module.js +30 -0
- package/dist/templates/scenario-template.module.js.map +1 -0
- package/dist/templates/scenario-template.service.d.ts +50 -0
- package/dist/templates/scenario-template.service.d.ts.map +1 -0
- package/dist/templates/scenario-template.service.js +497 -0
- package/dist/templates/scenario-template.service.js.map +1 -0
- package/dist/templates/schemas/scenario-template.schema.d.ts +59 -0
- package/dist/templates/schemas/scenario-template.schema.d.ts.map +1 -0
- package/dist/templates/schemas/scenario-template.schema.js +132 -0
- package/dist/templates/schemas/scenario-template.schema.js.map +1 -0
- package/dist/tool-fixtures/dto/create-tool-fixture.dto.d.ts +18 -0
- package/dist/tool-fixtures/dto/create-tool-fixture.dto.d.ts.map +1 -0
- package/dist/tool-fixtures/dto/create-tool-fixture.dto.js +46 -0
- package/dist/tool-fixtures/dto/create-tool-fixture.dto.js.map +1 -0
- package/dist/tool-fixtures/dto/index.d.ts +4 -0
- package/dist/tool-fixtures/dto/index.d.ts.map +1 -0
- package/dist/tool-fixtures/dto/index.js +20 -0
- package/dist/tool-fixtures/dto/index.js.map +1 -0
- package/dist/tool-fixtures/dto/tool-fixture-filter.dto.d.ts +6 -0
- package/dist/tool-fixtures/dto/tool-fixture-filter.dto.d.ts.map +1 -0
- package/dist/tool-fixtures/dto/tool-fixture-filter.dto.js +33 -0
- package/dist/tool-fixtures/dto/tool-fixture-filter.dto.js.map +1 -0
- package/dist/tool-fixtures/dto/update-tool-fixture.dto.d.ts +6 -0
- package/dist/tool-fixtures/dto/update-tool-fixture.dto.d.ts.map +1 -0
- package/dist/tool-fixtures/dto/update-tool-fixture.dto.js +9 -0
- package/dist/tool-fixtures/dto/update-tool-fixture.dto.js.map +1 -0
- package/dist/tool-fixtures/index.d.ts +7 -0
- package/dist/tool-fixtures/index.d.ts.map +1 -0
- package/dist/tool-fixtures/index.js +23 -0
- package/dist/tool-fixtures/index.js.map +1 -0
- package/dist/tool-fixtures/mock-resolver.service.d.ts +48 -0
- package/dist/tool-fixtures/mock-resolver.service.d.ts.map +1 -0
- package/dist/tool-fixtures/mock-resolver.service.js +99 -0
- package/dist/tool-fixtures/mock-resolver.service.js.map +1 -0
- package/dist/tool-fixtures/schemas/tool-fixture.schema.d.ts +35 -0
- package/dist/tool-fixtures/schemas/tool-fixture.schema.d.ts.map +1 -0
- package/dist/tool-fixtures/schemas/tool-fixture.schema.js +87 -0
- package/dist/tool-fixtures/schemas/tool-fixture.schema.js.map +1 -0
- package/dist/tool-fixtures/tool-fixture.controller.d.ts +45 -0
- package/dist/tool-fixtures/tool-fixture.controller.d.ts.map +1 -0
- package/dist/tool-fixtures/tool-fixture.controller.js +223 -0
- package/dist/tool-fixtures/tool-fixture.controller.js.map +1 -0
- package/dist/tool-fixtures/tool-fixture.module.d.ts +3 -0
- package/dist/tool-fixtures/tool-fixture.module.d.ts.map +1 -0
- package/dist/tool-fixtures/tool-fixture.module.js +31 -0
- package/dist/tool-fixtures/tool-fixture.module.js.map +1 -0
- package/dist/tool-fixtures/tool-fixture.service.d.ts +59 -0
- package/dist/tool-fixtures/tool-fixture.service.d.ts.map +1 -0
- package/dist/tool-fixtures/tool-fixture.service.js +198 -0
- package/dist/tool-fixtures/tool-fixture.service.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultPersonaStrategy = void 0;
|
|
4
|
+
const persona_llm_1 = require("../persona-llm");
|
|
5
|
+
/**
|
|
6
|
+
* Default persona strategy — wraps the existing persona-llm.ts behavior.
|
|
7
|
+
* No internal tools, no dynamic prompt mutation. Backward compatible.
|
|
8
|
+
*/
|
|
9
|
+
class DefaultPersonaStrategy {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.type = 'default';
|
|
12
|
+
}
|
|
13
|
+
async generateOpening(ctx) {
|
|
14
|
+
return (0, persona_llm_1.generatePersonaOpening)({
|
|
15
|
+
personaSystemPrompt: ctx.systemPrompt,
|
|
16
|
+
scenarioPrompt: ctx.scenarioPrompt,
|
|
17
|
+
adapterType: ctx.adapterType,
|
|
18
|
+
adapterConfig: ctx.adapterConfig,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async generateUtterance(ctx) {
|
|
22
|
+
return (0, persona_llm_1.generatePersonaUtterance)({
|
|
23
|
+
personaSystemPrompt: ctx.systemPrompt,
|
|
24
|
+
history: ctx.history,
|
|
25
|
+
adapterType: ctx.adapterType,
|
|
26
|
+
adapterConfig: ctx.adapterConfig,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DefaultPersonaStrategy = DefaultPersonaStrategy;
|
|
31
|
+
//# sourceMappingURL=default.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.strategy.js","sourceRoot":"","sources":["../../../src/execution/strategies/default.strategy.ts"],"names":[],"mappings":";;;AAIA,gDAGwB;AAExB;;;GAGG;AACH,MAAa,sBAAsB;IAAnC;QACW,SAAI,GAAG,SAAS,CAAC;IAmB5B,CAAC;IAjBC,KAAK,CAAC,eAAe,CAAC,GAA2B;QAC/C,OAAO,IAAA,oCAAsB,EAAC;YAC5B,mBAAmB,EAAE,GAAG,CAAC,YAAY;YACrC,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAA2B;QACjD,OAAO,IAAA,sCAAwB,EAAC;YAC9B,mBAAmB,EAAE,GAAG,CAAC,YAAY;YACrC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC,CAAC;IACL,CAAC;CACF;AApBD,wDAoBC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PersonaStrategy, PersonaStrategyContext, PersonaToolDefinition } from '../persona-strategy.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Reactive persona strategy — tool-augmented persona that reasons about
|
|
4
|
+
* the agent's behavior before generating its visible response.
|
|
5
|
+
*
|
|
6
|
+
* How it works:
|
|
7
|
+
* 1. Persona LLM receives internal tools + conversation history
|
|
8
|
+
* 2. LLM calls tools (e.g., analyze_response → "dismissive") as chain-of-thought
|
|
9
|
+
* 3. Tool results feed back as tool_result messages
|
|
10
|
+
* 4. LLM generates final customer-facing response informed by its analysis
|
|
11
|
+
* 5. Max 3 tool call iterations per turn to bound cost
|
|
12
|
+
*/
|
|
13
|
+
export declare class ReactivePersonaStrategy implements PersonaStrategy {
|
|
14
|
+
readonly type = "reactive";
|
|
15
|
+
getInternalTools(): PersonaToolDefinition[];
|
|
16
|
+
generateOpening(ctx: PersonaStrategyContext): Promise<string | null>;
|
|
17
|
+
generateUtterance(ctx: PersonaStrategyContext): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Call persona LLM with internal tools using the adapter's native tool_use support.
|
|
20
|
+
* Uses buildToolCallHistory + formatToolResult for proper tool role messages.
|
|
21
|
+
*/
|
|
22
|
+
private callPersonaLlmWithTools;
|
|
23
|
+
/**
|
|
24
|
+
* Simple LLM call without tools (for opening messages).
|
|
25
|
+
*/
|
|
26
|
+
private callPersonaLlm;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reactive.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.strategy.d.ts","sourceRoot":"","sources":["../../../src/execution/strategies/reactive.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AAuHvC;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,cAAc;IAE3B,gBAAgB,IAAI,qBAAqB,EAAE;IAIrC,eAAe,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKpE,iBAAiB,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5E;;;OAGG;YACW,uBAAuB;IA0DrC;;OAEG;YACW,cAAc;CA8B7B"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReactivePersonaStrategy = void 0;
|
|
4
|
+
const persona_llm_1 = require("../persona-llm");
|
|
5
|
+
const openai_adapter_1 = require("../../adapters/openai.adapter");
|
|
6
|
+
const anthropic_adapter_1 = require("../../adapters/anthropic.adapter");
|
|
7
|
+
/**
|
|
8
|
+
* Maximum number of internal tool call iterations per turn.
|
|
9
|
+
* Keeps cost bounded (~$0.001-0.005 per tool call).
|
|
10
|
+
*/
|
|
11
|
+
const MAX_TOOL_ITERATIONS = 3;
|
|
12
|
+
const USER_TURN = 'Respond as the customer with your next message only. Stay in character. Keep it to one or two short sentences. No role labels or quotes.';
|
|
13
|
+
/**
|
|
14
|
+
* Internal persona tools — self-reflective structured output.
|
|
15
|
+
* The LLM fills in the tool arguments as chain-of-thought reasoning
|
|
16
|
+
* about the agent's behavior before generating its visible response.
|
|
17
|
+
*/
|
|
18
|
+
const PERSONA_TOOLS = [
|
|
19
|
+
{
|
|
20
|
+
name: 'analyze_response',
|
|
21
|
+
description: 'Analyze the agent\'s last response to determine if it addressed your concern and decide your emotional reaction.',
|
|
22
|
+
parameters: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
assessment: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
enum: ['helpful', 'unhelpful', 'confusing', 'dismissive', 'promising', 'evasive'],
|
|
28
|
+
description: 'How well the agent addressed your concern',
|
|
29
|
+
},
|
|
30
|
+
emotional_reaction: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'How you feel about this response (e.g., grateful, frustrated, skeptical, impatient)',
|
|
33
|
+
},
|
|
34
|
+
key_quote: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'The most relevant quote from the agent\'s response',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
required: ['assessment', 'emotional_reaction'],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'assess_progress',
|
|
44
|
+
description: 'Evaluate whether this conversation is making progress toward resolving your issue.',
|
|
45
|
+
parameters: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
progress_percentage: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: 'How close you are to resolution (0-100)',
|
|
51
|
+
},
|
|
52
|
+
next_action: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
enum: ['continue_cooperatively', 'push_harder', 'accept_offer', 'threaten_to_leave', 'request_supervisor'],
|
|
55
|
+
description: 'What you should do next',
|
|
56
|
+
},
|
|
57
|
+
turns_until_impatient: {
|
|
58
|
+
type: 'number',
|
|
59
|
+
description: 'How many more turns before you escalate or give up',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['progress_percentage', 'next_action'],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'escalate_pressure',
|
|
67
|
+
description: 'When the agent is not making progress, decide how to escalate your frustration or demand.',
|
|
68
|
+
parameters: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
escalation_level: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
enum: ['restate_firmly', 'express_disappointment', 'threaten_escalation', 'demand_supervisor', 'threaten_to_leave'],
|
|
74
|
+
description: 'How aggressively to escalate',
|
|
75
|
+
},
|
|
76
|
+
reason: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Why you are escalating now',
|
|
79
|
+
},
|
|
80
|
+
new_demand: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'What you are now demanding (may be higher than before)',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
required: ['escalation_level', 'reason'],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'detect_vulnerability',
|
|
90
|
+
description: 'Identify if the agent made a mistake, admission, or offered something you can use to negotiate.',
|
|
91
|
+
parameters: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
vulnerability_type: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
enum: ['price_room', 'policy_exception', 'authority_limitation', 'admission_of_fault', 'none'],
|
|
97
|
+
description: 'Type of vulnerability detected',
|
|
98
|
+
},
|
|
99
|
+
quote: {
|
|
100
|
+
type: 'string',
|
|
101
|
+
description: 'The exact agent quote that reveals the vulnerability',
|
|
102
|
+
},
|
|
103
|
+
exploit_strategy: {
|
|
104
|
+
type: 'string',
|
|
105
|
+
description: 'How to use this to negotiate a better outcome',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
required: ['vulnerability_type'],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
/**
|
|
113
|
+
* Reactive persona strategy — tool-augmented persona that reasons about
|
|
114
|
+
* the agent's behavior before generating its visible response.
|
|
115
|
+
*
|
|
116
|
+
* How it works:
|
|
117
|
+
* 1. Persona LLM receives internal tools + conversation history
|
|
118
|
+
* 2. LLM calls tools (e.g., analyze_response → "dismissive") as chain-of-thought
|
|
119
|
+
* 3. Tool results feed back as tool_result messages
|
|
120
|
+
* 4. LLM generates final customer-facing response informed by its analysis
|
|
121
|
+
* 5. Max 3 tool call iterations per turn to bound cost
|
|
122
|
+
*/
|
|
123
|
+
class ReactivePersonaStrategy {
|
|
124
|
+
constructor() {
|
|
125
|
+
this.type = 'reactive';
|
|
126
|
+
}
|
|
127
|
+
getInternalTools() {
|
|
128
|
+
return PERSONA_TOOLS;
|
|
129
|
+
}
|
|
130
|
+
async generateOpening(ctx) {
|
|
131
|
+
// Opening doesn't need reactive tools — just generate normally
|
|
132
|
+
return this.callPersonaLlm(ctx, `Situation: ${ctx.scenarioPrompt}\n\nYou are starting the conversation as this customer. Say your opening line only — one or two short sentences.`, []);
|
|
133
|
+
}
|
|
134
|
+
async generateUtterance(ctx) {
|
|
135
|
+
return this.callPersonaLlmWithTools(ctx);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Call persona LLM with internal tools using the adapter's native tool_use support.
|
|
139
|
+
* Uses buildToolCallHistory + formatToolResult for proper tool role messages.
|
|
140
|
+
*/
|
|
141
|
+
async callPersonaLlmWithTools(ctx) {
|
|
142
|
+
const resolved = (0, persona_llm_1.resolvePersonaLlmKey)(ctx.adapterType, ctx.adapterConfig);
|
|
143
|
+
if (!resolved)
|
|
144
|
+
return null;
|
|
145
|
+
try {
|
|
146
|
+
const adapter = resolved.kind === 'openai' ? new openai_adapter_1.OpenAIAdapter() : new anthropic_adapter_1.AnthropicAdapter();
|
|
147
|
+
const model = resolved.kind === 'openai'
|
|
148
|
+
? (resolved.model || 'gpt-4o-mini')
|
|
149
|
+
: (resolved.model || 'claude-3-5-haiku-20241022');
|
|
150
|
+
await adapter.connect({
|
|
151
|
+
apiKey: resolved.apiKey,
|
|
152
|
+
model,
|
|
153
|
+
temperature: 0.85,
|
|
154
|
+
maxTokens: 512,
|
|
155
|
+
systemPrompt: ctx.systemPrompt,
|
|
156
|
+
tools: PERSONA_TOOLS.map((t) => ({
|
|
157
|
+
name: t.name,
|
|
158
|
+
description: t.description,
|
|
159
|
+
parameters: t.parameters,
|
|
160
|
+
})),
|
|
161
|
+
});
|
|
162
|
+
const history = [...ctx.history];
|
|
163
|
+
let response = await adapter.sendMessage(USER_TURN, history);
|
|
164
|
+
// Tool call loop: persona reasons about agent behavior via tool_use
|
|
165
|
+
let iterations = 0;
|
|
166
|
+
while (response.toolCalls?.length && iterations < MAX_TOOL_ITERATIONS) {
|
|
167
|
+
iterations++;
|
|
168
|
+
// Build tool results — for self-reflective tools, the "result" is just
|
|
169
|
+
// an acknowledgment. The reasoning is in the tool call arguments themselves.
|
|
170
|
+
const resolvedResults = response.toolCalls.map((tc) => ({
|
|
171
|
+
id: tc.id,
|
|
172
|
+
name: tc.name,
|
|
173
|
+
result: `Analysis recorded: ${tc.name}. Use this insight for your response.`,
|
|
174
|
+
}));
|
|
175
|
+
// Use adapter's native tool call history builder (handles role: 'tool',
|
|
176
|
+
// tool_call_id, providerData — the same pattern used by the agent adapter)
|
|
177
|
+
const historyMessages = adapter.buildToolCallHistory(response, resolvedResults);
|
|
178
|
+
history.push(...historyMessages);
|
|
179
|
+
// Call LLM again — it now has tool results and can generate the text response
|
|
180
|
+
response = await adapter.sendMessage('', history);
|
|
181
|
+
}
|
|
182
|
+
await adapter.disconnect();
|
|
183
|
+
const text = (response.content || '').trim();
|
|
184
|
+
return text.length > 0 ? text : null;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Simple LLM call without tools (for opening messages).
|
|
192
|
+
*/
|
|
193
|
+
async callPersonaLlm(ctx, message, history) {
|
|
194
|
+
const resolved = (0, persona_llm_1.resolvePersonaLlmKey)(ctx.adapterType, ctx.adapterConfig);
|
|
195
|
+
if (!resolved)
|
|
196
|
+
return null;
|
|
197
|
+
try {
|
|
198
|
+
const adapter = resolved.kind === 'openai' ? new openai_adapter_1.OpenAIAdapter() : new anthropic_adapter_1.AnthropicAdapter();
|
|
199
|
+
const model = resolved.kind === 'openai'
|
|
200
|
+
? (resolved.model || 'gpt-4o-mini')
|
|
201
|
+
: (resolved.model || 'claude-3-5-haiku-20241022');
|
|
202
|
+
await adapter.connect({
|
|
203
|
+
apiKey: resolved.apiKey,
|
|
204
|
+
model,
|
|
205
|
+
temperature: 0.8,
|
|
206
|
+
maxTokens: 200,
|
|
207
|
+
systemPrompt: ctx.systemPrompt,
|
|
208
|
+
});
|
|
209
|
+
const res = await adapter.sendMessage(message, history);
|
|
210
|
+
await adapter.disconnect();
|
|
211
|
+
const text = (res.content || '').trim();
|
|
212
|
+
return text.length > 0 ? text : null;
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.ReactivePersonaStrategy = ReactivePersonaStrategy;
|
|
220
|
+
//# sourceMappingURL=reactive.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.strategy.js","sourceRoot":"","sources":["../../../src/execution/strategies/reactive.strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PersonaTraits } from '../simulator/persona-simulator.service';
|
|
2
|
+
/**
|
|
3
|
+
* Variable context available in Liquid persona templates.
|
|
4
|
+
*
|
|
5
|
+
* OSS version provides: persona.*, scenario.*, and custom promptVariables.
|
|
6
|
+
* chanl cloud extends with: derived.*, behavior.*, conversationTraits.*,
|
|
7
|
+
* and runtime variable overrides.
|
|
8
|
+
*/
|
|
9
|
+
export interface TemplateVariables {
|
|
10
|
+
persona: {
|
|
11
|
+
name: string;
|
|
12
|
+
emotion: string;
|
|
13
|
+
speechStyle: string;
|
|
14
|
+
intentClarity: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
backstory?: string;
|
|
17
|
+
gender?: string;
|
|
18
|
+
language?: string;
|
|
19
|
+
accent?: string;
|
|
20
|
+
[key: string]: string | undefined;
|
|
21
|
+
};
|
|
22
|
+
scenario: {
|
|
23
|
+
prompt: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
category?: string;
|
|
27
|
+
difficulty?: string;
|
|
28
|
+
[key: string]: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the variable context for Liquid template rendering.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildTemplateVariables(persona: PersonaTraits, scenarioPrompt: string, scenarioMeta?: {
|
|
36
|
+
name?: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
category?: string;
|
|
39
|
+
difficulty?: string;
|
|
40
|
+
promptVariables?: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
defaultValue: string;
|
|
43
|
+
}>;
|
|
44
|
+
}): TemplateVariables;
|
|
45
|
+
/**
|
|
46
|
+
* Render a Liquid template with persona + scenario variables.
|
|
47
|
+
*
|
|
48
|
+
* Returns the rendered string, or null if rendering fails (with a warning).
|
|
49
|
+
* Callers should fall back to the code-generated prompt on null.
|
|
50
|
+
*/
|
|
51
|
+
export declare function renderPersonaTemplate(template: string, variables: TemplateVariables): Promise<string | null>;
|
|
52
|
+
//# sourceMappingURL=template-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-renderer.d.ts","sourceRoot":"","sources":["../../src/execution/template-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AASvE;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,GACA,iBAAiB,CAkDnB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildTemplateVariables = buildTemplateVariables;
|
|
4
|
+
exports.renderPersonaTemplate = renderPersonaTemplate;
|
|
5
|
+
const liquidjs_1 = require("liquidjs");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const logger = new common_1.Logger('TemplateRenderer');
|
|
8
|
+
const liquid = new liquidjs_1.Liquid({
|
|
9
|
+
strictVariables: false,
|
|
10
|
+
strictFilters: false,
|
|
11
|
+
lenientIf: true,
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Build the variable context for Liquid template rendering.
|
|
15
|
+
*/
|
|
16
|
+
function buildTemplateVariables(persona, scenarioPrompt, scenarioMeta) {
|
|
17
|
+
const vars = {
|
|
18
|
+
persona: {
|
|
19
|
+
name: persona.name,
|
|
20
|
+
emotion: persona.emotion,
|
|
21
|
+
speechStyle: persona.speechStyle,
|
|
22
|
+
intentClarity: persona.intentClarity,
|
|
23
|
+
description: persona.description,
|
|
24
|
+
backstory: persona.backstory,
|
|
25
|
+
gender: persona.gender,
|
|
26
|
+
language: persona.language,
|
|
27
|
+
accent: persona.accent,
|
|
28
|
+
},
|
|
29
|
+
scenario: {
|
|
30
|
+
prompt: scenarioPrompt,
|
|
31
|
+
name: scenarioMeta?.name,
|
|
32
|
+
description: scenarioMeta?.description,
|
|
33
|
+
category: scenarioMeta?.category,
|
|
34
|
+
difficulty: scenarioMeta?.difficulty,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// Add behavioral traits as flat keys for template convenience
|
|
38
|
+
if (persona.behavior) {
|
|
39
|
+
const b = persona.behavior;
|
|
40
|
+
if (b.cooperationLevel)
|
|
41
|
+
vars.persona['cooperationLevel'] = b.cooperationLevel;
|
|
42
|
+
if (b.patience)
|
|
43
|
+
vars.persona['patience'] = b.patience;
|
|
44
|
+
if (b.communicationStyle)
|
|
45
|
+
vars.persona['communicationStyle'] = b.communicationStyle;
|
|
46
|
+
if (b.personality)
|
|
47
|
+
vars.persona['personality'] = b.personality;
|
|
48
|
+
if (b.emotionalState)
|
|
49
|
+
vars.persona['emotionalState'] = b.emotionalState;
|
|
50
|
+
}
|
|
51
|
+
// Merge persona custom variables (from UI key-value editor)
|
|
52
|
+
// Available as {{persona.product_name}}, {{persona.order_id}}, etc.
|
|
53
|
+
if (persona.variables) {
|
|
54
|
+
for (const [k, v] of Object.entries(persona.variables)) {
|
|
55
|
+
if (k && v != null)
|
|
56
|
+
vars.persona[k] = String(v);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Add custom promptVariables as top-level keys
|
|
60
|
+
if (scenarioMeta?.promptVariables) {
|
|
61
|
+
for (const v of scenarioMeta.promptVariables) {
|
|
62
|
+
if (v.name && v.defaultValue != null) {
|
|
63
|
+
vars[v.name] = v.defaultValue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return vars;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Render a Liquid template with persona + scenario variables.
|
|
71
|
+
*
|
|
72
|
+
* Returns the rendered string, or null if rendering fails (with a warning).
|
|
73
|
+
* Callers should fall back to the code-generated prompt on null.
|
|
74
|
+
*/
|
|
75
|
+
async function renderPersonaTemplate(template, variables) {
|
|
76
|
+
try {
|
|
77
|
+
const rendered = await liquid.parseAndRender(template, variables);
|
|
78
|
+
const trimmed = rendered.trim();
|
|
79
|
+
if (!trimmed) {
|
|
80
|
+
logger.warn('Liquid template rendered to empty string — falling back to code-generated prompt');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return trimmed;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
logger.warn(`Liquid template rendering failed: ${err?.message || err} — falling back to code-generated prompt`);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=template-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../src/execution/template-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTestSuite = void 0;
|
|
4
|
+
var scenario_generator_service_1 = require("./scenario-generator.service");
|
|
5
|
+
Object.defineProperty(exports, "generateTestSuite", { enumerable: true, get: function () { return scenario_generator_service_1.generateTestSuite; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generation/index.ts"],"names":[],"mappings":";;;AAAA,2EAQsC;AAPpC,+HAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export interface GenerateRequest {
|
|
2
|
+
systemPrompt: string;
|
|
3
|
+
count?: number;
|
|
4
|
+
difficulties?: ('easy' | 'medium' | 'hard')[];
|
|
5
|
+
includeAdversarial?: boolean;
|
|
6
|
+
domain?: string;
|
|
7
|
+
adapterType?: string;
|
|
8
|
+
adapterConfig?: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
export interface GeneratedScenario {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
prompt: string;
|
|
14
|
+
category: string;
|
|
15
|
+
difficulty: string;
|
|
16
|
+
tags: string[];
|
|
17
|
+
context?: {
|
|
18
|
+
situation?: string;
|
|
19
|
+
objective?: string;
|
|
20
|
+
background?: string;
|
|
21
|
+
constraints?: string[];
|
|
22
|
+
};
|
|
23
|
+
groundTruth?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface GeneratedPersona {
|
|
26
|
+
name: string;
|
|
27
|
+
gender: string;
|
|
28
|
+
emotion: string;
|
|
29
|
+
language: string;
|
|
30
|
+
accent: string;
|
|
31
|
+
intentClarity: string;
|
|
32
|
+
speechStyle: string;
|
|
33
|
+
backgroundNoise: boolean;
|
|
34
|
+
allowInterruptions: boolean;
|
|
35
|
+
description: string;
|
|
36
|
+
backstory: string;
|
|
37
|
+
behavior: {
|
|
38
|
+
personality: string;
|
|
39
|
+
cooperationLevel: string;
|
|
40
|
+
patience: string;
|
|
41
|
+
communicationStyle: string;
|
|
42
|
+
};
|
|
43
|
+
variables: Record<string, string>;
|
|
44
|
+
tags: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface GeneratedCriterion {
|
|
47
|
+
key: string;
|
|
48
|
+
name: string;
|
|
49
|
+
description: string;
|
|
50
|
+
type: string;
|
|
51
|
+
settings: Record<string, any>;
|
|
52
|
+
threshold?: Record<string, any>;
|
|
53
|
+
}
|
|
54
|
+
export interface GeneratedScorecard {
|
|
55
|
+
name: string;
|
|
56
|
+
description: string;
|
|
57
|
+
criteria: GeneratedCriterion[];
|
|
58
|
+
}
|
|
59
|
+
export interface GeneratedSuite {
|
|
60
|
+
scenarios: GeneratedScenario[];
|
|
61
|
+
personas: GeneratedPersona[];
|
|
62
|
+
scorecard: GeneratedScorecard;
|
|
63
|
+
summary: string;
|
|
64
|
+
domain: string;
|
|
65
|
+
}
|
|
66
|
+
/** @internal Exported for testing */
|
|
67
|
+
export declare function validateScenario(s: any): GeneratedScenario | null;
|
|
68
|
+
/** @internal Exported for testing */
|
|
69
|
+
export declare function validatePersona(p: any): GeneratedPersona | null;
|
|
70
|
+
/** @internal Exported for testing */
|
|
71
|
+
export declare function validateCriterion(c: any): GeneratedCriterion | null;
|
|
72
|
+
/** @internal Exported for testing */
|
|
73
|
+
export declare function validateScorecard(sc: any): GeneratedScorecard | null;
|
|
74
|
+
/** @internal Exported for testing */
|
|
75
|
+
export declare function parseJsonResponse(text: string): any;
|
|
76
|
+
export declare function generateTestSuite(request: GenerateRequest): Promise<GeneratedSuite>;
|
|
77
|
+
//# sourceMappingURL=scenario-generator.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-generator.service.d.ts","sourceRoot":"","sources":["../../src/generation/scenario-generator.service.ts"],"names":[],"mappings":"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"}
|