wifi-densepose/vendor/sublinear-time-solver/crates/psycho-symbolic-reasoner/docs/API.md

15 KiB

Psycho-Symbolic Reasoner API Documentation

Table of Contents

Core API

PsychoSymbolicReasoner

The main class for interacting with the reasoning framework.

import { PsychoSymbolicReasoner } from 'psycho-symbolic-reasoner';

class PsychoSymbolicReasoner {
  constructor(options?: ReasonerOptions);

  // Core methods
  async initialize(): Promise<void>;
  async loadKnowledgeBase(path: string): Promise<void>;
  async queryGraph(query: GraphQuery): Promise<GraphResult>;
  async extractSentiment(text: string): Promise<SentimentResult>;
  async extractPreferences(text: string): Promise<PreferenceResult>;
  async createPlan(request: PlanRequest): Promise<PlanResult>;

  // Utility methods
  isReady(): boolean;
  getStats(): ReasonerStats;
  dispose(): Promise<void>;
}

Configuration Options

interface ReasonerOptions {
  enableGraphReasoning?: boolean;
  enableAffectExtraction?: boolean;
  enablePlanning?: boolean;
  knowledgeBasePath?: string;
  planningRulesPath?: string;
  logLevel?: 'debug' | 'info' | 'warn' | 'error';
  wasmPath?: string;
}

Graph Reasoning

GraphQuery

interface GraphQuery {
  pattern?: string;                    // SPARQL-like pattern
  constraints?: string[];              // Additional constraints
  maxResults?: number;                 // Limit results (default: 100)
  includeInference?: boolean;          // Apply inference rules
  timeout?: number;                    // Query timeout in ms
}

// Examples
const query1: GraphQuery = {
  pattern: "?person likes ?activity",
  constraints: ["?activity hasProperty relaxing"],
  maxResults: 10
};

const query2: GraphQuery = {
  pattern: "?technique helps ?condition",
  constraints: ["?condition = anxiety"],
  includeInference: true
};

GraphResult

interface GraphResult {
  results: GraphBinding[];
  inferredFacts?: GraphBinding[];
  executionTime: number;
  totalResults: number;
}

interface GraphBinding {
  [variable: string]: GraphNode;
}

interface GraphNode {
  id: string;
  type: string;
  properties: Record<string, any>;
  relationships: GraphEdge[];
}

Sentiment Analysis

SentimentResult

interface SentimentResult {
  score: number;                       // -1.0 to 1.0
  confidence: number;                  // 0.0 to 1.0
  primaryEmotion: string;             // Detected primary emotion
  emotions: EmotionScore[];           // All detected emotions
  intensity: 'low' | 'medium' | 'high';
  context?: SentimentContext;
}

interface EmotionScore {
  emotion: string;
  score: number;
  confidence: number;
}

interface SentimentContext {
  valence: number;                     // Positive/negative dimension
  arousal: number;                     // Energy/activation level
  dominance: number;                   // Control/submission dimension
}

Preference Extraction

PreferenceResult

interface PreferenceResult {
  preferences: Preference[];
  confidence: number;
  categories: string[];
  context: PreferenceContext;
}

interface Preference {
  type: 'like' | 'dislike' | 'neutral';
  subject: string;
  object: string;
  strength: number;                    // 0.0 to 1.0
  confidence: number;
  context?: string;
}

interface PreferenceContext {
  domain: string;
  timeframe?: string;
  conditions?: string[];
}

Planning

PlanRequest

interface PlanRequest {
  goal: Goal;
  currentState: State;
  preferences?: Preference[];
  constraints?: Constraint[];
  maxSteps?: number;
  timeout?: number;
}

interface Goal {
  description: string;
  type: 'achievement' | 'maintenance' | 'avoidance';
  priority: number;                    // 0.0 to 1.0
  deadline?: Date;
  successCriteria: SuccessCriterion[];
}

interface State {
  facts: Fact[];
  context: Record<string, any>;
  resources: Resource[];
}

PlanResult

interface PlanResult {
  plan: Action[];
  alternativePlans?: Action[][];
  confidence: number;
  estimatedDuration: number;
  estimatedCost: number;
  riskAssessment: RiskAssessment;
  explanation: string;
}

interface Action {
  id: string;
  name: string;
  description: string;
  preconditions: Condition[];
  effects: Effect[];
  duration: number;
  cost: number;
  priority: number;
}

MCP Tools

The psycho-symbolic reasoner exposes several tools through the Model Context Protocol.

Available Tools

queryGraph

Performs symbolic graph reasoning queries.

Parameters:

{
  "query": "string",
  "maxResults": "number (optional)",
  "includeInference": "boolean (optional)"
}

Example:

{
  "query": "find relaxation techniques for stressed users",
  "maxResults": 5,
  "includeInference": true
}

extractSentiment

Analyzes sentiment and emotional context from text.

Parameters:

{
  "text": "string",
  "includeEmotions": "boolean (optional)",
  "includeContext": "boolean (optional)"
}

Example:

{
  "text": "I'm feeling overwhelmed with work deadlines",
  "includeEmotions": true,
  "includeContext": true
}

