UNPKG

@cyqlelabs/mcp-dual-cycle-reasoner

Version:

MCP server implementing dual-cycle metacognitive reasoning framework for autonomous agents

131 lines (130 loc) 5.09 kB
import { pipeline } from '@huggingface/transformers'; export class SemanticAnalyzer { nliClassifier = null; isInitialized = false; async initialize() { if (this.isInitialized) { return; } console.log('Initializing NLI model...'); try { this.nliClassifier = await pipeline('zero-shot-classification', 'MoritzLaurer/deberta-v3-base-zeroshot-v1.1-all-33', { cache_dir: process.env.HF_HUB_CACHE }); this.isInitialized = true; console.log('NLI model initialized successfully'); } catch (error) { console.error('Failed to initialize NLI model:', error); throw error; } } async analyzeTextPair(premise, hypothesis) { if (!this.isInitialized || !this.nliClassifier) { throw new Error('SemanticAnalyzer not initialized. Call initialize() first.'); } try { const labels = ['CONTRADICTION', 'ENTAILMENT', 'NEUTRAL']; const result = await this.nliClassifier(premise, labels, { hypothesis_template: '{}', }); const output = Array.isArray(result) ? result[0] : result; const topLabel = output.labels[0]; const topScore = output.scores[0]; return { label: topLabel, score: topScore, confidence: topScore, }; } catch (error) { console.error('Error analyzing text pair:', error); throw error; } } async assessBeliefContradiction(belief, evidence) { const analysis = await this.analyzeTextPair(belief, evidence); const contradicts = analysis.label === 'CONTRADICTION' && analysis.confidence > 0.7; return { contradicts, confidence: analysis.confidence, reasoning: `NLI analysis: ${analysis.label} (confidence: ${analysis.confidence.toFixed(3)})`, }; } async assessActionOutcome(action, expectedOutcome) { const analysis = await this.analyzeTextPair(action, expectedOutcome); let category; let reasoning; if (analysis.label === 'ENTAILMENT' && analysis.confidence > 0.7) { category = 'success'; reasoning = `Action aligns with expected outcome (${analysis.confidence.toFixed(3)})`; } else if (analysis.label === 'CONTRADICTION' && analysis.confidence > 0.7) { category = 'failure'; reasoning = `Action contradicts expected outcome (${analysis.confidence.toFixed(3)})`; } else { category = 'neutral'; reasoning = `Uncertain relationship: ${analysis.label} (${analysis.confidence.toFixed(3)})`; } return { category, confidence: analysis.confidence, reasoning, }; } async detectContradictionsInActions(actions) { const contradictions = []; for (let i = 0; i < actions.length; i++) { for (let j = i + 1; j < actions.length; j++) { const analysis = await this.analyzeTextPair(actions[i], actions[j]); if (analysis.label === 'CONTRADICTION' && analysis.confidence > 0.6) { contradictions.push({ action1: actions[i], action2: actions[j], contradicts: true, confidence: analysis.confidence, }); } } } return contradictions; } async analyzeBeliefConsistency(beliefs) { const relationships = []; for (let i = 0; i < beliefs.length; i++) { for (let j = i + 1; j < beliefs.length; j++) { const analysis = await this.analyzeTextPair(beliefs[i], beliefs[j]); relationships.push({ belief1: beliefs[i], belief2: beliefs[j], relationship: analysis.label.toLowerCase(), confidence: analysis.confidence, }); } } return relationships; } async classifyActionIntent(action, possibleIntents) { const scores = []; for (const intent of possibleIntents) { const analysis = await this.analyzeTextPair(action, intent); scores.push({ intent, score: analysis.label === 'ENTAILMENT' ? analysis.confidence : analysis.label === 'NEUTRAL' ? analysis.confidence * 0.5 : analysis.confidence * 0.1, }); } scores.sort((a, b) => b.score - a.score); return { bestMatch: scores[0].intent, confidence: scores[0].score, allScores: scores, }; } isReady() { return this.isInitialized && this.nliClassifier !== null; } } export const semanticAnalyzer = new SemanticAnalyzer();