pi-smart-router 0.1.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/.pi/extensions/smart-router/command-formatters.ts +167 -0
- package/.pi/extensions/smart-router/commands.ts +242 -0
- package/.pi/extensions/smart-router/dataset-export.ts +142 -0
- package/.pi/extensions/smart-router/delegate-stream.ts +105 -0
- package/.pi/extensions/smart-router/delegation-runtime.ts +355 -0
- package/.pi/extensions/smart-router/extension-setup.ts +115 -0
- package/.pi/extensions/smart-router/fleet-bootstrap.ts +244 -0
- package/.pi/extensions/smart-router/index.ts +115 -0
- package/.pi/extensions/smart-router/package.json +3 -0
- package/.pi/extensions/smart-router/pi-model-scope.ts +55 -0
- package/.pi/extensions/smart-router/pricing-lifecycle.ts +43 -0
- package/.pi/extensions/smart-router/route-and-delegate.ts +562 -0
- package/.pi/extensions/smart-router/routing-context.ts +171 -0
- package/.pi/extensions/smart-router/routing-outcomes.ts +44 -0
- package/.pi/extensions/smart-router/session-lifecycle.ts +140 -0
- package/.pi/extensions/smart-router/stream-delegation.ts +75 -0
- package/.pi/extensions/smart-router/types.ts +90 -0
- package/.pi/extensions/smart-router/utils.ts +58 -0
- package/README.md +593 -0
- package/bin/pi-smart-router.mjs +79 -0
- package/config/.gitkeep +0 -0
- package/config/hydra-projection-weights.json.example +1169 -0
- package/config/models.yaml.example +58 -0
- package/config/p-success-weights.json.example +19 -0
- package/config/routing-calibration.json.example +1605 -0
- package/config/routing-centroids.json.example +1570 -0
- package/config/routing-clusters.yaml.example +41 -0
- package/data/contrib/example.json +25 -0
- package/dist/api/explain/router-explain.d.ts +47 -0
- package/dist/api/explain/router-explain.d.ts.map +1 -0
- package/dist/api/explain/router-explain.js +101 -0
- package/dist/api/explain/router-explain.js.map +1 -0
- package/dist/api/middleware/pi-router-middleware.d.ts +86 -0
- package/dist/api/middleware/pi-router-middleware.d.ts.map +1 -0
- package/dist/api/middleware/pi-router-middleware.js +83 -0
- package/dist/api/middleware/pi-router-middleware.js.map +1 -0
- package/dist/cli/smart-router-cli.d.ts +85 -0
- package/dist/cli/smart-router-cli.d.ts.map +1 -0
- package/dist/cli/smart-router-cli.js +293 -0
- package/dist/cli/smart-router-cli.js.map +1 -0
- package/dist/config/defaults.d.ts +7 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +33 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/models-loader.d.ts +22 -0
- package/dist/config/models-loader.d.ts.map +1 -0
- package/dist/config/models-loader.js +51 -0
- package/dist/config/models-loader.js.map +1 -0
- package/dist/config/pi-model-mapper.d.ts +40 -0
- package/dist/config/pi-model-mapper.d.ts.map +1 -0
- package/dist/config/pi-model-mapper.js +216 -0
- package/dist/config/pi-model-mapper.js.map +1 -0
- package/dist/config/routing-clusters-loader.d.ts +35 -0
- package/dist/config/routing-clusters-loader.d.ts.map +1 -0
- package/dist/config/routing-clusters-loader.js +100 -0
- package/dist/config/routing-clusters-loader.js.map +1 -0
- package/dist/domain/delegation/delegation-context.d.ts +23 -0
- package/dist/domain/delegation/delegation-context.d.ts.map +1 -0
- package/dist/domain/delegation/delegation-context.js +73 -0
- package/dist/domain/delegation/delegation-context.js.map +1 -0
- package/dist/domain/delegation/execution-ledger.d.ts +19 -0
- package/dist/domain/delegation/execution-ledger.d.ts.map +1 -0
- package/dist/domain/delegation/execution-ledger.js +23 -0
- package/dist/domain/delegation/execution-ledger.js.map +1 -0
- package/dist/domain/delegation/output-headroom.d.ts +39 -0
- package/dist/domain/delegation/output-headroom.d.ts.map +1 -0
- package/dist/domain/delegation/output-headroom.js +78 -0
- package/dist/domain/delegation/output-headroom.js.map +1 -0
- package/dist/domain/matching/cluster-matcher.d.ts +69 -0
- package/dist/domain/matching/cluster-matcher.d.ts.map +1 -0
- package/dist/domain/matching/cluster-matcher.js +294 -0
- package/dist/domain/matching/cluster-matcher.js.map +1 -0
- package/dist/domain/matching/embedding-provider.d.ts +21 -0
- package/dist/domain/matching/embedding-provider.d.ts.map +1 -0
- package/dist/domain/matching/embedding-provider.js +42 -0
- package/dist/domain/matching/embedding-provider.js.map +1 -0
- package/dist/domain/matching/hydra-input.d.ts +18 -0
- package/dist/domain/matching/hydra-input.d.ts.map +1 -0
- package/dist/domain/matching/hydra-input.js +40 -0
- package/dist/domain/matching/hydra-input.js.map +1 -0
- package/dist/domain/matching/hydra-matcher.d.ts +103 -0
- package/dist/domain/matching/hydra-matcher.d.ts.map +1 -0
- package/dist/domain/matching/hydra-matcher.js +275 -0
- package/dist/domain/matching/hydra-matcher.js.map +1 -0
- package/dist/domain/pinning/cache-economics.d.ts +53 -0
- package/dist/domain/pinning/cache-economics.d.ts.map +1 -0
- package/dist/domain/pinning/cache-economics.js +72 -0
- package/dist/domain/pinning/cache-economics.js.map +1 -0
- package/dist/domain/pinning/loop-escalation.d.ts +41 -0
- package/dist/domain/pinning/loop-escalation.d.ts.map +1 -0
- package/dist/domain/pinning/loop-escalation.js +137 -0
- package/dist/domain/pinning/loop-escalation.js.map +1 -0
- package/dist/domain/pinning/session-pinner.d.ts +81 -0
- package/dist/domain/pinning/session-pinner.d.ts.map +1 -0
- package/dist/domain/pinning/session-pinner.js +237 -0
- package/dist/domain/pinning/session-pinner.js.map +1 -0
- package/dist/domain/pinning/sub-route-policy.d.ts +41 -0
- package/dist/domain/pinning/sub-route-policy.d.ts.map +1 -0
- package/dist/domain/pinning/sub-route-policy.js +72 -0
- package/dist/domain/pinning/sub-route-policy.js.map +1 -0
- package/dist/domain/pipeline/router-pipeline.d.ts +180 -0
- package/dist/domain/pipeline/router-pipeline.d.ts.map +1 -0
- package/dist/domain/pipeline/router-pipeline.js +807 -0
- package/dist/domain/pipeline/router-pipeline.js.map +1 -0
- package/dist/domain/pipeline/safe-default.d.ts +25 -0
- package/dist/domain/pipeline/safe-default.d.ts.map +1 -0
- package/dist/domain/pipeline/safe-default.js +41 -0
- package/dist/domain/pipeline/safe-default.js.map +1 -0
- package/dist/domain/refactor-guardrails.d.ts +48 -0
- package/dist/domain/refactor-guardrails.d.ts.map +1 -0
- package/dist/domain/refactor-guardrails.js +129 -0
- package/dist/domain/refactor-guardrails.js.map +1 -0
- package/dist/domain/routing/context-fit.d.ts +53 -0
- package/dist/domain/routing/context-fit.d.ts.map +1 -0
- package/dist/domain/routing/context-fit.js +142 -0
- package/dist/domain/routing/context-fit.js.map +1 -0
- package/dist/domain/routing/expected-cost.d.ts +63 -0
- package/dist/domain/routing/expected-cost.d.ts.map +1 -0
- package/dist/domain/routing/expected-cost.js +177 -0
- package/dist/domain/routing/expected-cost.js.map +1 -0
- package/dist/domain/routing/p-success-classifier.d.ts +130 -0
- package/dist/domain/routing/p-success-classifier.d.ts.map +1 -0
- package/dist/domain/routing/p-success-classifier.js +350 -0
- package/dist/domain/routing/p-success-classifier.js.map +1 -0
- package/dist/domain/routing/tier-features.d.ts +70 -0
- package/dist/domain/routing/tier-features.d.ts.map +1 -0
- package/dist/domain/routing/tier-features.js +174 -0
- package/dist/domain/routing/tier-features.js.map +1 -0
- package/dist/domain/routing/tool-history-guard.d.ts +32 -0
- package/dist/domain/routing/tool-history-guard.d.ts.map +1 -0
- package/dist/domain/routing/tool-history-guard.js +110 -0
- package/dist/domain/routing/tool-history-guard.js.map +1 -0
- package/dist/domain/scoring/multi-objective.d.ts +48 -0
- package/dist/domain/scoring/multi-objective.d.ts.map +1 -0
- package/dist/domain/scoring/multi-objective.js +116 -0
- package/dist/domain/scoring/multi-objective.js.map +1 -0
- package/dist/domain/triage/triage-engine.d.ts +43 -0
- package/dist/domain/triage/triage-engine.d.ts.map +1 -0
- package/dist/domain/triage/triage-engine.js +317 -0
- package/dist/domain/triage/triage-engine.js.map +1 -0
- package/dist/domain/triage/turn-envelope.d.ts +17 -0
- package/dist/domain/triage/turn-envelope.d.ts.map +1 -0
- package/dist/domain/triage/turn-envelope.js +81 -0
- package/dist/domain/triage/turn-envelope.js.map +1 -0
- package/dist/domain/types/entities.d.ts +303 -0
- package/dist/domain/types/entities.d.ts.map +1 -0
- package/dist/domain/types/entities.js +6 -0
- package/dist/domain/types/entities.js.map +1 -0
- package/dist/domain/types/index.d.ts +4 -0
- package/dist/domain/types/index.d.ts.map +1 -0
- package/dist/domain/types/index.js +2 -0
- package/dist/domain/types/index.js.map +1 -0
- package/dist/domain/types/schemas.d.ts +346 -0
- package/dist/domain/types/schemas.d.ts.map +1 -0
- package/dist/domain/types/schemas.js +241 -0
- package/dist/domain/types/schemas.js.map +1 -0
- package/dist/domain/types/store-port.d.ts +44 -0
- package/dist/domain/types/store-port.d.ts.map +1 -0
- package/dist/domain/types/store-port.js +6 -0
- package/dist/domain/types/store-port.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/gemini-provider.d.ts +28 -0
- package/dist/infra/gemini-provider.d.ts.map +1 -0
- package/dist/infra/gemini-provider.js +112 -0
- package/dist/infra/gemini-provider.js.map +1 -0
- package/dist/infra/telemetry.d.ts +51 -0
- package/dist/infra/telemetry.d.ts.map +1 -0
- package/dist/infra/telemetry.js +100 -0
- package/dist/infra/telemetry.js.map +1 -0
- package/dist/infrastructure/delegation/provider-error.d.ts +44 -0
- package/dist/infrastructure/delegation/provider-error.d.ts.map +1 -0
- package/dist/infrastructure/delegation/provider-error.js +179 -0
- package/dist/infrastructure/delegation/provider-error.js.map +1 -0
- package/dist/infrastructure/gateway/circuit-breaker.d.ts +68 -0
- package/dist/infrastructure/gateway/circuit-breaker.d.ts.map +1 -0
- package/dist/infrastructure/gateway/circuit-breaker.js +150 -0
- package/dist/infrastructure/gateway/circuit-breaker.js.map +1 -0
- package/dist/infrastructure/gateway/gateway-dispatch.d.ts +138 -0
- package/dist/infrastructure/gateway/gateway-dispatch.d.ts.map +1 -0
- package/dist/infrastructure/gateway/gateway-dispatch.js +308 -0
- package/dist/infrastructure/gateway/gateway-dispatch.js.map +1 -0
- package/dist/infrastructure/hardware/hardware-probe.d.ts +32 -0
- package/dist/infrastructure/hardware/hardware-probe.d.ts.map +1 -0
- package/dist/infrastructure/hardware/hardware-probe.js +199 -0
- package/dist/infrastructure/hardware/hardware-probe.js.map +1 -0
- package/dist/infrastructure/local/local-zero-tier.d.ts +47 -0
- package/dist/infrastructure/local/local-zero-tier.d.ts.map +1 -0
- package/dist/infrastructure/local/local-zero-tier.js +92 -0
- package/dist/infrastructure/local/local-zero-tier.js.map +1 -0
- package/dist/infrastructure/persistence/memory-store.d.ts +31 -0
- package/dist/infrastructure/persistence/memory-store.d.ts.map +1 -0
- package/dist/infrastructure/persistence/memory-store.js +87 -0
- package/dist/infrastructure/persistence/memory-store.js.map +1 -0
- package/dist/infrastructure/persistence/sqlite-store.d.ts +81 -0
- package/dist/infrastructure/persistence/sqlite-store.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqlite-store.js +658 -0
- package/dist/infrastructure/persistence/sqlite-store.js.map +1 -0
- package/dist/infrastructure/pricing/litellm-fetch.d.ts +46 -0
- package/dist/infrastructure/pricing/litellm-fetch.d.ts.map +1 -0
- package/dist/infrastructure/pricing/litellm-fetch.js +145 -0
- package/dist/infrastructure/pricing/litellm-fetch.js.map +1 -0
- package/dist/infrastructure/pricing/price-broker.d.ts +56 -0
- package/dist/infrastructure/pricing/price-broker.d.ts.map +1 -0
- package/dist/infrastructure/pricing/price-broker.js +133 -0
- package/dist/infrastructure/pricing/price-broker.js.map +1 -0
- package/dist/infrastructure/pricing/pricing-monitor.d.ts +27 -0
- package/dist/infrastructure/pricing/pricing-monitor.d.ts.map +1 -0
- package/dist/infrastructure/pricing/pricing-monitor.js +46 -0
- package/dist/infrastructure/pricing/pricing-monitor.js.map +1 -0
- package/dist/infrastructure/telemetry/dataset-limits.d.ts +13 -0
- package/dist/infrastructure/telemetry/dataset-limits.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/dataset-limits.js +28 -0
- package/dist/infrastructure/telemetry/dataset-limits.js.map +1 -0
- package/dist/infrastructure/telemetry/dataset-recorder.d.ts +48 -0
- package/dist/infrastructure/telemetry/dataset-recorder.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/dataset-recorder.js +154 -0
- package/dist/infrastructure/telemetry/dataset-recorder.js.map +1 -0
- package/dist/infrastructure/telemetry/outcome-limits.d.ts +12 -0
- package/dist/infrastructure/telemetry/outcome-limits.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/outcome-limits.js +28 -0
- package/dist/infrastructure/telemetry/outcome-limits.js.map +1 -0
- package/dist/infrastructure/telemetry/outcome-recorder.d.ts +29 -0
- package/dist/infrastructure/telemetry/outcome-recorder.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/outcome-recorder.js +49 -0
- package/dist/infrastructure/telemetry/outcome-recorder.js.map +1 -0
- package/dist/infrastructure/telemetry/routing-telemetry.d.ts +115 -0
- package/dist/infrastructure/telemetry/routing-telemetry.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/routing-telemetry.js +529 -0
- package/dist/infrastructure/telemetry/routing-telemetry.js.map +1 -0
- package/dist/infrastructure/telemetry/telemetry-limits.d.ts +16 -0
- package/dist/infrastructure/telemetry/telemetry-limits.d.ts.map +1 -0
- package/dist/infrastructure/telemetry/telemetry-limits.js +35 -0
- package/dist/infrastructure/telemetry/telemetry-limits.js.map +1 -0
- package/package.json +110 -0
- package/skills/router-backlog-orchestrator/SKILL.md +183 -0
- package/skills/router-backlog-orchestrator/references/github-router-issue-template.md +78 -0
- package/skills/router-backlog-orchestrator/references/packet-from-issue.md +99 -0
- package/skills/router-backlog-orchestrator/references/prioritization-rubric.md +65 -0
- package/skills/router-backlog-orchestrator/scripts/collect-backlog.sh +44 -0
- package/specs/001-build-smart-router/contracts/telemetry-contrib.schema.json +151 -0
- package/src/api/explain/.gitkeep +0 -0
- package/src/api/explain/router-explain.ts +146 -0
- package/src/api/middleware/.gitkeep +0 -0
- package/src/api/middleware/pi-router-middleware.ts +169 -0
- package/src/cli/smart-router-cli.ts +436 -0
- package/src/config/.gitkeep +0 -0
- package/src/config/defaults.ts +35 -0
- package/src/config/models-loader.ts +68 -0
- package/src/config/pi-model-mapper.ts +285 -0
- package/src/config/routing-clusters-loader.ts +148 -0
- package/src/domain/delegation/delegation-context.ts +111 -0
- package/src/domain/delegation/execution-ledger.ts +34 -0
- package/src/domain/delegation/output-headroom.ts +131 -0
- package/src/domain/matching/.gitkeep +0 -0
- package/src/domain/matching/cluster-matcher.ts +474 -0
- package/src/domain/matching/embedding-provider.ts +79 -0
- package/src/domain/matching/hydra-input.ts +53 -0
- package/src/domain/matching/hydra-matcher.ts +454 -0
- package/src/domain/pinning/.gitkeep +0 -0
- package/src/domain/pinning/cache-economics.ts +128 -0
- package/src/domain/pinning/loop-escalation.ts +181 -0
- package/src/domain/pinning/session-pinner.ts +388 -0
- package/src/domain/pinning/sub-route-policy.ts +119 -0
- package/src/domain/pipeline/.gitkeep +0 -0
- package/src/domain/pipeline/router-pipeline.ts +1139 -0
- package/src/domain/pipeline/safe-default.ts +70 -0
- package/src/domain/refactor-guardrails.ts +202 -0
- package/src/domain/routing/context-fit.ts +221 -0
- package/src/domain/routing/expected-cost.ts +320 -0
- package/src/domain/routing/p-success-classifier.ts +511 -0
- package/src/domain/routing/tier-features.ts +290 -0
- package/src/domain/routing/tool-history-guard.ts +159 -0
- package/src/domain/scoring/.gitkeep +0 -0
- package/src/domain/scoring/multi-objective.ts +175 -0
- package/src/domain/triage/.gitkeep +0 -0
- package/src/domain/triage/triage-engine.ts +373 -0
- package/src/domain/triage/turn-envelope.ts +104 -0
- package/src/domain/types/.gitkeep +0 -0
- package/src/domain/types/entities.ts +384 -0
- package/src/domain/types/index.ts +41 -0
- package/src/domain/types/schemas.ts +289 -0
- package/src/domain/types/store-port.ts +59 -0
- package/src/index.ts +103 -0
- package/src/infra/gemini-provider.ts +142 -0
- package/src/infra/telemetry.ts +169 -0
- package/src/infrastructure/delegation/provider-error.ts +251 -0
- package/src/infrastructure/gateway/.gitkeep +0 -0
- package/src/infrastructure/gateway/circuit-breaker.ts +196 -0
- package/src/infrastructure/gateway/gateway-dispatch.ts +444 -0
- package/src/infrastructure/hardware/.gitkeep +0 -0
- package/src/infrastructure/hardware/hardware-probe.ts +276 -0
- package/src/infrastructure/local/.gitkeep +0 -0
- package/src/infrastructure/local/local-zero-tier.ts +151 -0
- package/src/infrastructure/persistence/.gitkeep +0 -0
- package/src/infrastructure/persistence/memory-store.ts +122 -0
- package/src/infrastructure/persistence/sqlite-store.ts +900 -0
- package/src/infrastructure/pricing/.gitkeep +0 -0
- package/src/infrastructure/pricing/litellm-fetch.ts +215 -0
- package/src/infrastructure/pricing/price-broker.ts +183 -0
- package/src/infrastructure/pricing/pricing-monitor.ts +65 -0
- package/src/infrastructure/telemetry/.gitkeep +0 -0
- package/src/infrastructure/telemetry/dataset-limits.ts +39 -0
- package/src/infrastructure/telemetry/dataset-recorder.ts +215 -0
- package/src/infrastructure/telemetry/outcome-limits.ts +42 -0
- package/src/infrastructure/telemetry/outcome-recorder.ts +118 -0
- package/src/infrastructure/telemetry/routing-telemetry.ts +824 -0
- package/src/infrastructure/telemetry/telemetry-limits.ts +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p-success-classifier.js","sourceRoot":"","sources":["../../../src/domain/routing/p-success-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier selection feature vector — SP-102, GitHub #57.
|
|
3
|
+
*
|
|
4
|
+
* Aggregates structural and envelope signals into a pure feature vector and
|
|
5
|
+
* low-intensity score for tier gating (SP-103). No I/O.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClusterMatchResult } from '../matching/cluster-matcher.js';
|
|
8
|
+
import type { RequirementVector } from '../types/entities.js';
|
|
9
|
+
import type { RoutingRequest, Tier, TurnType } from '../types/index.js';
|
|
10
|
+
import type { TriageResult, TriageVerdict } from '../triage/triage-engine.js';
|
|
11
|
+
export declare const PROMPT_LENGTH_NORM = 8000;
|
|
12
|
+
export declare const TOKEN_NORM = 2000;
|
|
13
|
+
export declare const MESSAGE_COUNT_NORM = 20;
|
|
14
|
+
export declare const MAX_KEYWORD_HITS = 3;
|
|
15
|
+
export interface TierFeatureVector {
|
|
16
|
+
readonly prompt_length_chars: number;
|
|
17
|
+
readonly estimated_input_tokens: number;
|
|
18
|
+
readonly cyclomatic_score: number;
|
|
19
|
+
readonly triage_verdict: TriageVerdict;
|
|
20
|
+
readonly trivial_hits: number;
|
|
21
|
+
readonly complex_hits: number;
|
|
22
|
+
readonly sanitized_length_delta: number;
|
|
23
|
+
readonly turn_type: TurnType;
|
|
24
|
+
readonly has_tool_context: boolean;
|
|
25
|
+
readonly message_count: number;
|
|
26
|
+
readonly code_block_ratio: number;
|
|
27
|
+
readonly requirement_reasoning: number;
|
|
28
|
+
readonly requirement_code_gen: number;
|
|
29
|
+
readonly requirement_tool_use: number;
|
|
30
|
+
readonly requirement_magnitude: number;
|
|
31
|
+
readonly cluster_similarity: number | null;
|
|
32
|
+
readonly cluster_margin: number | null;
|
|
33
|
+
readonly cluster_confidence: ClusterMatchResult['confidence'] | null;
|
|
34
|
+
readonly cluster_id: string | null;
|
|
35
|
+
readonly cluster_tier_bias: Tier | null;
|
|
36
|
+
}
|
|
37
|
+
/** Scalar tier features safe for dataset export (no prompt text). */
|
|
38
|
+
export interface TierFeatureDatasetScalars {
|
|
39
|
+
readonly triage_trivial_hits: number;
|
|
40
|
+
readonly triage_complex_hits: number;
|
|
41
|
+
readonly triage_sanitized_length_delta: number;
|
|
42
|
+
readonly code_block_ratio: number;
|
|
43
|
+
readonly requirement_magnitude: number;
|
|
44
|
+
readonly cluster_similarity: number | null;
|
|
45
|
+
readonly cluster_margin: number | null;
|
|
46
|
+
readonly low_intensity_score: number;
|
|
47
|
+
}
|
|
48
|
+
export interface LowIntensityWeights {
|
|
49
|
+
readonly prompt_shortness: number;
|
|
50
|
+
readonly token_shortness: number;
|
|
51
|
+
readonly cyclomatic_low: number;
|
|
52
|
+
readonly trivial_signal: number;
|
|
53
|
+
readonly complex_inverse: number;
|
|
54
|
+
readonly triage_verdict: number;
|
|
55
|
+
readonly turn_type: number;
|
|
56
|
+
readonly no_tool_context: number;
|
|
57
|
+
readonly message_shallow: number;
|
|
58
|
+
readonly prose_ratio: number;
|
|
59
|
+
readonly requirement_low: number;
|
|
60
|
+
readonly cluster_signal: number;
|
|
61
|
+
}
|
|
62
|
+
export declare const DEFAULT_LOW_INTENSITY_WEIGHTS: Readonly<LowIntensityWeights>;
|
|
63
|
+
/** Ratio of fenced code block characters to total prompt length (0..1). */
|
|
64
|
+
export declare function computeCodeBlockRatio(promptText: string): number;
|
|
65
|
+
export declare function buildTierFeatures(request: RoutingRequest, triage: TriageResult, hydraRequirements?: RequirementVector, clusterMatch?: ClusterMatchResult): TierFeatureVector;
|
|
66
|
+
/** Weighted combination of normalized signals; 1 = strongly low-intensity. */
|
|
67
|
+
export declare function scoreLowIntensity(features: TierFeatureVector, weights?: LowIntensityWeights): number;
|
|
68
|
+
/** Map tier features to privacy-safe dataset scalars for training export. */
|
|
69
|
+
export declare function exportTierFeaturesForDataset(features: TierFeatureVector, lowIntensityScore: number): TierFeatureDatasetScalars;
|
|
70
|
+
//# sourceMappingURL=tier-features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-features.d.ts","sourceRoot":"","sources":["../../../src/domain/routing/tier-features.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier selection feature vector — SP-102, GitHub #57.
|
|
3
|
+
*
|
|
4
|
+
* Aggregates structural and envelope signals into a pure feature vector and
|
|
5
|
+
* low-intensity score for tier gating (SP-103). No I/O.
|
|
6
|
+
*/
|
|
7
|
+
import { CYCLOMATIC_THRESHOLD } from '../triage/triage-engine.js';
|
|
8
|
+
// ─── Normalization constants ─────────────────────────────────────────────────
|
|
9
|
+
export const PROMPT_LENGTH_NORM = 8_000;
|
|
10
|
+
export const TOKEN_NORM = 2_000;
|
|
11
|
+
export const MESSAGE_COUNT_NORM = 20;
|
|
12
|
+
export const MAX_KEYWORD_HITS = 3;
|
|
13
|
+
export const DEFAULT_LOW_INTENSITY_WEIGHTS = {
|
|
14
|
+
prompt_shortness: 0.06,
|
|
15
|
+
token_shortness: 0.05,
|
|
16
|
+
cyclomatic_low: 0.08,
|
|
17
|
+
trivial_signal: 0.1,
|
|
18
|
+
complex_inverse: 0.14,
|
|
19
|
+
triage_verdict: 0.18,
|
|
20
|
+
turn_type: 0.18,
|
|
21
|
+
no_tool_context: 0.05,
|
|
22
|
+
message_shallow: 0.03,
|
|
23
|
+
prose_ratio: 0.03,
|
|
24
|
+
requirement_low: 0.12,
|
|
25
|
+
cluster_signal: 0.08,
|
|
26
|
+
};
|
|
27
|
+
const TRIAGE_VERDICT_LOW_INTENSITY = {
|
|
28
|
+
trivial: 1,
|
|
29
|
+
ambiguous: 0.55,
|
|
30
|
+
complex: 0,
|
|
31
|
+
};
|
|
32
|
+
const TURN_TYPE_LOW_INTENSITY = {
|
|
33
|
+
planning: 0,
|
|
34
|
+
tool_result: 0.25,
|
|
35
|
+
subagent: 0.35,
|
|
36
|
+
main_loop: 0.55,
|
|
37
|
+
unknown: 0.5,
|
|
38
|
+
};
|
|
39
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
40
|
+
function clamp01(value) {
|
|
41
|
+
if (value <= 0)
|
|
42
|
+
return 0;
|
|
43
|
+
if (value >= 1)
|
|
44
|
+
return 1;
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
function resolveEstimatedInputTokens(request) {
|
|
48
|
+
return request.estimated_input_tokens ?? Math.ceil(request.prompt_text.length / 4);
|
|
49
|
+
}
|
|
50
|
+
function hasToolContext(request) {
|
|
51
|
+
if (request.turn_type === 'tool_result') {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return request.messages?.some((message) => message.role === 'tool') ?? false;
|
|
55
|
+
}
|
|
56
|
+
/** Ratio of fenced code block characters to total prompt length (0..1). */
|
|
57
|
+
export function computeCodeBlockRatio(promptText) {
|
|
58
|
+
if (promptText.length === 0) {
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
let codeChars = 0;
|
|
62
|
+
for (const match of promptText.matchAll(/```[\s\S]*?```/g)) {
|
|
63
|
+
codeChars += match[0].length;
|
|
64
|
+
}
|
|
65
|
+
return clamp01(codeChars / promptText.length);
|
|
66
|
+
}
|
|
67
|
+
function resolveRequirementFields(hydraRequirements) {
|
|
68
|
+
const reasoning = hydraRequirements?.reasoning ?? 0;
|
|
69
|
+
const code_gen = hydraRequirements?.code_gen ?? 0;
|
|
70
|
+
const tool_use = hydraRequirements?.tool_use ?? 0;
|
|
71
|
+
return {
|
|
72
|
+
requirement_reasoning: reasoning,
|
|
73
|
+
requirement_code_gen: code_gen,
|
|
74
|
+
requirement_tool_use: tool_use,
|
|
75
|
+
requirement_magnitude: Math.max(reasoning, code_gen, tool_use),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function clusterLowIntensitySignal(clusterMatch) {
|
|
79
|
+
if (!clusterMatch || clusterMatch.confidence !== 'high') {
|
|
80
|
+
return 0.5;
|
|
81
|
+
}
|
|
82
|
+
const lowStakes = clusterMatch.tierBias === 'zero-tier' ||
|
|
83
|
+
clusterMatch.tierBias === 'economical-cloud';
|
|
84
|
+
return lowStakes ? clusterMatch.similarity : 1 - clusterMatch.similarity;
|
|
85
|
+
}
|
|
86
|
+
function sumWeights(weights) {
|
|
87
|
+
return (weights.prompt_shortness +
|
|
88
|
+
weights.token_shortness +
|
|
89
|
+
weights.cyclomatic_low +
|
|
90
|
+
weights.trivial_signal +
|
|
91
|
+
weights.complex_inverse +
|
|
92
|
+
weights.triage_verdict +
|
|
93
|
+
weights.turn_type +
|
|
94
|
+
weights.no_tool_context +
|
|
95
|
+
weights.message_shallow +
|
|
96
|
+
weights.prose_ratio +
|
|
97
|
+
weights.requirement_low +
|
|
98
|
+
weights.cluster_signal);
|
|
99
|
+
}
|
|
100
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
101
|
+
export function buildTierFeatures(request, triage, hydraRequirements, clusterMatch) {
|
|
102
|
+
const requirements = resolveRequirementFields(hydraRequirements);
|
|
103
|
+
return {
|
|
104
|
+
prompt_length_chars: request.prompt_text.length,
|
|
105
|
+
estimated_input_tokens: resolveEstimatedInputTokens(request),
|
|
106
|
+
cyclomatic_score: triage.cyclomatic_score,
|
|
107
|
+
triage_verdict: triage.verdict,
|
|
108
|
+
trivial_hits: triage.trivial_hits,
|
|
109
|
+
complex_hits: triage.complex_hits,
|
|
110
|
+
sanitized_length_delta: triage.sanitized_length_delta,
|
|
111
|
+
turn_type: request.turn_type ?? 'unknown',
|
|
112
|
+
has_tool_context: hasToolContext(request),
|
|
113
|
+
message_count: request.messages?.length ?? 0,
|
|
114
|
+
code_block_ratio: computeCodeBlockRatio(request.prompt_text),
|
|
115
|
+
...requirements,
|
|
116
|
+
cluster_similarity: clusterMatch?.similarity ?? null,
|
|
117
|
+
cluster_margin: clusterMatch?.margin ?? null,
|
|
118
|
+
cluster_confidence: clusterMatch?.confidence ?? null,
|
|
119
|
+
cluster_id: clusterMatch?.clusterId ?? null,
|
|
120
|
+
cluster_tier_bias: clusterMatch?.tierBias ?? null,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Weighted combination of normalized signals; 1 = strongly low-intensity. */
|
|
124
|
+
export function scoreLowIntensity(features, weights = DEFAULT_LOW_INTENSITY_WEIGHTS) {
|
|
125
|
+
const promptShortness = 1 - clamp01(features.prompt_length_chars / PROMPT_LENGTH_NORM);
|
|
126
|
+
const tokenShortness = 1 - clamp01(features.estimated_input_tokens / TOKEN_NORM);
|
|
127
|
+
const cyclomaticLow = 1 - clamp01(features.cyclomatic_score / CYCLOMATIC_THRESHOLD);
|
|
128
|
+
const trivialSignal = clamp01(features.trivial_hits / MAX_KEYWORD_HITS);
|
|
129
|
+
const complexInverse = 1 - clamp01(features.complex_hits / MAX_KEYWORD_HITS);
|
|
130
|
+
const triageVerdictSignal = TRIAGE_VERDICT_LOW_INTENSITY[features.triage_verdict];
|
|
131
|
+
const turnTypeSignal = TURN_TYPE_LOW_INTENSITY[features.turn_type];
|
|
132
|
+
const noToolContext = features.has_tool_context ? 0 : 1;
|
|
133
|
+
const messageShallow = 1 - clamp01(features.message_count / MESSAGE_COUNT_NORM);
|
|
134
|
+
const proseRatio = 1 - features.code_block_ratio;
|
|
135
|
+
const requirementLow = 1 - clamp01(features.requirement_magnitude);
|
|
136
|
+
const clusterSignal = clusterLowIntensitySignal(features.cluster_similarity === null
|
|
137
|
+
? undefined
|
|
138
|
+
: {
|
|
139
|
+
similarity: features.cluster_similarity,
|
|
140
|
+
confidence: features.cluster_confidence ?? 'none',
|
|
141
|
+
tierBias: features.cluster_tier_bias ?? 'frontier-cloud',
|
|
142
|
+
});
|
|
143
|
+
const weighted = weights.prompt_shortness * promptShortness +
|
|
144
|
+
weights.token_shortness * tokenShortness +
|
|
145
|
+
weights.cyclomatic_low * cyclomaticLow +
|
|
146
|
+
weights.trivial_signal * trivialSignal +
|
|
147
|
+
weights.complex_inverse * complexInverse +
|
|
148
|
+
weights.triage_verdict * triageVerdictSignal +
|
|
149
|
+
weights.turn_type * turnTypeSignal +
|
|
150
|
+
weights.no_tool_context * noToolContext +
|
|
151
|
+
weights.message_shallow * messageShallow +
|
|
152
|
+
weights.prose_ratio * proseRatio +
|
|
153
|
+
weights.requirement_low * requirementLow +
|
|
154
|
+
weights.cluster_signal * clusterSignal;
|
|
155
|
+
const totalWeight = sumWeights(weights);
|
|
156
|
+
if (totalWeight <= 0) {
|
|
157
|
+
return 0.5;
|
|
158
|
+
}
|
|
159
|
+
return clamp01(weighted / totalWeight);
|
|
160
|
+
}
|
|
161
|
+
/** Map tier features to privacy-safe dataset scalars for training export. */
|
|
162
|
+
export function exportTierFeaturesForDataset(features, lowIntensityScore) {
|
|
163
|
+
return {
|
|
164
|
+
triage_trivial_hits: features.trivial_hits,
|
|
165
|
+
triage_complex_hits: features.complex_hits,
|
|
166
|
+
triage_sanitized_length_delta: features.sanitized_length_delta,
|
|
167
|
+
code_block_ratio: features.code_block_ratio,
|
|
168
|
+
requirement_magnitude: features.requirement_magnitude,
|
|
169
|
+
cluster_similarity: features.cluster_similarity,
|
|
170
|
+
cluster_margin: features.cluster_margin,
|
|
171
|
+
low_intensity_score: lowIntensityScore,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=tier-features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-features.js","sourceRoot":"","sources":["../../../src/domain/routing/tier-features.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini tool-history guard — SP-077.
|
|
3
|
+
*
|
|
4
|
+
* Excludes Google/Gemini fleet entries when session history contains prior
|
|
5
|
+
* tool calls, avoiding thought_signature 400s until pi preserves replay
|
|
6
|
+
* signatures upstream (earendil-works/pi#6342).
|
|
7
|
+
*/
|
|
8
|
+
import type { Message as PiMessage } from '@earendil-works/pi-ai/compat';
|
|
9
|
+
import type { Message as RoutingMessage, ModelProfile, RoutingRequest } from '../types/index.js';
|
|
10
|
+
export declare const GEMINI_TOOL_HISTORY_EXCLUDED: "gemini_tool_history_excluded";
|
|
11
|
+
export declare const GEMINI_TOOL_HISTORY_EMPTY_FLEET: "gemini_tool_history_empty_fleet";
|
|
12
|
+
export interface GeminiToolHistoryGuardResult {
|
|
13
|
+
readonly effectiveFleet: readonly ModelProfile[];
|
|
14
|
+
readonly excluded: boolean;
|
|
15
|
+
readonly reasonCode?: typeof GEMINI_TOOL_HISTORY_EXCLUDED;
|
|
16
|
+
/** True when Gemini exclusion removed every fleet entry (SP-084). */
|
|
17
|
+
readonly fleetEmptyAfterFilter?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class GeminiToolHistoryEmptyFleetError extends Error {
|
|
20
|
+
readonly reasonCode: "gemini_tool_history_empty_fleet";
|
|
21
|
+
constructor();
|
|
22
|
+
}
|
|
23
|
+
export declare function assertRoutableFleetAfterGeminiToolHistoryGuard(result: GeminiToolHistoryGuardResult): void;
|
|
24
|
+
export declare function isGoogleGeminiProfile(profile: ModelProfile): boolean;
|
|
25
|
+
export declare function hasToolCallHistoryFromContext(messages: readonly PiMessage[]): boolean;
|
|
26
|
+
export declare function hasToolCallHistory(messages: readonly RoutingMessage[]): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Apply Gemini exclusion when tool history is present.
|
|
29
|
+
* Honors `force_model_id` by returning the unfiltered fleet.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveEffectiveFleet(fleet: readonly ModelProfile[], request: RoutingRequest, contextMessages?: readonly PiMessage[]): GeminiToolHistoryGuardResult;
|
|
32
|
+
//# sourceMappingURL=tool-history-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-history-guard.d.ts","sourceRoot":"","sources":["../../../src/domain/routing/tool-history-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEjG,eAAO,MAAM,4BAA4B,EAAG,8BAAuC,CAAC;AACpF,eAAO,MAAM,+BAA+B,EAAG,iCAA0C,CAAC;AAS1F,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,YAAY,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,4BAA4B,CAAC;IAC1D,qEAAqE;IACrE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,QAAQ,CAAC,UAAU,oCAAmC;;CAUvD;AAED,wBAAgB,8CAA8C,CAC5D,MAAM,EAAE,4BAA4B,GACnC,IAAI,CAIN;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAgBpE;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,SAAS,SAAS,EAAE,GAC7B,OAAO,CAgBT;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,OAAO,CAcT;AAiBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,SAAS,SAAS,EAAE,GACrC,4BAA4B,CA4B9B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini tool-history guard — SP-077.
|
|
3
|
+
*
|
|
4
|
+
* Excludes Google/Gemini fleet entries when session history contains prior
|
|
5
|
+
* tool calls, avoiding thought_signature 400s until pi preserves replay
|
|
6
|
+
* signatures upstream (earendil-works/pi#6342).
|
|
7
|
+
*/
|
|
8
|
+
export const GEMINI_TOOL_HISTORY_EXCLUDED = 'gemini_tool_history_excluded';
|
|
9
|
+
export const GEMINI_TOOL_HISTORY_EMPTY_FLEET = 'gemini_tool_history_empty_fleet';
|
|
10
|
+
const GOOGLE_GEMINI_PROVIDER_ALIASES = new Set([
|
|
11
|
+
'google',
|
|
12
|
+
'google-gemini',
|
|
13
|
+
'google-generative-ai',
|
|
14
|
+
'gemini',
|
|
15
|
+
]);
|
|
16
|
+
export class GeminiToolHistoryEmptyFleetError extends Error {
|
|
17
|
+
reasonCode = GEMINI_TOOL_HISTORY_EMPTY_FLEET;
|
|
18
|
+
constructor() {
|
|
19
|
+
super('Gemini tool-history guard removed all models from the scoped fleet. ' +
|
|
20
|
+
'Add a non-Google model (e.g. openai/gpt-4o-mini or cursor/auto), start a fresh session with /new, ' +
|
|
21
|
+
'or pin a model with /model until pi preserves thought signatures upstream (earendil-works/pi#6342).');
|
|
22
|
+
this.name = 'GeminiToolHistoryEmptyFleetError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function assertRoutableFleetAfterGeminiToolHistoryGuard(result) {
|
|
26
|
+
if (result.fleetEmptyAfterFilter) {
|
|
27
|
+
throw new GeminiToolHistoryEmptyFleetError();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function isGoogleGeminiProfile(profile) {
|
|
31
|
+
const provider = profile.provider.trim().toLowerCase();
|
|
32
|
+
if (GOOGLE_GEMINI_PROVIDER_ALIASES.has(provider)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (provider.includes('google') || provider.includes('gemini')) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// Cursor Gemini aliases may register under cursor with gemini model ids.
|
|
39
|
+
if (provider === 'cursor' && /gemini/i.test(profile.id)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return /gemini/i.test(profile.id) && provider.includes('google');
|
|
43
|
+
}
|
|
44
|
+
export function hasToolCallHistoryFromContext(messages) {
|
|
45
|
+
for (const message of messages) {
|
|
46
|
+
if (message.role === 'toolResult') {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (message.role === 'assistant') {
|
|
50
|
+
for (const block of message.content) {
|
|
51
|
+
if (block.type === 'toolCall') {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
export function hasToolCallHistory(messages) {
|
|
60
|
+
for (const message of messages) {
|
|
61
|
+
if (message.role === 'tool') {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (message.role === 'assistant') {
|
|
65
|
+
if (message.tool_blocks !== undefined && message.tool_blocks.length > 0) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
function sessionHasToolCallHistory(request, contextMessages) {
|
|
73
|
+
if (contextMessages !== undefined && contextMessages.length > 0) {
|
|
74
|
+
return hasToolCallHistoryFromContext(contextMessages);
|
|
75
|
+
}
|
|
76
|
+
if (request.messages !== undefined && request.messages.length > 0) {
|
|
77
|
+
return hasToolCallHistory(request.messages);
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Apply Gemini exclusion when tool history is present.
|
|
83
|
+
* Honors `force_model_id` by returning the unfiltered fleet.
|
|
84
|
+
*/
|
|
85
|
+
export function resolveEffectiveFleet(fleet, request, contextMessages) {
|
|
86
|
+
if (request.force_model_id) {
|
|
87
|
+
return { effectiveFleet: fleet, excluded: false };
|
|
88
|
+
}
|
|
89
|
+
if (!sessionHasToolCallHistory(request, contextMessages)) {
|
|
90
|
+
return { effectiveFleet: fleet, excluded: false };
|
|
91
|
+
}
|
|
92
|
+
const filtered = fleet.filter((profile) => !isGoogleGeminiProfile(profile));
|
|
93
|
+
if (filtered.length === fleet.length) {
|
|
94
|
+
return { effectiveFleet: fleet, excluded: false };
|
|
95
|
+
}
|
|
96
|
+
if (filtered.length === 0) {
|
|
97
|
+
return {
|
|
98
|
+
effectiveFleet: filtered,
|
|
99
|
+
excluded: true,
|
|
100
|
+
reasonCode: GEMINI_TOOL_HISTORY_EXCLUDED,
|
|
101
|
+
fleetEmptyAfterFilter: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
effectiveFleet: filtered,
|
|
106
|
+
excluded: true,
|
|
107
|
+
reasonCode: GEMINI_TOOL_HISTORY_EXCLUDED,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=tool-history-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-history-guard.js","sourceRoot":"","sources":["../../../src/domain/routing/tool-history-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-objective scoring — T049, FR-021.
|
|
3
|
+
*
|
|
4
|
+
* Re-ranks HyDRA match candidates using operator-configured frugality
|
|
5
|
+
* weights (lambda_cost, lambda_latency, lambda_verbosity). At quality
|
|
6
|
+
* parity (shortfall gate already applied by HydraMatcher), the scorer
|
|
7
|
+
* penalizes cost, latency, and verbosity to prefer cheaper/faster/leaner
|
|
8
|
+
* models.
|
|
9
|
+
*
|
|
10
|
+
* Score formula:
|
|
11
|
+
* score = capability_score
|
|
12
|
+
* - lambda_cost * norm_cost
|
|
13
|
+
* - lambda_latency * norm_latency
|
|
14
|
+
* - lambda_verbosity * norm_verbosity
|
|
15
|
+
*
|
|
16
|
+
* Normalization is min-max across the viable candidate set so penalties
|
|
17
|
+
* are scale-invariant. Missing performance fields default to fleet
|
|
18
|
+
* median behavior (0.5 normalized).
|
|
19
|
+
*/
|
|
20
|
+
import type { CandidateScore, ModelProfile } from '../types/index.js';
|
|
21
|
+
export interface FrugalityWeights {
|
|
22
|
+
readonly lambda_cost: number;
|
|
23
|
+
readonly lambda_latency: number;
|
|
24
|
+
readonly lambda_verbosity: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ScoredCandidate {
|
|
27
|
+
readonly model_id: string;
|
|
28
|
+
readonly capability_score: number;
|
|
29
|
+
readonly cost_penalty: number;
|
|
30
|
+
readonly latency_penalty: number;
|
|
31
|
+
readonly verbosity_penalty: number;
|
|
32
|
+
readonly composite_score: number;
|
|
33
|
+
readonly rejected_reason: string | null;
|
|
34
|
+
}
|
|
35
|
+
export interface MultiObjectiveResult {
|
|
36
|
+
readonly selected: ScoredCandidate | null;
|
|
37
|
+
readonly candidates: readonly ScoredCandidate[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Score and re-rank candidates with multi-objective cost/latency/verbosity
|
|
41
|
+
* penalties.
|
|
42
|
+
*
|
|
43
|
+
* @param hydraScores - CandidateScore array from HydraMatcher (post-shortfall-gate)
|
|
44
|
+
* @param fleet - Full fleet for metric lookup
|
|
45
|
+
* @param weights - Operator frugality config (lambda_cost, lambda_latency, lambda_verbosity)
|
|
46
|
+
*/
|
|
47
|
+
export declare function scoreMultiObjective(hydraScores: readonly CandidateScore[], fleet: readonly ModelProfile[], weights: FrugalityWeights): MultiObjectiveResult;
|
|
48
|
+
//# sourceMappingURL=multi-objective.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-objective.d.ts","sourceRoot":"","sources":["../../../src/domain/scoring/multi-objective.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAID,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AA6CD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,SAAS,cAAc,EAAE,EACtC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,EAAE,gBAAgB,GACxB,oBAAoB,CAwEtB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-objective scoring — T049, FR-021.
|
|
3
|
+
*
|
|
4
|
+
* Re-ranks HyDRA match candidates using operator-configured frugality
|
|
5
|
+
* weights (lambda_cost, lambda_latency, lambda_verbosity). At quality
|
|
6
|
+
* parity (shortfall gate already applied by HydraMatcher), the scorer
|
|
7
|
+
* penalizes cost, latency, and verbosity to prefer cheaper/faster/leaner
|
|
8
|
+
* models.
|
|
9
|
+
*
|
|
10
|
+
* Score formula:
|
|
11
|
+
* score = capability_score
|
|
12
|
+
* - lambda_cost * norm_cost
|
|
13
|
+
* - lambda_latency * norm_latency
|
|
14
|
+
* - lambda_verbosity * norm_verbosity
|
|
15
|
+
*
|
|
16
|
+
* Normalization is min-max across the viable candidate set so penalties
|
|
17
|
+
* are scale-invariant. Missing performance fields default to fleet
|
|
18
|
+
* median behavior (0.5 normalized).
|
|
19
|
+
*/
|
|
20
|
+
// ─── Normalization helpers ───────────────────────────────────────────────────
|
|
21
|
+
const MIDPOINT = 0.5;
|
|
22
|
+
function rangeOf(values) {
|
|
23
|
+
if (values.length === 0)
|
|
24
|
+
return { min: 0, max: 0 };
|
|
25
|
+
let min = Infinity;
|
|
26
|
+
let max = -Infinity;
|
|
27
|
+
for (const v of values) {
|
|
28
|
+
if (v < min)
|
|
29
|
+
min = v;
|
|
30
|
+
if (v > max)
|
|
31
|
+
max = v;
|
|
32
|
+
}
|
|
33
|
+
return { min, max };
|
|
34
|
+
}
|
|
35
|
+
function normalize(value, range) {
|
|
36
|
+
if (range.max === range.min)
|
|
37
|
+
return MIDPOINT;
|
|
38
|
+
return (value - range.min) / (range.max - range.min);
|
|
39
|
+
}
|
|
40
|
+
function extractMetrics(profile) {
|
|
41
|
+
return {
|
|
42
|
+
cost: profile.pricing.quota_cost_per_1m ?? profile.pricing.fallback_cost_per_1m,
|
|
43
|
+
latency: profile.performance?.latency_p50_ms ?? 0,
|
|
44
|
+
verbosity: profile.performance?.verbosity_factor ?? 1,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// ─── Scorer ──────────────────────────────────────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* Score and re-rank candidates with multi-objective cost/latency/verbosity
|
|
50
|
+
* penalties.
|
|
51
|
+
*
|
|
52
|
+
* @param hydraScores - CandidateScore array from HydraMatcher (post-shortfall-gate)
|
|
53
|
+
* @param fleet - Full fleet for metric lookup
|
|
54
|
+
* @param weights - Operator frugality config (lambda_cost, lambda_latency, lambda_verbosity)
|
|
55
|
+
*/
|
|
56
|
+
export function scoreMultiObjective(hydraScores, fleet, weights) {
|
|
57
|
+
const profileMap = new Map();
|
|
58
|
+
for (const m of fleet) {
|
|
59
|
+
profileMap.set(m.id, m);
|
|
60
|
+
}
|
|
61
|
+
const viable = hydraScores.filter((c) => c.rejected_reason === null);
|
|
62
|
+
const rejected = hydraScores.filter((c) => c.rejected_reason !== null);
|
|
63
|
+
if (viable.length === 0) {
|
|
64
|
+
const scoredRejected = rejected.map((c) => ({
|
|
65
|
+
model_id: c.model_id,
|
|
66
|
+
capability_score: c.score,
|
|
67
|
+
cost_penalty: 0,
|
|
68
|
+
latency_penalty: 0,
|
|
69
|
+
verbosity_penalty: 0,
|
|
70
|
+
composite_score: 0,
|
|
71
|
+
rejected_reason: c.rejected_reason,
|
|
72
|
+
}));
|
|
73
|
+
return { selected: null, candidates: scoredRejected };
|
|
74
|
+
}
|
|
75
|
+
const viableMetrics = viable.map((c) => {
|
|
76
|
+
const profile = profileMap.get(c.model_id);
|
|
77
|
+
return profile ? extractMetrics(profile) : { cost: 0, latency: 0, verbosity: 1 };
|
|
78
|
+
});
|
|
79
|
+
const costRange = rangeOf(viableMetrics.map((m) => m.cost));
|
|
80
|
+
const latencyRange = rangeOf(viableMetrics.map((m) => m.latency));
|
|
81
|
+
const verbosityRange = rangeOf(viableMetrics.map((m) => m.verbosity));
|
|
82
|
+
const scoredViable = viable.map((c, i) => {
|
|
83
|
+
const metrics = viableMetrics[i];
|
|
84
|
+
const normCost = normalize(metrics.cost, costRange);
|
|
85
|
+
const normLatency = normalize(metrics.latency, latencyRange);
|
|
86
|
+
const normVerbosity = normalize(metrics.verbosity, verbosityRange);
|
|
87
|
+
const costPenalty = weights.lambda_cost * normCost;
|
|
88
|
+
const latencyPenalty = weights.lambda_latency * normLatency;
|
|
89
|
+
const verbosityPenalty = weights.lambda_verbosity * normVerbosity;
|
|
90
|
+
const composite = c.score - costPenalty - latencyPenalty - verbosityPenalty;
|
|
91
|
+
return {
|
|
92
|
+
model_id: c.model_id,
|
|
93
|
+
capability_score: c.score,
|
|
94
|
+
cost_penalty: costPenalty,
|
|
95
|
+
latency_penalty: latencyPenalty,
|
|
96
|
+
verbosity_penalty: verbosityPenalty,
|
|
97
|
+
composite_score: composite,
|
|
98
|
+
rejected_reason: null,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
const scoredRejected = rejected.map((c) => ({
|
|
102
|
+
model_id: c.model_id,
|
|
103
|
+
capability_score: c.score,
|
|
104
|
+
cost_penalty: 0,
|
|
105
|
+
latency_penalty: 0,
|
|
106
|
+
verbosity_penalty: 0,
|
|
107
|
+
composite_score: 0,
|
|
108
|
+
rejected_reason: c.rejected_reason,
|
|
109
|
+
}));
|
|
110
|
+
const best = scoredViable.reduce((a, b) => b.composite_score > a.composite_score ? b : a);
|
|
111
|
+
return {
|
|
112
|
+
selected: best,
|
|
113
|
+
candidates: [...scoredViable, ...scoredRejected],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=multi-objective.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-objective.js","sourceRoot":"","sources":["../../../src/domain/scoring/multi-objective.ts"],"names":[],"mappings":"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"}
|