extractPreferences

Identifies user preferences from text or behavioral data.

Parameters:

{
  "text": "string",
  "domain": "string (optional)",
  "includeImplicit": "boolean (optional)"
}

Example:

{
  "text": "I prefer working in the morning when it's quiet",
  "domain": "work_habits",
  "includeImplicit": true
}

createPlan

Generates goal-oriented plans based on current state and preferences.

Parameters:

{
  "goal": "string",
  "currentState": "object",
  "preferences": "array (optional)",
  "constraints": "array (optional)"
}

Example:

{
  "goal": "reduce stress and improve work-life balance",
  "currentState": {
    "energy": "low",
    "workload": "high",
    "timeAvailable": "limited"
  },
  "preferences": [
    {
      "type": "like",
      "subject": "user",
      "object": "short_activities"
    }
  ]
}

analyzeContext

Performs contextual analysis combining multiple reasoning modes.

Parameters:

{
  "text": "string",
  "context": "object (optional)",
  "analysisTypes": "array (optional)"
}

Example:

{
  "text": "User seems frustrated with current workflow",
  "context": {
    "domain": "workplace",
    "userHistory": ["previous_complaints", "low_satisfaction"]
  },
  "analysisTypes": ["sentiment", "preferences", "recommendations"]
}

CLI Commands

Global Commands

# Display help
psycho-symbolic-reasoner --help

# Check version
psycho-symbolic-reasoner --version

# Start MCP server
psycho-symbolic-reasoner serve [options]

# Initialize knowledge base
psycho-symbolic-reasoner init [options]

Analysis Commands

# Analyze sentiment
psycho-symbolic-reasoner analyze sentiment \
  --text "I'm excited about this project!" \
  --output json

# Extract preferences
psycho-symbolic-reasoner analyze preferences \
  --text "I like working early in the morning" \
  --domain work_habits

# Query knowledge graph
psycho-symbolic-reasoner query \
  --pattern "?person needs ?support" \
  --constraints "?person hasEmotion stressed" \
  --max-results 10

Planning Commands

# Create a plan
psycho-symbolic-reasoner plan \
  --goal "improve sleep quality" \
  --state ./current-state.json \
  --preferences ./user-preferences.json \
  --output plan.json

# Validate a plan
psycho-symbolic-reasoner validate-plan \
  --plan ./plan.json \
  --rules ./planning-rules.json

Data Management

# Load knowledge base
psycho-symbolic-reasoner load-kb \
  --file ./knowledge-base.json \
  --format json

# Export data
psycho-symbolic-reasoner export \
  --type preferences \
  --format csv \
  --output user-preferences.csv

# Import external data
psycho-symbolic-reasoner import \
  --file external-data.rdf \
  --format rdf

REST API

When running in server mode, the reasoner exposes a REST API.

Base URL

http://localhost:3000/api/v1

Authentication

Authorization: Bearer <token>

Endpoints

POST /analyze/sentiment

Analyze sentiment in text.

POST /api/v1/analyze/sentiment
Content-Type: application/json

{
  "text": "I'm feeling great today!",
  "includeEmotions": true
}

POST /analyze/preferences

Extract preferences from text.

POST /api/v1/analyze/preferences
Content-Type: application/json

{
  "text": "I prefer quiet environments for concentration",
  "domain": "work_environment"
}

POST /query/graph

Query the knowledge graph.

POST /api/v1/query/graph
Content-Type: application/json

{
  "pattern": "?activity helps ?condition",
  "constraints": ["?condition = anxiety"],
  "maxResults": 5
}

POST /planning/create

Create a new plan.

POST /api/v1/planning/create
Content-Type: application/json

{
  "goal": {
    "description": "improve focus during work",
    "type": "achievement",
    "priority": 0.8
  },
  "currentState": {
    "energy": "medium",
    "environment": "noisy",
    "timeAvailable": "2 hours"
  }
}

GET /stats

Get system statistics.

GET /api/v1/stats

Response:

{
  "uptime": 3600,
  "queriesProcessed": 1250,
  "averageResponseTime": 45,
  "memoryUsage": {
    "used": "125MB",
    "total": "512MB"
  },
  "knowledgeBase": {
    "nodes": 5000,
    "edges": 12000,
    "rules": 150
  }
}

WebSocket API

Real-time communication for streaming analysis and interactive planning.

Connection

const ws = new WebSocket('ws://localhost:3000/ws');

Message Format

{
  "id": "unique-request-id",
  "type": "request|response|error|event",
  "method": "analyze|plan|query|subscribe",
  "data": {}
}

Real-time Sentiment Analysis

// Request
ws.send(JSON.stringify({
  id: "sentiment-1",
  type: "request",
  method: "analyze",
  data: {
    type: "sentiment",
    text: "I'm feeling overwhelmed",
    stream: true
  }
}));

// Response
{
  "id": "sentiment-1",
  "type": "response",
  "data": {
    "score": -0.3,
    "confidence": 0.85,
    "primaryEmotion": "stress"
  }
}

Live Planning Updates

