UNPKG

@prism-lang/confidence

Version:

Confidence extraction library for Prism - standardized patterns for extracting confidence values from LLMs and other sources

225 lines 6.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TemporalConfidence = exports.DifferentialConfidenceManager = exports.ConfidenceContractManager = exports.ConfidenceBudgetManager = void 0; /** * Confidence budget for high-stakes decisions */ class ConfidenceBudgetManager { budget; constructor(minTotal) { this.budget = { minTotal, items: [] }; } /** * Add a confident value to the budget */ add(value, confidence) { this.budget.items.push({ value, confidence }); } /** * Check if budget is met */ met() { const total = this.getTotal(); return total >= this.budget.minTotal; } /** * Get current total confidence */ getTotal() { return this.budget.items.reduce((sum, item) => sum + item.confidence, 0); } /** * Get remaining confidence needed */ getRemaining() { return Math.max(0, this.budget.minTotal - this.getTotal()); } /** * Get budget status */ getStatus() { const total = this.getTotal(); return { met: this.met(), total, required: this.budget.minTotal, remaining: this.getRemaining(), items: this.budget.items.length }; } /** * Clear the budget */ clear() { this.budget.items = []; } } exports.ConfidenceBudgetManager = ConfidenceBudgetManager; /** * Confidence contract for defining requirements */ class ConfidenceContractManager { contract; constructor(requirements) { this.contract = { requirements }; } /** * Verify results meet contract requirements */ verify(results) { const failures = []; for (const [check, required] of Object.entries(this.contract.requirements)) { const result = results[check]; if (!result) { failures.push({ check, required, actual: 0 }); } else if (result.confidence < required) { failures.push({ check, required, actual: result.confidence }); } } return { passed: failures.length === 0, failures }; } /** * Get contract summary */ getSummary() { const reqs = Object.entries(this.contract.requirements) .map(([check, conf]) => `${check}: ${(conf * 100).toFixed(0)}%`) .join(', '); return `Confidence contract requiring: ${reqs}`; } /** * Check if a single result meets its requirement */ checkRequirement(check, confidence) { const required = this.contract.requirements[check]; return required ? confidence >= required : true; } } exports.ConfidenceContractManager = ConfidenceContractManager; /** * Differential confidence for multi-aspect analysis */ class DifferentialConfidenceManager { aspects = {}; /** * Set confidence for a specific aspect */ setAspect(aspect, confidence) { this.aspects[aspect] = Math.max(0, Math.min(1, confidence)); } /** * Get confidence for a specific aspect */ getAspect(aspect) { return this.aspects[aspect] || 0; } /** * Get all aspects */ getAllAspects() { return { ...this.aspects }; } /** * Get aspect summary */ getSummary() { const parts = Object.entries(this.aspects) .sort((a, b) => b[1] - a[1]) .map(([aspect, conf]) => `${aspect}: ${(conf * 100).toFixed(0)}%`) .join(', '); return `Differential confidence: ${parts}`; } /** * Get highest confidence aspect */ getHighest() { const entries = Object.entries(this.aspects); if (entries.length === 0) return null; return entries.reduce((highest, [aspect, conf]) => conf > highest.confidence ? { aspect, confidence: conf } : highest, { aspect: entries[0][0], confidence: entries[0][1] }); } /** * Get lowest confidence aspect */ getLowest() { const entries = Object.entries(this.aspects); if (entries.length === 0) return null; return entries.reduce((lowest, [aspect, conf]) => conf < lowest.confidence ? { aspect, confidence: conf } : lowest, { aspect: entries[0][0], confidence: entries[0][1] }); } /** * Get average confidence across all aspects */ getAverage() { const values = Object.values(this.aspects); if (values.length === 0) return 0; return values.reduce((sum, conf) => sum + conf, 0) / values.length; } } exports.DifferentialConfidenceManager = DifferentialConfidenceManager; /** * Time-aware confidence for temporal decay */ class TemporalConfidence { value; timestamp; halfLife; unit; constructor(value, options = {}) { this.value = value; this.timestamp = options.timestamp || new Date(); this.halfLife = options.halfLife || 30; this.unit = options.unit || 'days'; } /** * Get current confidence accounting for decay */ getCurrent() { const age = this.getAge(); const decayFactor = Math.pow(0.5, age / this.halfLife); // Decay towards 0.5 (maximum uncertainty) return this.value * decayFactor + 0.5 * (1 - decayFactor); } /** * Get age in configured units */ getAge() { const now = new Date(); const diff = now.getTime() - this.timestamp.getTime(); switch (this.unit) { case 'hours': return diff / (1000 * 60 * 60); case 'days': return diff / (1000 * 60 * 60 * 24); case 'weeks': return diff / (1000 * 60 * 60 * 24 * 7); case 'months': return diff / (1000 * 60 * 60 * 24 * 30); } } /** * Check if confidence has decayed below threshold */ isStale(threshold = 0.6) { return this.getCurrent() < threshold; } /** * Get decay explanation */ getDecayExplanation() { const current = this.getCurrent(); const age = this.getAge(); const decayPercent = ((this.value - current) / this.value * 100).toFixed(1); return `Original: ${(this.value * 100).toFixed(1)}%, Current: ${(current * 100).toFixed(1)}% (${decayPercent}% decay after ${age.toFixed(1)} ${this.unit})`; } } exports.TemporalConfidence = TemporalConfidence; //# sourceMappingURL=patterns.js.map