|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export interface SymbolicPrimitive { |
|
name: string; |
|
description: string; |
|
implementations: { |
|
universal: string; |
|
claude?: string; |
|
openai?: string; |
|
qwen?: string; |
|
gemini?: string; |
|
deepseek?: string; |
|
local?: string; |
|
}; |
|
paramSchema?: Record<string, ParamDefinition>; |
|
} |
|
|
|
export interface ParamDefinition { |
|
type: 'string' | 'boolean' | 'number' | 'object' | 'array'; |
|
description: string; |
|
required?: boolean; |
|
default?: any; |
|
} |
|
|
|
|
|
export type ModelVendor = 'claude' | 'openai' | 'qwen' | 'gemini' | 'deepseek' | 'local'; |
|
|
|
|
|
export const SYMBOLIC_PRIMITIVES: Record<string, SymbolicPrimitive> = { |
|
think: { |
|
name: 'think', |
|
description: 'Enables explicit reasoning trace and step-by-step thinking', |
|
implementations: { |
|
universal: '.p/think{content}', |
|
claude: '<think>content</think>', |
|
openai: 'tool_choice parameter', |
|
qwen: '/think content', |
|
gemini: 'Implicit via system prompt', |
|
deepseek: 'Rational thinking mode' |
|
}, |
|
paramSchema: { |
|
content: { |
|
type: 'string', |
|
description: 'The thinking content', |
|
required: false |
|
}, |
|
trace: { |
|
type: 'boolean', |
|
description: 'Whether to include thinking trace in response', |
|
default: true |
|
}, |
|
depth: { |
|
type: 'number', |
|
description: 'Depth of thinking (if supported)', |
|
default: 1 |
|
} |
|
} |
|
}, |
|
|
|
reflect: { |
|
name: 'reflect', |
|
description: 'Self-reference and examination of reasoning processes', |
|
implementations: { |
|
universal: '.p/reflect{target}', |
|
claude: '<reflect>target</reflect>', |
|
openai: 'Chain-of-thought prompting', |
|
qwen: 'Internally supported', |
|
gemini: 'Reasoning templates' |
|
}, |
|
paramSchema: { |
|
target: { |
|
type: 'string', |
|
description: 'What to reflect on', |
|
required: true |
|
}, |
|
depth: { |
|
type: 'number', |
|
description: 'Depth of reflection', |
|
default: 1 |
|
} |
|
} |
|
}, |
|
|
|
fork: { |
|
name: 'fork', |
|
description: 'Create parallel reasoning paths to explore multiple options', |
|
implementations: { |
|
universal: '.p/fork{paths}', |
|
claude: 'Emulated via parsing', |
|
openai: 'Emulated via parsing', |
|
qwen: 'Emulated via parsing', |
|
gemini: 'Emulated via parsing', |
|
deepseek: 'Emulated via parsing' |
|
}, |
|
paramSchema: { |
|
paths: { |
|
type: 'array', |
|
description: 'Different paths to explore', |
|
required: true |
|
}, |
|
weights: { |
|
type: 'array', |
|
description: 'Weights for each path', |
|
required: false |
|
} |
|
} |
|
}, |
|
|
|
collapse: { |
|
name: 'collapse', |
|
description: 'Handle errors and recover from failures', |
|
implementations: { |
|
universal: '.p/collapse{trigger}', |
|
claude: 'Emulated via error handling', |
|
openai: 'Emulated via error handling', |
|
qwen: 'Emulated via error handling', |
|
gemini: 'Emulated via error handling', |
|
deepseek: 'Emulated via error handling' |
|
}, |
|
paramSchema: { |
|
trigger: { |
|
type: 'string', |
|
description: 'What triggers the collapse', |
|
required: false |
|
}, |
|
threshold: { |
|
type: 'number', |
|
description: 'Threshold for collapse', |
|
default: 0.5 |
|
} |
|
} |
|
}, |
|
|
|
attention: { |
|
name: 'attention', |
|
description: 'Control focus on specific content', |
|
implementations: { |
|
universal: '.p/attention{focus}', |
|
claude: 'Emulated via prompting', |
|
openai: 'Emulated via prompting', |
|
qwen: 'Emulated via prompting', |
|
gemini: 'Emulated via prompting', |
|
deepseek: 'Emulated via prompting' |
|
}, |
|
paramSchema: { |
|
focus: { |
|
type: 'string', |
|
description: 'What to focus attention on', |
|
required: true |
|
}, |
|
weight: { |
|
type: 'number', |
|
description: 'Weight of attention', |
|
default: 1.0 |
|
} |
|
} |
|
}, |
|
|
|
tool: { |
|
name: 'tool', |
|
description: 'Invoke tools or functions', |
|
implementations: { |
|
universal: '.p/tool{name, params}', |
|
claude: '<tool>name(params)</tool>', |
|
openai: 'function_call API', |
|
qwen: 'tool_use format', |
|
gemini: 'function_calling API', |
|
deepseek: 'function_calling API' |
|
}, |
|
paramSchema: { |
|
name: { |
|
type: 'string', |
|
description: 'Tool name', |
|
required: true |
|
}, |
|
params: { |
|
type: 'object', |
|
description: 'Tool parameters', |
|
required: false |
|
} |
|
} |
|
}, |
|
|
|
system: { |
|
name: 'system', |
|
description: 'System-level directives', |
|
implementations: { |
|
universal: '.p/system{directive}', |
|
claude: '<s>directive</s>', |
|
openai: 'system message', |
|
qwen: '<<SYS>> directive', |
|
gemini: 'system instruction', |
|
deepseek: 'system instruction' |
|
}, |
|
paramSchema: { |
|
directive: { |
|
type: 'string', |
|
description: 'System directive', |
|
required: true |
|
} |
|
} |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
export class UniversalSymbolics { |
|
private adapter: SymbolicAdapter; |
|
private telemetry: SymbolicTelemetry; |
|
|
|
constructor(options: { |
|
vendor?: ModelVendor; |
|
apiKey?: string; |
|
endpoint?: string; |
|
enableTelemetry?: boolean; |
|
} = {}) { |
|
const vendor = options.vendor || 'claude'; |
|
this.adapter = this.createAdapter(vendor, options); |
|
this.telemetry = new SymbolicTelemetry({ |
|
enabled: options.enableTelemetry ?? true |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
private createAdapter(vendor: ModelVendor, options: any): SymbolicAdapter { |
|
switch (vendor) { |
|
case 'claude': |
|
return new ClaudeAdapter(options); |
|
case 'openai': |
|
return new OpenAIAdapter(options); |
|
case 'qwen': |
|
return new QwenAdapter(options); |
|
case 'gemini': |
|
return new GeminiAdapter(options); |
|
case 'deepseek': |
|
return new DeepSeekAdapter(options); |
|
case 'local': |
|
return new LocalAdapter(options); |
|
default: |
|
throw new Error(`Unsupported vendor: ${vendor}`); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
setVendor(vendor: ModelVendor) { |
|
this.adapter = this.createAdapter(vendor, { |
|
apiKey: this.adapter.getApiKey(), |
|
endpoint: this.adapter.getEndpoint() |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
async think(content?: string, options: { trace?: boolean; depth?: number } = {}): Promise<ThinkResult> { |
|
this.telemetry.track('think'); |
|
return this.adapter.executeThink(content, options); |
|
} |
|
|
|
|
|
|
|
|
|
async reflect(target: string, options: { depth?: number } = {}): Promise<ReflectResult> { |
|
this.telemetry.track('reflect'); |
|
return this.adapter.executeReflect(target, options); |
|
} |
|
|
|
|
|
|
|
|
|
async fork(paths: string[], options: { weights?: number[] } = {}): Promise<ForkResult> { |
|
this.telemetry.track('fork'); |
|
return this.adapter.executeFork(paths, options); |
|
} |
|
|
|
|
|
|
|
|
|
async collapse(options: { trigger?: string; threshold?: number } = {}): Promise<CollapseResult> { |
|
this.telemetry.track('collapse'); |
|
return this.adapter.executeCollapse(options); |
|
} |
|
|
|
|
|
|
|
|
|
async attention(focus: string, options: { weight?: number } = {}): Promise<AttentionResult> { |
|
this.telemetry.track('attention'); |
|
return this.adapter.executeAttention(focus, options); |
|
} |
|
|
|
|
|
|
|
|
|
async tool(name: string, params?: Record<string, any>): Promise<ToolResult> { |
|
this.telemetry.track('tool'); |
|
return this.adapter.executeTool(name, params); |
|
} |
|
|
|
|
|
|
|
|
|
async system(directive: string): Promise<SystemResult> { |
|
this.telemetry.track('system'); |
|
return this.adapter.executeSystem(directive); |
|
} |
|
|
|
|
|
|
|
|
|
translate(content: string, sourceVendor: ModelVendor, targetVendor: ModelVendor): string { |
|
this.telemetry.track('translate'); |
|
|
|
|
|
const sourceAdapter = this.createAdapter(sourceVendor, {}); |
|
|
|
|
|
const targetAdapter = this.createAdapter(targetVendor, {}); |
|
|
|
|
|
const operations = sourceAdapter.parseSymbolicOperations(content); |
|
|
|
|
|
return targetAdapter.generateSymbolicContent(operations); |
|
} |
|
|
|
|
|
|
|
|
|
detectResidue(response: string, vendor?: ModelVendor): SymbolicResidue[] { |
|
const actualVendor = vendor || this.adapter.getVendor(); |
|
|
|
return SymbolicResidueDetector.detect(response, actualVendor); |
|
} |
|
|
|
|
|
|
|
|
|
cleanResidue(response: string, vendor?: ModelVendor): string { |
|
const actualVendor = vendor || this.adapter.getVendor(); |
|
|
|
return SymbolicResidueDetector.clean(response, actualVendor); |
|
} |
|
|
|
|
|
|
|
|
|
getTelemetry(): TelemetryData { |
|
return this.telemetry.getData(); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
abstract class SymbolicAdapter { |
|
protected apiKey?: string; |
|
protected endpoint?: string; |
|
|
|
constructor(options: { apiKey?: string; endpoint?: string }) { |
|
this.apiKey = options.apiKey; |
|
this.endpoint = options.endpoint; |
|
} |
|
|
|
abstract getVendor(): ModelVendor; |
|
|
|
getApiKey(): string | undefined { |
|
return this.apiKey; |
|
} |
|
|
|
getEndpoint(): string | undefined { |
|
return this.endpoint; |
|
} |
|
|
|
abstract executeThink(content?: string, options?: any): Promise<ThinkResult>; |
|
abstract executeReflect(target: string, options?: any): Promise<ReflectResult>; |
|
abstract executeFork(paths: string[], options?: any): Promise<ForkResult>; |
|
abstract executeCollapse(options?: any): Promise<CollapseResult>; |
|
abstract executeAttention(focus: string, options?: any): Promise<AttentionResult>; |
|
abstract executeTool(name: string, params?: Record<string, any>): Promise<ToolResult>; |
|
abstract executeSystem(directive: string): Promise<SystemResult>; |
|
|
|
abstract parseSymbolicOperations(content: string): SymbolicOperation[]; |
|
abstract generateSymbolicContent(operations: SymbolicOperation[]): string; |
|
} |
|
|
|
|
|
|
|
|
|
class ClaudeAdapter extends SymbolicAdapter { |
|
getVendor(): ModelVendor { |
|
return 'claude'; |
|
} |
|
|
|
async executeThink(content?: string, options: { trace?: boolean; depth?: number } = {}): Promise<ThinkResult> { |
|
|
|
const thinking = content || ''; |
|
const prompt = `<think>${thinking}</think>`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
thinking: this.extractThinking(response), |
|
output: this.extractOutput(response) |
|
}; |
|
} |
|
|
|
async executeReflect(target: string, options: { depth?: number } = {}): Promise<ReflectResult> { |
|
|
|
const prompt = `<reflect>${target}</reflect>`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
reflection: this.extractReflection(response), |
|
output: this.extractOutput(response) |
|
}; |
|
} |
|
|
|
async executeFork(paths: string[], options: { weights?: number[] } = {}): Promise<ForkResult> { |
|
|
|
const pathPrompts = paths.map(path => `Path: ${path}`).join('\n\n'); |
|
const prompt = `Consider the following paths:\n\n${pathPrompts}\n\nExplore each path and return the results.`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
|
|
const results: Record<string, string> = {}; |
|
for (const path of paths) { |
|
results[path] = this.extractPathResult(response, path); |
|
} |
|
|
|
return { |
|
paths: results, |
|
selected: this.determineSelectedPath(response, paths) |
|
}; |
|
} |
|
|
|
async executeCollapse(options: { trigger?: string; threshold?: number } = {}): Promise<CollapseResult> { |
|
|
|
const trigger = options.trigger || 'error'; |
|
const prompt = `Handle the following error scenario: ${trigger}`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
handled: true, |
|
recovery: response |
|
}; |
|
} |
|
|
|
async executeAttention(focus: string, options: { weight?: number } = {}): Promise<AttentionResult> { |
|
|
|
const weight = options.weight || 1.0; |
|
const prompt = `Focus specifically on: ${focus}`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
focused: true, |
|
result: response |
|
}; |
|
} |
|
|
|
async executeTool(name: string, params?: Record<string, any>): Promise<ToolResult> { |
|
|
|
let paramsString = ''; |
|
if (params) { |
|
paramsString = JSON.stringify(params); |
|
} |
|
|
|
const prompt = `<tool>${name}(${paramsString})</tool>`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
name, |
|
result: this.extractToolResult(response, name) |
|
}; |
|
} |
|
|
|
async executeSystem(directive: string): Promise<SystemResult> { |
|
|
|
const prompt = `<s>${directive}</s>`; |
|
|
|
|
|
const response = await this.callApi(prompt); |
|
|
|
return { |
|
applied: true, |
|
result: response |
|
}; |
|
} |
|
|
|
parseSymbolicOperations(content: string): SymbolicOperation[] { |
|
const operations: SymbolicOperation[] = []; |
|
|
|
|
|
const thinkMatches = content.match(/<think>([\s\S]*?)<\/think>/g); |
|
if (thinkMatches) { |
|
for (const match of thinkMatches) { |
|
const thinkContent = match.replace(/<think>|<\/think>/g, ''); |
|
operations.push({ |
|
type: 'think', |
|
content: thinkContent |
|
}); |
|
} |
|
} |
|
|
|
|
|
const reflectMatches = content.match(/<reflect>([\s\S]*?)<\/reflect>/g); |
|
if (reflectMatches) { |
|
for (const match of reflectMatches) { |
|
const reflectContent = match.replace(/<reflect>|<\/reflect>/g, ''); |
|
operations.push({ |
|
type: 'reflect', |
|
target: reflectContent |
|
}); |
|
} |
|
} |
|
|
|
|
|
const toolMatches = content.match(/<tool>([\s\S]*?)<\/tool>/g); |
|
if (toolMatches) { |
|
for (const match of toolMatches) { |
|
const toolContent = match.replace(/<tool>|<\/tool>/g, ''); |
|
const nameMatch = toolContent.match(/^(\w+)/); |
|
if (nameMatch) { |
|
const name = nameMatch[1]; |
|
const paramsMatch = toolContent.match(/\(([\s\S]*)\)/); |
|
let params: Record<string, any> | undefined; |
|
|
|
if (paramsMatch) { |
|
try { |
|
params = JSON.parse(paramsMatch[1]); |
|
} catch { |
|
params = { raw: paramsMatch[1] }; |
|
} |
|
} |
|
|
|
operations.push({ |
|
type: 'tool', |
|
name, |
|
params |
|
}); |
|
} |
|
} |
|
} |
|
|
|
|
|
const systemMatches = content.match(/<s>([\s\S]*?)<\/s>/g); |
|
if (systemMatches) { |
|
for (const match of systemMatches) { |
|
const systemContent = match.replace(/<s>|<\/s>/g, ''); |
|
operations.push({ |
|
type: 'system', |
|
directive: systemContent |
|
}); |
|
} |
|
} |
|
|
|
return operations; |
|
} |
|
|
|
generateSymbolicContent(operations: SymbolicOperation[]): string { |
|
let content = ''; |
|
|
|
for (const operation of operations) { |
|
switch (operation.type) { |
|
case 'think': |
|
content += `<think>${operation.content || ''}</think>\n`; |
|
break; |
|
case 'reflect': |
|
content += `<reflect>${operation.target}</reflect>\n`; |
|
break; |
|
case 'tool': |
|
const paramsString = operation.params ? JSON.stringify(operation.params) : ''; |
|
content += `<tool>${operation.name}(${paramsString})</tool>\n`; |
|
break; |
|
case 'system': |
|
content += `<s>${operation.directive}</s>\n`; |
|
break; |
|
case |
|
|