// Subscribe to planning updates
ws.send(JSON.stringify({
  id: "plan-updates",
  type: "request",
  method: "subscribe",
  data: {
    topic: "planning",
    planId: "plan-123"
  }
}));

// Receive updates
{
  "id": "plan-updates",
  "type": "event",
  "data": {
    "planId": "plan-123",
    "status": "executing",
    "currentStep": 3,
    "totalSteps": 10,
    "progress": 0.3
  }
}

Configuration

Environment Variables

# Server configuration
PSR_PORT=3000
PSR_HOST=localhost
PSR_LOG_LEVEL=info

# WASM configuration
PSR_WASM_PATH=./wasm
PSR_ENABLE_WASM_CACHE=true

# Knowledge base
PSR_KB_PATH=./knowledge-base.json
PSR_KB_AUTO_RELOAD=true

# Security
PSR_API_KEY=your-api-key
PSR_ENABLE_CORS=true
PSR_RATE_LIMIT=100

# Performance
PSR_MAX_CONCURRENT_QUERIES=10
PSR_QUERY_TIMEOUT=30000
PSR_CACHE_SIZE=1000

Configuration File

{
  "server": {
    "port": 3000,
    "host": "localhost",
    "cors": {
      "enabled": true,
      "origins": ["http://localhost:3000"]
    }
  },
  "reasoning": {
    "graph": {
      "enableInference": true,
      "maxQueryTime": 30000,
      "cacheResults": true
    },
    "sentiment": {
      "model": "advanced",
      "includeEmotions": true,
      "confidenceThreshold": 0.7
    },
    "planning": {
      "maxSteps": 20,
      "timeout": 60000,
      "enableOptimization": true
    }
  },
  "wasm": {
    "path": "./wasm",
    "enableCache": true,
    "memoryLimit": "512MB"
  },
  "logging": {
    "level": "info",
    "format": "json",
    "outputs": ["console", "file"]
  }
}

Error Handling

Error Types

enum ErrorType {
  INITIALIZATION_ERROR = 'initialization_error',
  VALIDATION_ERROR = 'validation_error',
  QUERY_ERROR = 'query_error',
  PLANNING_ERROR = 'planning_error',
  WASM_ERROR = 'wasm_error',
  TIMEOUT_ERROR = 'timeout_error',
  RESOURCE_ERROR = 'resource_error'
}

Error Response Format

{
  "error": {
    "type": "validation_error",
    "message": "Invalid query pattern",
    "code": "PSR_001",
    "details": {
      "field": "pattern",
      "expected": "SPARQL-like pattern",
      "received": "invalid syntax"
    },
    "timestamp": "2024-09-20T10:30:00Z",
    "requestId": "req-123"
  }
}

Error Handling in Code

try {
  const result = await reasoner.queryGraph(query);
  console.log(result);
} catch (error) {
  if (error instanceof ValidationError) {
    console.error('Invalid input:', error.message);
  } else if (error instanceof TimeoutError) {
    console.error('Query timed out:', error.timeout);
  } else {
    console.error('Unexpected error:', error);
  }
}

Examples

Basic Usage

import { PsychoSymbolicReasoner } from 'psycho-symbolic-reasoner';

async function example() {
  const reasoner = new PsychoSymbolicReasoner({
    enableGraphReasoning: true,
    enableAffectExtraction: true,
    enablePlanning: true
  });

  await reasoner.initialize();
  await reasoner.loadKnowledgeBase('./therapy-kb.json');

  // Analyze user input
  const sentiment = await reasoner.extractSentiment(
    "I've been feeling anxious about upcoming deadlines"
  );

  // Extract preferences
  const preferences = await reasoner.extractPreferences(
    "I find deep breathing exercises really helpful"
  );

  // Create a plan
  const plan = await reasoner.createPlan({
    goal: {
      description: "reduce anxiety",
      type: "achievement",
      priority: 0.9
    },
    currentState: {
      facts: [
        { predicate: "hasEmotion", object: "anxiety" },
        { predicate: "hasDeadline", object: "upcoming" }
      ],
      context: { timeAvailable: "30 minutes" }
    },
    preferences: preferences.preferences
  });

  console.log('Plan:', plan.plan);
}

MCP Integration

import { FastMCP } from 'fastmcp';
import { createPsychoSymbolicTools } from 'psycho-symbolic-reasoner/mcp';

const server = new FastMCP({
  name: "TherapyAssistant",
  version: "1.0.0"
});

const tools = await createPsychoSymbolicTools({
  knowledgeBase: './therapy-knowledge.json'
});

tools.forEach(tool => server.addTool(tool));

await server.start({ transportType: "stdio" });

Advanced Graph Querying

// Complex reasoning query
const result = await reasoner.queryGraph({
  pattern: `
    ?person hasEmotion ?emotion .
    ?emotion hasIntensity ?intensity .
    ?technique helps ?emotion .
    ?technique hasType ?type .
  `,
  constraints: [
    "?intensity > 0.7",
    "?type IN ['breathing', 'mindfulness', 'cognitive']"
  ],
  includeInference: true,
  maxResults: 10
});

console.log('Recommended techniques:', result.results);

For more detailed examples, see the examples/ directory.