@kilnai/core 0.1.16 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/agent-rag.d.ts +21 -0
- package/dist/agents/agent-rag.d.ts.map +1 -0
- package/dist/agents/agent-rag.js +79 -0
- package/dist/agents/agent-rag.js.map +1 -0
- package/dist/agents/complexity-scorer.d.ts +8 -0
- package/dist/agents/complexity-scorer.d.ts.map +1 -0
- package/dist/agents/complexity-scorer.js +58 -0
- package/dist/agents/complexity-scorer.js.map +1 -0
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +9 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/infrastructure/deepgram-stt.d.ts +15 -0
- package/dist/agents/infrastructure/deepgram-stt.d.ts.map +1 -0
- package/dist/agents/infrastructure/deepgram-stt.js +56 -0
- package/dist/agents/infrastructure/deepgram-stt.js.map +1 -0
- package/dist/agents/infrastructure/openai-stt.d.ts +15 -0
- package/dist/agents/infrastructure/openai-stt.d.ts.map +1 -0
- package/dist/agents/infrastructure/openai-stt.js +65 -0
- package/dist/agents/infrastructure/openai-stt.js.map +1 -0
- package/dist/agents/mcp-client.d.ts +4 -0
- package/dist/agents/mcp-client.d.ts.map +1 -1
- package/dist/agents/mcp-client.js +15 -2
- package/dist/agents/mcp-client.js.map +1 -1
- package/dist/agents/model-capability-registry.d.ts +13 -0
- package/dist/agents/model-capability-registry.d.ts.map +1 -0
- package/dist/agents/model-capability-registry.js +64 -0
- package/dist/agents/model-capability-registry.js.map +1 -0
- package/dist/agents/rules-router.d.ts +14 -0
- package/dist/agents/rules-router.d.ts.map +1 -0
- package/dist/agents/rules-router.js +59 -0
- package/dist/agents/rules-router.js.map +1 -0
- package/dist/agents/sliding-window-rate-limiter.d.ts +11 -0
- package/dist/agents/sliding-window-rate-limiter.d.ts.map +1 -0
- package/dist/agents/sliding-window-rate-limiter.js +56 -0
- package/dist/agents/sliding-window-rate-limiter.js.map +1 -0
- package/dist/agents/tool-error-classifier.d.ts +4 -0
- package/dist/agents/tool-error-classifier.d.ts.map +1 -0
- package/dist/agents/tool-error-classifier.js +32 -0
- package/dist/agents/tool-error-classifier.js.map +1 -0
- package/dist/agents/tool-execution-engine.d.ts +4 -0
- package/dist/agents/tool-execution-engine.d.ts.map +1 -0
- package/dist/agents/tool-execution-engine.js +100 -0
- package/dist/agents/tool-execution-engine.js.map +1 -0
- package/dist/cost/cost-tracker.d.ts +12 -2
- package/dist/cost/cost-tracker.d.ts.map +1 -1
- package/dist/cost/cost-tracker.js +48 -15
- package/dist/cost/cost-tracker.js.map +1 -1
- package/dist/cost/index.d.ts +11 -2
- package/dist/cost/index.d.ts.map +1 -1
- package/dist/cost/index.js +1 -1
- package/dist/cost/index.js.map +1 -1
- package/dist/domain/domain-package-adapter.d.ts +1 -1
- package/dist/domain/domain-package-adapter.js +2 -2
- package/dist/domain/domain-package-adapter.js.map +1 -1
- package/dist/domains/routing-templates.d.ts +12 -0
- package/dist/domains/routing-templates.d.ts.map +1 -0
- package/dist/domains/routing-templates.js +109 -0
- package/dist/domains/routing-templates.js.map +1 -0
- package/dist/engine/domain/capability.d.ts +2 -0
- package/dist/engine/domain/capability.d.ts.map +1 -1
- package/dist/engine/domain/chunker.d.ts +4 -0
- package/dist/engine/domain/chunker.d.ts.map +1 -1
- package/dist/engine/domain/contact-memory.d.ts +30 -0
- package/dist/engine/domain/contact-memory.d.ts.map +1 -0
- package/dist/engine/domain/contact-memory.js +4 -0
- package/dist/engine/domain/contact-memory.js.map +1 -0
- package/dist/engine/domain/knowledge-config.d.ts +26 -1
- package/dist/engine/domain/knowledge-config.d.ts.map +1 -1
- package/dist/engine/domain/knowledge-config.js +41 -3
- package/dist/engine/domain/knowledge-config.js.map +1 -1
- package/dist/engine/domain/knowledge-source.d.ts +31 -0
- package/dist/engine/domain/knowledge-source.d.ts.map +1 -0
- package/dist/engine/domain/knowledge-source.js +3 -0
- package/dist/engine/domain/knowledge-source.js.map +1 -0
- package/dist/engine/domain/model-router.d.ts +87 -0
- package/dist/engine/domain/model-router.d.ts.map +1 -0
- package/dist/engine/domain/model-router.js +4 -0
- package/dist/engine/domain/model-router.js.map +1 -0
- package/dist/engine/domain/rate-limiter.d.ts +15 -0
- package/dist/engine/domain/rate-limiter.d.ts.map +1 -0
- package/dist/engine/domain/rate-limiter.js +3 -0
- package/dist/engine/domain/rate-limiter.js.map +1 -0
- package/dist/engine/domain/tool-execution.d.ts +33 -0
- package/dist/engine/domain/tool-execution.d.ts.map +1 -0
- package/dist/engine/domain/tool-execution.js +3 -0
- package/dist/engine/domain/tool-execution.js.map +1 -0
- package/dist/engine/domain/vector-store.d.ts +1 -0
- package/dist/engine/domain/vector-store.d.ts.map +1 -1
- package/dist/engine/error-catalog.d.ts.map +1 -1
- package/dist/engine/error-catalog.js +100 -0
- package/dist/engine/error-catalog.js.map +1 -1
- package/dist/engine/errors.d.ts +1 -1
- package/dist/engine/errors.d.ts.map +1 -1
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/gateway/conversation-event.d.ts +57 -1
- package/dist/engine/gateway/conversation-event.d.ts.map +1 -1
- package/dist/engine/gateway/events-config.d.ts +4 -0
- package/dist/engine/gateway/events-config.d.ts.map +1 -1
- package/dist/engine/gateway/tenant-config.d.ts +65 -0
- package/dist/engine/gateway/tenant-config.d.ts.map +1 -1
- package/dist/engine/gateway/tenant-config.js +181 -0
- package/dist/engine/gateway/tenant-config.js.map +1 -1
- package/dist/engine/index.d.ts +6 -2
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/loader/app-loader.d.ts.map +1 -1
- package/dist/engine/loader/app-loader.js +41 -0
- package/dist/engine/loader/app-loader.js.map +1 -1
- package/dist/enrichment/effort-score.d.ts +7 -0
- package/dist/enrichment/effort-score.d.ts.map +1 -0
- package/dist/enrichment/effort-score.js +15 -0
- package/dist/enrichment/effort-score.js.map +1 -0
- package/dist/enrichment/enrichment-pipeline.d.ts +13 -0
- package/dist/enrichment/enrichment-pipeline.d.ts.map +1 -0
- package/dist/enrichment/enrichment-pipeline.js +191 -0
- package/dist/enrichment/enrichment-pipeline.js.map +1 -0
- package/dist/enrichment/index.d.ts +4 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +3 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/types.d.ts +105 -0
- package/dist/enrichment/types.d.ts.map +1 -0
- package/dist/enrichment/types.js +3 -0
- package/dist/enrichment/types.js.map +1 -0
- package/dist/events/index.d.ts +72 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +10 -0
- package/dist/events/index.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/contact-memory.d.ts +26 -0
- package/dist/knowledge/contact-memory.d.ts.map +1 -0
- package/dist/knowledge/contact-memory.js +235 -0
- package/dist/knowledge/contact-memory.js.map +1 -0
- package/dist/knowledge/contextual-enricher.d.ts +16 -0
- package/dist/knowledge/contextual-enricher.d.ts.map +1 -0
- package/dist/knowledge/contextual-enricher.js +82 -0
- package/dist/knowledge/contextual-enricher.js.map +1 -0
- package/dist/knowledge/index.d.ts +16 -0
- package/dist/knowledge/index.d.ts.map +1 -1
- package/dist/knowledge/index.js +13 -0
- package/dist/knowledge/index.js.map +1 -1
- package/dist/knowledge/infrastructure/cohere-reranker.d.ts +13 -0
- package/dist/knowledge/infrastructure/cohere-reranker.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/cohere-reranker.js +61 -0
- package/dist/knowledge/infrastructure/cohere-reranker.js.map +1 -0
- package/dist/knowledge/infrastructure/composite-extractor.d.ts +8 -0
- package/dist/knowledge/infrastructure/composite-extractor.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/composite-extractor.js +26 -0
- package/dist/knowledge/infrastructure/composite-extractor.js.map +1 -0
- package/dist/knowledge/infrastructure/file-extractor.d.ts +6 -0
- package/dist/knowledge/infrastructure/file-extractor.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/file-extractor.js +19 -0
- package/dist/knowledge/infrastructure/file-extractor.js.map +1 -0
- package/dist/knowledge/infrastructure/json-source-store.d.ts +14 -0
- package/dist/knowledge/infrastructure/json-source-store.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/json-source-store.js +56 -0
- package/dist/knowledge/infrastructure/json-source-store.js.map +1 -0
- package/dist/knowledge/infrastructure/memory-source-store.d.ts +10 -0
- package/dist/knowledge/infrastructure/memory-source-store.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/memory-source-store.js +26 -0
- package/dist/knowledge/infrastructure/memory-source-store.js.map +1 -0
- package/dist/knowledge/infrastructure/memory-vector-store.d.ts +1 -0
- package/dist/knowledge/infrastructure/memory-vector-store.d.ts.map +1 -1
- package/dist/knowledge/infrastructure/memory-vector-store.js +10 -0
- package/dist/knowledge/infrastructure/memory-vector-store.js.map +1 -1
- package/dist/knowledge/infrastructure/pdf-extractor.d.ts +6 -0
- package/dist/knowledge/infrastructure/pdf-extractor.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/pdf-extractor.js +46 -0
- package/dist/knowledge/infrastructure/pdf-extractor.js.map +1 -0
- package/dist/knowledge/infrastructure/pgvector-store.d.ts +29 -0
- package/dist/knowledge/infrastructure/pgvector-store.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/pgvector-store.js +141 -0
- package/dist/knowledge/infrastructure/pgvector-store.js.map +1 -0
- package/dist/knowledge/infrastructure/url-extractor.d.ts +6 -0
- package/dist/knowledge/infrastructure/url-extractor.d.ts.map +1 -0
- package/dist/knowledge/infrastructure/url-extractor.js +71 -0
- package/dist/knowledge/infrastructure/url-extractor.js.map +1 -0
- package/dist/knowledge/retrieval-pipeline.d.ts +8 -1
- package/dist/knowledge/retrieval-pipeline.d.ts.map +1 -1
- package/dist/knowledge/retrieval-pipeline.js +28 -2
- package/dist/knowledge/retrieval-pipeline.js.map +1 -1
- package/dist/knowledge/source-manager.d.ts +29 -0
- package/dist/knowledge/source-manager.d.ts.map +1 -0
- package/dist/knowledge/source-manager.js +124 -0
- package/dist/knowledge/source-manager.js.map +1 -0
- package/dist/observability/span-mapper.d.ts.map +1 -1
- package/dist/observability/span-mapper.js +100 -3
- package/dist/observability/span-mapper.js.map +1 -1
- package/dist/orchestrator/orchestrator.js +2 -2
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/safety/index.d.ts +2 -0
- package/dist/safety/index.d.ts.map +1 -1
- package/dist/safety/index.js +2 -0
- package/dist/safety/index.js.map +1 -1
- package/dist/safety/pii-scanner.d.ts.map +1 -1
- package/dist/safety/pii-scanner.js +18 -0
- package/dist/safety/pii-scanner.js.map +1 -1
- package/dist/safety/tool-result-sanitizer.d.ts +21 -0
- package/dist/safety/tool-result-sanitizer.d.ts.map +1 -0
- package/dist/safety/tool-result-sanitizer.js +62 -0
- package/dist/safety/tool-result-sanitizer.js.map +1 -0
- package/dist/security/annotation-authorizer.d.ts +13 -0
- package/dist/security/annotation-authorizer.d.ts.map +1 -0
- package/dist/security/annotation-authorizer.js +37 -0
- package/dist/security/annotation-authorizer.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -0
- package/dist/security/index.js.map +1 -1
- package/dist/security/types.d.ts +2 -2
- package/dist/security/types.d.ts.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules-router.d.ts","sourceRoot":"","sources":["../../src/agents/rules-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwD;IACtF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAGjD,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,aAAa,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EACpE,QAAQ,EAAE,uBAAuB;IAOnC,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe;IAgC/C,OAAO,CAAC,iBAAiB;CAkB1B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Rules-based model router: evaluates conditions in priority order, returns first match
|
|
2
|
+
// Validates target model capabilities before selecting
|
|
3
|
+
export class RulesRouter {
|
|
4
|
+
rules;
|
|
5
|
+
defaultTarget;
|
|
6
|
+
registry;
|
|
7
|
+
constructor(rules, defaultTarget, registry) {
|
|
8
|
+
this.rules = [...rules].sort((a, b) => a.priority - b.priority);
|
|
9
|
+
this.defaultTarget = defaultTarget;
|
|
10
|
+
this.registry = registry;
|
|
11
|
+
}
|
|
12
|
+
route(request) {
|
|
13
|
+
for (const rule of this.rules) {
|
|
14
|
+
if (this.evaluateCondition(rule.condition, request)) {
|
|
15
|
+
// Validate target model has required capabilities
|
|
16
|
+
const profile = this.registry.get(rule.target.model);
|
|
17
|
+
if (profile &&
|
|
18
|
+
(!request.hasTools || profile.supportsTools) &&
|
|
19
|
+
(!request.requiresStreaming || profile.supportsStreaming)) {
|
|
20
|
+
return {
|
|
21
|
+
provider: rule.target.provider,
|
|
22
|
+
model: rule.target.model,
|
|
23
|
+
reasoning: `Rule "${rule.name}" matched`,
|
|
24
|
+
confidence: 1.0,
|
|
25
|
+
routingTier: "rule",
|
|
26
|
+
estimatedCostUsd: undefined,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Skip rule if target model doesn't support required capabilities
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
provider: this.defaultTarget.provider,
|
|
34
|
+
model: this.defaultTarget.model,
|
|
35
|
+
reasoning: "No rules matched, using default",
|
|
36
|
+
confidence: 1.0,
|
|
37
|
+
routingTier: "default",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
evaluateCondition(condition, request) {
|
|
41
|
+
switch (condition.type) {
|
|
42
|
+
case "has_tools":
|
|
43
|
+
return request.hasTools;
|
|
44
|
+
case "complexity_above":
|
|
45
|
+
return request.complexity.score > condition.threshold;
|
|
46
|
+
case "complexity_below":
|
|
47
|
+
return request.complexity.score < condition.threshold;
|
|
48
|
+
case "budget_below_cents":
|
|
49
|
+
return request.budgetRemainingCents !== undefined && request.budgetRemainingCents < condition.cents;
|
|
50
|
+
case "agent_tier":
|
|
51
|
+
return request.agentTier === condition.tier;
|
|
52
|
+
case "agent_id":
|
|
53
|
+
return request.agentId === condition.agentId;
|
|
54
|
+
case "always":
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=rules-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules-router.js","sourceRoot":"","sources":["../../src/agents/rules-router.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,uDAAuD;AAKvD,MAAM,OAAO,WAAW;IACL,KAAK,CAAyB;IAC9B,aAAa,CAAwD;IACrE,QAAQ,CAA0B;IAEnD,YACE,KAA6B,EAC7B,aAAoE,EACpE,QAAiC;QAEjC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAuB;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;gBACpD,kDAAkD;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrD,IACE,OAAO;oBACP,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;oBAC5C,CAAC,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,EACzD,CAAC;oBACD,OAAO;wBACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;wBAC9B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;wBACxB,SAAS,EAAE,SAAS,IAAI,CAAC,IAAI,WAAW;wBACxC,UAAU,EAAE,GAAG;wBACf,WAAW,EAAE,MAAM;wBACnB,gBAAgB,EAAE,SAAS;qBAC5B,CAAC;gBACJ,CAAC;gBACD,kEAAkE;YACpE,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ;YACrC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;YAC/B,SAAS,EAAE,iCAAiC;YAC5C,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,SAAmC,EAAE,OAAuB;QACpF,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,WAAW;gBACd,OAAO,OAAO,CAAC,QAAQ,CAAC;YAC1B,KAAK,kBAAkB;gBACrB,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;YACxD,KAAK,kBAAkB;gBACrB,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;YACxD,KAAK,oBAAoB;gBACvB,OAAO,OAAO,CAAC,oBAAoB,KAAK,SAAS,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,KAAK,CAAC;YACtG,KAAK,YAAY;gBACf,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC;YAC9C,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC;YAC/C,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RateLimiter, RateLimitConfig, RateLimitResult } from "../engine/domain/rate-limiter.js";
|
|
2
|
+
export declare class SlidingWindowRateLimiter implements RateLimiter {
|
|
3
|
+
private readonly windows;
|
|
4
|
+
private readonly config;
|
|
5
|
+
constructor(config: RateLimitConfig);
|
|
6
|
+
check(tenantId: string, toolName: string): RateLimitResult;
|
|
7
|
+
record(tenantId: string, toolName: string): void;
|
|
8
|
+
reset(tenantId: string): void;
|
|
9
|
+
private prune;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=sliding-window-rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliding-window-rate-limiter.d.ts","sourceRoot":"","sources":["../../src/agents/sliding-window-rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAItG,qBAAa,wBAAyB,YAAW,WAAW;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,eAAe;IAInC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe;IAqB1D,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUhD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS7B,OAAO,CAAC,KAAK;CAYd"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const WINDOW_MS = 60_000;
|
|
2
|
+
export class SlidingWindowRateLimiter {
|
|
3
|
+
windows = new Map();
|
|
4
|
+
config;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
}
|
|
8
|
+
check(tenantId, toolName) {
|
|
9
|
+
const key = `${tenantId}:${toolName}`;
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const cutoff = now - WINDOW_MS;
|
|
12
|
+
const timestamps = this.prune(key, cutoff);
|
|
13
|
+
const limit = this.config.perTool?.[toolName] ?? this.config.defaultPerMinute;
|
|
14
|
+
const count = timestamps.length;
|
|
15
|
+
if (count >= limit) {
|
|
16
|
+
const oldest = timestamps[0];
|
|
17
|
+
return {
|
|
18
|
+
allowed: false,
|
|
19
|
+
remaining: 0,
|
|
20
|
+
retryAfterMs: oldest + WINDOW_MS - now,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { allowed: true, remaining: limit - count };
|
|
24
|
+
}
|
|
25
|
+
record(tenantId, toolName) {
|
|
26
|
+
const key = `${tenantId}:${toolName}`;
|
|
27
|
+
let timestamps = this.windows.get(key);
|
|
28
|
+
if (!timestamps) {
|
|
29
|
+
timestamps = [];
|
|
30
|
+
this.windows.set(key, timestamps);
|
|
31
|
+
}
|
|
32
|
+
timestamps.push(Date.now());
|
|
33
|
+
}
|
|
34
|
+
reset(tenantId) {
|
|
35
|
+
const prefix = `${tenantId}:`;
|
|
36
|
+
for (const key of this.windows.keys()) {
|
|
37
|
+
if (key.startsWith(prefix)) {
|
|
38
|
+
this.windows.delete(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
prune(key, cutoff) {
|
|
43
|
+
const timestamps = this.windows.get(key);
|
|
44
|
+
if (!timestamps)
|
|
45
|
+
return [];
|
|
46
|
+
const pruned = timestamps.filter((t) => t > cutoff);
|
|
47
|
+
if (pruned.length === 0) {
|
|
48
|
+
this.windows.delete(key);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.windows.set(key, pruned);
|
|
52
|
+
}
|
|
53
|
+
return pruned;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sliding-window-rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliding-window-rate-limiter.js","sourceRoot":"","sources":["../../src/agents/sliding-window-rate-limiter.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,OAAO,wBAAwB;IAClB,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,QAAgB;QACtC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;QAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAEhC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG;aACvC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,QAAgB;QACvC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,MAAM,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,MAAc;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ToolErrorType } from "../engine/domain/tool-execution.js";
|
|
2
|
+
/** Classify a tool execution error as validation, transient, or fatal */
|
|
3
|
+
export declare function classifyToolError(error: unknown): ToolErrorType;
|
|
4
|
+
//# sourceMappingURL=tool-error-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-classifier.d.ts","sourceRoot":"","sources":["../../src/agents/tool-error-classifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAmC/D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Tool error classifier: categorizes tool execution errors for retry decisions
|
|
2
|
+
/** Classify a tool execution error as validation, transient, or fatal */
|
|
3
|
+
export function classifyToolError(error) {
|
|
4
|
+
if (!(error instanceof Error))
|
|
5
|
+
return "fatal";
|
|
6
|
+
const message = error.message.toLowerCase();
|
|
7
|
+
// Check for HTTP status codes or known validation patterns
|
|
8
|
+
if (message.includes("400") ||
|
|
9
|
+
message.includes("422") ||
|
|
10
|
+
message.includes("validation") ||
|
|
11
|
+
message.includes("invalid") ||
|
|
12
|
+
message.includes("bad request") ||
|
|
13
|
+
message.includes("schema")) {
|
|
14
|
+
return "validation";
|
|
15
|
+
}
|
|
16
|
+
// Check for transient/retryable patterns
|
|
17
|
+
if (message.includes("429") ||
|
|
18
|
+
message.includes("502") ||
|
|
19
|
+
message.includes("503") ||
|
|
20
|
+
message.includes("504") ||
|
|
21
|
+
message.includes("timeout") ||
|
|
22
|
+
message.includes("rate limit") ||
|
|
23
|
+
message.includes("econnreset") ||
|
|
24
|
+
message.includes("econnrefused") ||
|
|
25
|
+
message.includes("service unavailable") ||
|
|
26
|
+
message.includes("gateway timeout") ||
|
|
27
|
+
message.includes("too many requests")) {
|
|
28
|
+
return "transient";
|
|
29
|
+
}
|
|
30
|
+
return "fatal";
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tool-error-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-classifier.js","sourceRoot":"","sources":["../../src/agents/tool-error-classifier.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAI/E,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAE5C,2DAA2D;IAC3D,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC1B,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yCAAyC;IACzC,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrC,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RetryConfig, ToolExecutionResult } from "../engine/domain/tool-execution.js";
|
|
2
|
+
export type ToolExecutor = (toolName: string, input: Record<string, unknown>) => Promise<unknown>;
|
|
3
|
+
export declare function executeWithRetry(toolName: string, input: Record<string, unknown>, executor: ToolExecutor, retryConfig?: RetryConfig, fallbackExecutor?: ToolExecutor): Promise<ToolExecutionResult>;
|
|
4
|
+
//# sourceMappingURL=tool-execution-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-execution-engine.d.ts","sourceRoot":"","sources":["../../src/agents/tool-execution-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAQ3F,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAElG,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,WAAW,EACzB,gBAAgB,CAAC,EAAE,YAAY,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA6E9B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Tool execution engine: retry, timeout, fallback wrapper for tool calls
|
|
2
|
+
import { KilnError } from "../engine/errors.js";
|
|
3
|
+
import { classifyToolError } from "./tool-error-classifier.js";
|
|
4
|
+
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
6
|
+
const MAX_BACKOFF_MS = 10_000;
|
|
7
|
+
export async function executeWithRetry(toolName, input, executor, retryConfig, fallbackExecutor) {
|
|
8
|
+
const maxAttempts = retryConfig?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
9
|
+
const timeoutMs = retryConfig?.timeout ? retryConfig.timeout * 1000 : DEFAULT_TIMEOUT_MS;
|
|
10
|
+
const startMs = Date.now();
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
13
|
+
try {
|
|
14
|
+
const result = await executeWithTimeout(executor, toolName, input, timeoutMs);
|
|
15
|
+
return {
|
|
16
|
+
result,
|
|
17
|
+
attempts: attempt,
|
|
18
|
+
durationMs: Date.now() - startMs,
|
|
19
|
+
fallbackUsed: false,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
lastError = err;
|
|
24
|
+
// Timeout errors: propagate directly (don't classify as transient for retry)
|
|
25
|
+
if (err instanceof KilnError && err.code === "TOOL_EXECUTION_TIMEOUT") {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
const errorType = classifyToolError(err);
|
|
29
|
+
// mutate_params strategy: re-throw immediately to let LLM correct input
|
|
30
|
+
if (errorType === "validation" && retryConfig?.onValidationError === "mutate_params") {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
// Fatal errors: no retry
|
|
34
|
+
if (errorType === "fatal")
|
|
35
|
+
break;
|
|
36
|
+
// Last attempt: break to try fallback
|
|
37
|
+
if (attempt === maxAttempts)
|
|
38
|
+
break;
|
|
39
|
+
// Determine if we should retry based on error type and config
|
|
40
|
+
const strategy = errorType === "validation"
|
|
41
|
+
? retryConfig?.onValidationError
|
|
42
|
+
: retryConfig?.onTransientError;
|
|
43
|
+
if (!strategy || strategy === "mutate_params") {
|
|
44
|
+
// mutate_params for transient doesn't make sense, re-throw
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
// Exponential backoff
|
|
48
|
+
const backoffMs = Math.min(1000 * Math.pow(2, attempt - 1), MAX_BACKOFF_MS);
|
|
49
|
+
await sleep(backoffMs);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Propagate timeout errors directly
|
|
53
|
+
if (lastError instanceof KilnError && lastError.code === "TOOL_EXECUTION_TIMEOUT") {
|
|
54
|
+
throw lastError;
|
|
55
|
+
}
|
|
56
|
+
// All retries exhausted -- try fallback if configured
|
|
57
|
+
if (retryConfig?.fallback && fallbackExecutor) {
|
|
58
|
+
try {
|
|
59
|
+
const result = await executeWithTimeout(fallbackExecutor, retryConfig.fallback, input, timeoutMs);
|
|
60
|
+
return {
|
|
61
|
+
result,
|
|
62
|
+
attempts: maxAttempts,
|
|
63
|
+
durationMs: Date.now() - startMs,
|
|
64
|
+
fallbackUsed: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Fallback also failed
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
throw new KilnError("TOOL_RETRY_EXHAUSTED", `Tool "${toolName}" failed after ${maxAttempts} attempts`, {
|
|
72
|
+
context: { toolName, attempts: maxAttempts },
|
|
73
|
+
retryable: false,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function executeWithTimeout(executor, toolName, input, timeoutMs) {
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
79
|
+
try {
|
|
80
|
+
const result = await Promise.race([
|
|
81
|
+
executor(toolName, input),
|
|
82
|
+
new Promise((_, reject) => {
|
|
83
|
+
controller.signal.addEventListener("abort", () => {
|
|
84
|
+
reject(new KilnError("TOOL_EXECUTION_TIMEOUT", `Tool "${toolName}" timed out after ${timeoutMs}ms`, {
|
|
85
|
+
context: { toolName, timeoutMs },
|
|
86
|
+
retryable: true,
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function sleep(ms) {
|
|
98
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=tool-execution-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-execution-engine.js","sourceRoot":"","sources":["../../src/agents/tool-execution-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { AgentRole } from "../agents/index.js";
|
|
2
|
-
import type { ModelPricing, CostSummary } from "./index.js";
|
|
2
|
+
import type { ModelPricing, CostSummary, SttPricing, EmbeddingPricing } from "./index.js";
|
|
3
3
|
/** Unified pricing derived from MODEL_CATALOG (single source of truth) */
|
|
4
4
|
export declare const MODEL_PRICING: ReadonlyMap<string, ModelPricing>;
|
|
5
|
+
/** STT pricing: rate per minute of audio */
|
|
6
|
+
export declare const STT_PRICING: ReadonlyMap<string, SttPricing>;
|
|
7
|
+
/** Embedding pricing: rate per million tokens */
|
|
8
|
+
export declare const EMBEDDING_PRICING: ReadonlyMap<string, EmbeddingPricing>;
|
|
5
9
|
interface TokenUsage {
|
|
6
10
|
readonly inputTokens: number;
|
|
7
11
|
readonly outputTokens: number;
|
|
@@ -13,9 +17,15 @@ interface TokenUsage {
|
|
|
13
17
|
* Subscribes to EventBus cost_update events for automatic tracking.
|
|
14
18
|
*/
|
|
15
19
|
export declare class CostTracker {
|
|
16
|
-
private readonly
|
|
20
|
+
private readonly usageByRoleModel;
|
|
21
|
+
private embeddingCostUsd;
|
|
22
|
+
private sttCostUsd;
|
|
17
23
|
/** Record token usage for a specific role and model */
|
|
18
24
|
record(role: AgentRole, model: string, usage: TokenUsage): void;
|
|
25
|
+
/** Record embedding cost for a specific model */
|
|
26
|
+
recordEmbedding(model: string, tokens: number): void;
|
|
27
|
+
/** Record STT cost for a specific model */
|
|
28
|
+
recordStt(model: string, durationSeconds: number): void;
|
|
19
29
|
/** Compute USD cost for a specific role */
|
|
20
30
|
costForRole(role: AgentRole): number;
|
|
21
31
|
/** Get full cost summary with totals and per-role breakdown */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOrG,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAS3D,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAGtD,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAGlE,CAAC;AAEH,UAAU,UAAU;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAaD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;IACxE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,UAAU,CAAK;IAEvB,uDAAuD;IACvD,MAAM,CACJ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,IAAI;IAsBP,iDAAiD;IACjD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpD,2CAA2C;IAC3C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAMvD,2CAA2C;IAC3C,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAUpC,+DAA+D;IAC/D,IAAI,OAAO,IAAI,WAAW,CA0CzB;IAED,kCAAkC;IAClC,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -11,15 +11,28 @@ export const MODEL_PRICING = new Map(MODEL_CATALOG.map((entry) => [
|
|
|
11
11
|
...(entry.provider === "anthropic" ? ANTHROPIC_CACHE : NO_CACHE),
|
|
12
12
|
},
|
|
13
13
|
]));
|
|
14
|
+
/** STT pricing: rate per minute of audio */
|
|
15
|
+
export const STT_PRICING = new Map([
|
|
16
|
+
["gpt-4o-transcribe", { ratePerMinute: 0.006 }],
|
|
17
|
+
["nova-3", { ratePerMinute: 0.0043 }],
|
|
18
|
+
]);
|
|
19
|
+
/** Embedding pricing: rate per million tokens */
|
|
20
|
+
export const EMBEDDING_PRICING = new Map([
|
|
21
|
+
["text-embedding-3-small", { ratePerMToken: 0.02 }],
|
|
22
|
+
["text-embedding-3-large", { ratePerMToken: 0.13 }],
|
|
23
|
+
]);
|
|
14
24
|
/**
|
|
15
25
|
* Tracks token usage and computes costs per role with cache-aware pricing.
|
|
16
26
|
* Subscribes to EventBus cost_update events for automatic tracking.
|
|
17
27
|
*/
|
|
18
28
|
export class CostTracker {
|
|
19
|
-
|
|
29
|
+
usageByRoleModel = new Map();
|
|
30
|
+
embeddingCostUsd = 0;
|
|
31
|
+
sttCostUsd = 0;
|
|
20
32
|
/** Record token usage for a specific role and model */
|
|
21
33
|
record(role, model, usage) {
|
|
22
|
-
|
|
34
|
+
const key = `${role}:${model}`;
|
|
35
|
+
let entry = this.usageByRoleModel.get(key);
|
|
23
36
|
if (!entry) {
|
|
24
37
|
entry = {
|
|
25
38
|
role,
|
|
@@ -30,21 +43,37 @@ export class CostTracker {
|
|
|
30
43
|
cacheWriteTokens: 0,
|
|
31
44
|
calls: 0,
|
|
32
45
|
};
|
|
33
|
-
this.
|
|
46
|
+
this.usageByRoleModel.set(key, entry);
|
|
34
47
|
}
|
|
35
|
-
entry.model = model;
|
|
36
48
|
entry.inputTokens += usage.inputTokens;
|
|
37
49
|
entry.outputTokens += usage.outputTokens;
|
|
38
50
|
entry.cacheReadTokens += usage.cacheReadTokens;
|
|
39
51
|
entry.cacheWriteTokens += usage.cacheWriteTokens;
|
|
40
52
|
entry.calls += 1;
|
|
41
53
|
}
|
|
54
|
+
/** Record embedding cost for a specific model */
|
|
55
|
+
recordEmbedding(model, tokens) {
|
|
56
|
+
const pricing = EMBEDDING_PRICING.get(model);
|
|
57
|
+
if (!pricing)
|
|
58
|
+
return;
|
|
59
|
+
this.embeddingCostUsd += (tokens * pricing.ratePerMToken) / 1_000_000;
|
|
60
|
+
}
|
|
61
|
+
/** Record STT cost for a specific model */
|
|
62
|
+
recordStt(model, durationSeconds) {
|
|
63
|
+
const pricing = STT_PRICING.get(model);
|
|
64
|
+
if (!pricing)
|
|
65
|
+
return;
|
|
66
|
+
this.sttCostUsd += (durationSeconds / 60) * pricing.ratePerMinute;
|
|
67
|
+
}
|
|
42
68
|
/** Compute USD cost for a specific role */
|
|
43
69
|
costForRole(role) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
70
|
+
let total = 0;
|
|
71
|
+
for (const [key, entry] of this.usageByRoleModel) {
|
|
72
|
+
if (key.startsWith(`${role}:`)) {
|
|
73
|
+
total += computeCost(entry);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return total;
|
|
48
77
|
}
|
|
49
78
|
/** Get full cost summary with totals and per-role breakdown */
|
|
50
79
|
get summary() {
|
|
@@ -54,16 +83,16 @@ export class CostTracker {
|
|
|
54
83
|
let totalCacheWriteTokens = 0;
|
|
55
84
|
let totalToolCalls = 0;
|
|
56
85
|
let totalCostUsd = 0;
|
|
57
|
-
const
|
|
58
|
-
for (const [
|
|
86
|
+
const byRoleModel = {};
|
|
87
|
+
for (const [key, entry] of this.usageByRoleModel) {
|
|
59
88
|
totalInputTokens += entry.inputTokens;
|
|
60
89
|
totalOutputTokens += entry.outputTokens;
|
|
61
90
|
totalCacheReadTokens += entry.cacheReadTokens;
|
|
62
91
|
totalCacheWriteTokens += entry.cacheWriteTokens;
|
|
63
92
|
totalToolCalls += entry.calls;
|
|
64
|
-
const
|
|
65
|
-
totalCostUsd +=
|
|
66
|
-
|
|
93
|
+
const entryCost = computeCost(entry);
|
|
94
|
+
totalCostUsd += entryCost;
|
|
95
|
+
byRoleModel[key] = {
|
|
67
96
|
role: entry.role,
|
|
68
97
|
model: entry.model,
|
|
69
98
|
inputTokens: entry.inputTokens,
|
|
@@ -73,6 +102,8 @@ export class CostTracker {
|
|
|
73
102
|
calls: entry.calls,
|
|
74
103
|
};
|
|
75
104
|
}
|
|
105
|
+
// Include embedding and STT costs in total
|
|
106
|
+
totalCostUsd += this.embeddingCostUsd + this.sttCostUsd;
|
|
76
107
|
return {
|
|
77
108
|
totalInputTokens,
|
|
78
109
|
totalOutputTokens,
|
|
@@ -80,12 +111,14 @@ export class CostTracker {
|
|
|
80
111
|
totalCacheWriteTokens,
|
|
81
112
|
totalToolCalls,
|
|
82
113
|
totalCostUsd,
|
|
83
|
-
|
|
114
|
+
byRoleModel,
|
|
84
115
|
};
|
|
85
116
|
}
|
|
86
117
|
/** Clear all accumulated usage */
|
|
87
118
|
reset() {
|
|
88
|
-
this.
|
|
119
|
+
this.usageByRoleModel.clear();
|
|
120
|
+
this.embeddingCostUsd = 0;
|
|
121
|
+
this.sttCostUsd = 0;
|
|
89
122
|
}
|
|
90
123
|
}
|
|
91
124
|
/** Compute USD cost for a usage entry using MODEL_PRICING */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,qFAAqF;AACrF,MAAM,eAAe,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAW,CAAC;AAC1F,MAAM,QAAQ,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAW,CAAC;AAE9E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAsC,IAAI,GAAG,CACrE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IAC3B,KAAK,CAAC,KAAK;IACX;QACE,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;KACjE;CACF,CAAC,CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/cost/index.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export interface ModelPricing {
|
|
|
16
16
|
readonly cacheReadMultiplier: number;
|
|
17
17
|
readonly cacheWriteMultiplier: number;
|
|
18
18
|
}
|
|
19
|
+
/** STT pricing (per minute of audio) */
|
|
20
|
+
export interface SttPricing {
|
|
21
|
+
readonly ratePerMinute: number;
|
|
22
|
+
}
|
|
23
|
+
/** Embedding pricing (per million tokens) */
|
|
24
|
+
export interface EmbeddingPricing {
|
|
25
|
+
readonly ratePerMToken: number;
|
|
26
|
+
}
|
|
19
27
|
/** Cost tracking summary */
|
|
20
28
|
export interface CostSummary {
|
|
21
29
|
readonly totalInputTokens: number;
|
|
@@ -24,7 +32,8 @@ export interface CostSummary {
|
|
|
24
32
|
readonly totalCacheWriteTokens: number;
|
|
25
33
|
readonly totalToolCalls: number;
|
|
26
34
|
readonly totalCostUsd: number;
|
|
27
|
-
|
|
35
|
+
/** Per role:model tuple breakdown */
|
|
36
|
+
readonly byRoleModel: Record<string, RoleUsage>;
|
|
28
37
|
}
|
|
29
|
-
export { CostTracker, MODEL_PRICING } from "./cost-tracker.js";
|
|
38
|
+
export { CostTracker, MODEL_PRICING, STT_PRICING, EMBEDDING_PRICING } from "./cost-tracker.js";
|
|
30
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cost/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjD;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/cost/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { CostTracker, MODEL_PRICING } from "./cost-tracker.js";
|
|
1
|
+
export { CostTracker, MODEL_PRICING, STT_PRICING, EMBEDDING_PRICING } from "./cost-tracker.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cost/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AA2CA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { DomainPackageManifest } from "../package/types.js";
|
|
|
2
2
|
export type { DomainPackageManifest } from "../package/types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Parse domain.yaml content into a DomainPackageManifest.
|
|
5
|
-
*
|
|
5
|
+
* Domain YAML does not require type/version/author (defaults applied).
|
|
6
6
|
* Uses domain YAML validator (not package validator).
|
|
7
7
|
*/
|
|
8
8
|
export declare function parseDomainPackageYaml(content: string, installPath: string, filePath?: string): DomainPackageManifest;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Domain package adapter: parses domain YAML into DomainPackageManifest with content hashing.
|
|
2
2
|
// Delegates to package/ bounded context for hashing and manifest types.
|
|
3
|
-
//
|
|
3
|
+
// Domain YAML does not require type/version/author fields (defaults applied).
|
|
4
4
|
import { parse } from "yaml";
|
|
5
5
|
import { readFileSync } from "node:fs";
|
|
6
6
|
import { validateDomainYaml } from "./yaml-schema.js";
|
|
@@ -8,7 +8,7 @@ import { DomainYamlError } from "./yaml-parser.js";
|
|
|
8
8
|
import { computeContentHash } from "../package/security.js";
|
|
9
9
|
/**
|
|
10
10
|
* Parse domain.yaml content into a DomainPackageManifest.
|
|
11
|
-
*
|
|
11
|
+
* Domain YAML does not require type/version/author (defaults applied).
|
|
12
12
|
* Uses domain YAML validator (not package validator).
|
|
13
13
|
*/
|
|
14
14
|
export function parseDomainPackageYaml(content, installPath, filePath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-package-adapter.js","sourceRoot":"","sources":["../../src/domain/domain-package-adapter.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wEAAwE;AACxE,
|
|
1
|
+
{"version":3,"file":"domain-package-adapter.js","sourceRoot":"","sources":["../../src/domain/domain-package-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TenantAgentConfig, TenantRoutingConfig } from "../engine/gateway/tenant-config.js";
|
|
2
|
+
export interface RoutingTemplate {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly description: string;
|
|
6
|
+
readonly category: "service" | "ecommerce" | "support" | "hospitality";
|
|
7
|
+
readonly agents: readonly TenantAgentConfig[];
|
|
8
|
+
readonly routing: TenantRoutingConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare function getRoutingTemplate(id: string): RoutingTemplate | undefined;
|
|
11
|
+
export declare function listRoutingTemplates(): readonly RoutingTemplate[];
|
|
12
|
+
//# sourceMappingURL=routing-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-templates.d.ts","sourceRoot":"","sources":["../../src/domains/routing-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACvE,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC;AAyGD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED,wBAAgB,oBAAoB,IAAI,SAAS,eAAe,EAAE,CAEjE"}
|