| |
|
|
| export interface SymbolicCommand { |
| name: string; |
| description: string; |
| aliases?: string[]; |
| parameters?: { |
| name: string; |
| description: string; |
| required?: boolean; |
| default?: any; |
| }[]; |
| transform: (prompt: string, options: any) => Promise<TransformedPrompt>; |
| } |
|
|
| export interface TransformedPrompt { |
| systemPrompt?: string; |
| userPrompt: string; |
| modelParameters?: Record<string, any>; |
| } |
|
|
| export abstract class ModelAdapter { |
| protected commands: Map<string, SymbolicCommand> = new Map(); |
| protected aliasMap: Map<string, string> = new Map(); |
| |
| constructor(protected apiKey: string, protected options: any = {}) { |
| this.registerCoreCommands(); |
| } |
|
|
| protected registerCoreCommands() { |
| this.registerCommand({ |
| name: 'think', |
| description: 'Activate extended reasoning pathways', |
| transform: this.transformThink.bind(this) |
| }); |
|
|
| this.registerCommand({ |
| name: 'fast', |
| description: 'Optimize for low-latency responses', |
| transform: this.transformFast.bind(this) |
| }); |
|
|
| this.registerCommand({ |
| name: 'loop', |
| description: 'Enable iterative refinement cycles', |
| parameters: [ |
| { |
| name: 'iterations', |
| description: 'Number of refinement iterations', |
| required: false, |
| default: 3 |
| } |
| ], |
| transform: this.transformLoop.bind(this) |
| }); |
|
|
| this.registerCommand({ |
| name: 'reflect', |
| description: 'Trigger meta-analysis of outputs', |
| transform: this.transformReflect.bind(this) |
| }); |
|
|
| this.registerCommand({ |
| name: 'collapse', |
| description: 'Return to default behavior', |
| transform: this.transformCollapse.bind(this) |
| }); |
|
|
| this.registerCommand({ |
| name: 'fork', |
| description: 'Generate multiple alternative responses', |
| parameters: [ |
| { |
| name: 'count', |
| description: 'Number of alternatives to generate', |
| required: false, |
| default: 2 |
| } |
| ], |
| transform: this.transformFork.bind(this) |
| }); |
| } |
|
|
| public registerCommand(command: SymbolicCommand) { |
| this.commands.set(command.name, command); |
| if (command.aliases) { |
| command.aliases.forEach(alias => { |
| this.aliasMap.set(alias, command.name); |
| }); |
| } |
| } |
|
|
| public async generate(input: { prompt: string, systemPrompt?: string }): Promise<string> { |
| const { prompt, systemPrompt = '' } = input; |
| |
| |
| const { command, cleanPrompt, parameters } = this.parseCommand(prompt); |
| |
| |
| const transformed = command |
| ? await this.commands.get(command)?.transform(cleanPrompt, { |
| systemPrompt, |
| parameters, |
| options: this.options |
| }) |
| : { systemPrompt, userPrompt: prompt }; |
| |
| |
| return this.executePrompt(transformed); |
| } |
|
|
| protected parseCommand(prompt: string): { command: string | null, cleanPrompt: string, parameters: Record<string, any> } { |
| const commandRegex = /^\/([a-zA-Z0-9_]+)(?:\s+([^\n]*))?/; |
| const match = prompt.match(commandRegex); |
| |
| if (!match) { |
| return { command: null, cleanPrompt: prompt, parameters: {} }; |
| } |
| |
| const [fullMatch, command, rest] = match; |
| const commandName = this.aliasMap.get(command) || command; |
| |
| if (!this.commands.has(commandName)) { |
| return { command: null, cleanPrompt: prompt, parameters: {} }; |
| } |
| |
| |
| const parameters = this.parseParameters(commandName, rest || ''); |
| const cleanPrompt = prompt.replace(fullMatch, '').trim(); |
| |
| return { command: commandName, cleanPrompt, parameters }; |
| } |
|
|
| protected parseParameters(command: string, paramString: string): Record<string, any> { |
| |
| const params: Record<string, any> = {}; |
| const cmd = this.commands.get(command); |
| |
| |
| if (!cmd?.parameters || cmd.parameters.length === 0) { |
| return params; |
| } |
| |
| |
| cmd.parameters.forEach(param => { |
| if (param.default !== undefined) { |
| params[param.name] = param.default; |
| } |
| }); |
| |
| |
| const paramRegex = /--([a-zA-Z0-9_]+)(?:=([^\s]+))?/g; |
| let match; |
| |
| while ((match = paramRegex.exec(paramString)) !== null) { |
| const [_, paramName, paramValue = true] = match; |
| params[paramName] = paramValue; |
| } |
| |
| return params; |
| } |
|
|
| |
| |
| |
| |
| protected abstract transformThink(prompt: string, options: any): Promise<TransformedPrompt>; |
| protected abstract transformFast(prompt: string, options: any): Promise<TransformedPrompt>; |
| protected abstract transformLoop(prompt: string, options: any): Promise<TransformedPrompt>; |
| protected abstract transformReflect(prompt: string, options: any): Promise<TransformedPrompt>; |
| protected abstract transformCollapse(prompt: string, options: any): Promise<TransformedPrompt>; |
| protected abstract transformFork(prompt: string, options: any): Promise<TransformedPrompt>; |
| |
| |
| protected abstract executePrompt(transformed: TransformedPrompt): Promise<string>; |
| } |
|
|