@riotprompt/riotprompt 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.kodrdriv-test-cache.json +6 -0
- package/README.md +2 -2
- package/dist/builder.js +3 -0
- package/dist/builder.js.map +1 -1
- package/dist/context-manager.d.ts +135 -0
- package/dist/context-manager.js +220 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/conversation-logger.d.ts +283 -0
- package/dist/conversation-logger.js +454 -0
- package/dist/conversation-logger.js.map +1 -0
- package/dist/conversation.d.ts +271 -0
- package/dist/conversation.js +622 -0
- package/dist/conversation.js.map +1 -0
- package/dist/formatter.js.map +1 -1
- package/dist/iteration-strategy.d.ts +231 -0
- package/dist/iteration-strategy.js +486 -0
- package/dist/iteration-strategy.js.map +1 -0
- package/dist/loader.js +3 -0
- package/dist/loader.js.map +1 -1
- package/dist/message-builder.d.ts +156 -0
- package/dist/message-builder.js +254 -0
- package/dist/message-builder.js.map +1 -0
- package/dist/override.js +3 -0
- package/dist/override.js.map +1 -1
- package/dist/recipes.d.ts +42 -0
- package/dist/recipes.js +189 -4
- package/dist/recipes.js.map +1 -1
- package/dist/reflection.d.ts +250 -0
- package/dist/reflection.js +416 -0
- package/dist/reflection.js.map +1 -0
- package/dist/riotprompt.cjs +3549 -218
- package/dist/riotprompt.cjs.map +1 -1
- package/dist/riotprompt.d.ts +18 -2
- package/dist/riotprompt.js +9 -1
- package/dist/riotprompt.js.map +1 -1
- package/dist/token-budget.d.ts +177 -0
- package/dist/token-budget.js +404 -0
- package/dist/token-budget.js.map +1 -0
- package/dist/tools.d.ts +239 -0
- package/dist/tools.js +324 -0
- package/dist/tools.js.map +1 -0
- package/package.json +23 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.js","sources":["../src/conversation.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Model } from \"./chat\";\nimport { ContextManager, type DynamicContentItem } from \"./context-manager\";\nimport { ConversationLogger, type LogConfig } from \"./conversation-logger\";\nimport { Content } from \"./items/content\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { MessageBuilder } from \"./message-builder\";\nimport { Prompt } from \"./prompt\";\nimport * as Formatter from \"./formatter\";\nimport { TokenBudgetManager, type TokenBudgetConfig, type TokenUsage, type CompressionStrategy } from \"./token-budget\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Options for injecting context\n */\nexport interface InjectOptions {\n // Where to inject\n position?: 'end' | 'before-last' | 'after-system' | number;\n\n // How to format\n format?: 'structured' | 'inline' | 'reference';\n\n // Deduplication\n deduplicate?: boolean;\n deduplicateBy?: 'id' | 'content' | 'hash';\n\n // Priority\n priority?: 'high' | 'medium' | 'low';\n weight?: number;\n\n // Metadata\n category?: string;\n source?: string;\n}\n\n/**\n * Represents a tool call made by the assistant\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Message in a conversation (compatible with OpenAI ChatCompletionMessageParam)\n */\nexport interface ConversationMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\n/**\n * Configuration for ConversationBuilder\n */\nexport interface ConversationBuilderConfig {\n model: Model;\n formatter?: Formatter.Instance;\n trackContext?: boolean;\n deduplicateContext?: boolean;\n}\n\n/**\n * Metadata about the conversation\n */\nexport interface ConversationMetadata {\n model: Model;\n created: Date;\n lastModified: Date;\n messageCount: number;\n toolCallCount: number;\n}\n\n/**\n * Internal state of a conversation\n */\nexport interface ConversationState {\n messages: ConversationMessage[];\n metadata: ConversationMetadata;\n contextProvided: Set<string>;\n contextManager: ContextManager;\n}\n\n/**\n * Serializable conversation state for persistence\n */\nexport interface SerializedConversation {\n messages: ConversationMessage[];\n metadata: Omit<ConversationMetadata, 'created' | 'lastModified'> & {\n created: string;\n lastModified: string;\n };\n contextProvided: string[];\n}\n\n// ===== SCHEMAS =====\n\nconst ConversationBuilderConfigSchema = z.object({\n model: z.string(),\n formatter: z.any().optional(),\n trackContext: z.boolean().optional().default(true),\n deduplicateContext: z.boolean().optional().default(true),\n});\n\n// ===== CONVERSATION BUILDER =====\n\n/**\n * ConversationBuilder manages multi-turn conversations with full lifecycle support.\n *\n * Features:\n * - Initialize from RiotPrompt prompts\n * - Add messages of any type (system, user, assistant, tool)\n * - Handle tool calls and results\n * - Inject dynamic context\n * - Clone for parallel exploration\n * - Serialize/deserialize for persistence\n *\n * @example\n * ```typescript\n * // Create from prompt\n * const conversation = ConversationBuilder.create()\n * .fromPrompt(prompt, 'gpt-4o')\n * .build();\n *\n * // Add messages\n * conversation.addUserMessage('Analyze this code');\n *\n * // Handle tool calls\n * conversation.addAssistantWithToolCalls(null, toolCalls);\n * conversation.addToolResult(toolCallId, result);\n *\n * // Export\n * const messages = conversation.toMessages();\n * ```\n */\nexport class ConversationBuilder {\n private state: ConversationState;\n private config: ConversationBuilderConfig;\n private logger: any;\n private budgetManager?: TokenBudgetManager;\n private conversationLogger?: ConversationLogger;\n\n private constructor(config: ConversationBuilderConfig, logger?: any) {\n this.config = ConversationBuilderConfigSchema.parse(config) as ConversationBuilderConfig;\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ConversationBuilder');\n\n this.state = {\n messages: [],\n metadata: {\n model: this.config.model,\n created: new Date(),\n lastModified: new Date(),\n messageCount: 0,\n toolCallCount: 0,\n },\n contextProvided: new Set<string>(),\n contextManager: new ContextManager(logger),\n };\n\n this.logger.debug('Created ConversationBuilder', { model: this.config.model });\n }\n\n /**\n * Create a new ConversationBuilder instance\n */\n static create(config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const defaultConfig: ConversationBuilderConfig = {\n model: 'gpt-4o',\n trackContext: true,\n deduplicateContext: true,\n ...config,\n };\n\n return new ConversationBuilder(defaultConfig, logger);\n }\n\n /**\n * Initialize conversation from a RiotPrompt prompt\n */\n fromPrompt(prompt: Prompt, model?: Model): this {\n const targetModel = model || this.config.model;\n this.logger.debug('Initializing from prompt', { model: targetModel });\n\n // Use formatter (provided or create new one)\n const formatter = this.config.formatter || Formatter.create();\n const request = formatter.formatPrompt(targetModel, prompt);\n\n // Add all messages from formatted request\n request.messages.forEach(msg => {\n this.state.messages.push(msg as ConversationMessage);\n });\n\n this.updateMetadata();\n this.logger.debug('Initialized from prompt', { messageCount: this.state.messages.length });\n\n return this;\n }\n\n /**\n * Add a system message\n */\n addSystemMessage(content: string | Section<Instruction>): this {\n this.logger.debug('Adding system message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message (with automatic budget management)\n */\n addUserMessage(content: string | Section<Content>): this {\n this.logger.debug('Adding user message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n const message: ConversationMessage = {\n role: 'user',\n content: messageContent,\n };\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n }\n\n this.state.messages.push(message);\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message\n */\n addAssistantMessage(content: string | null): this {\n this.logger.debug('Adding assistant message');\n\n this.state.messages.push({\n role: 'assistant',\n content: content || '',\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message with tool calls\n */\n addAssistantWithToolCalls(content: string | null, toolCalls: ToolCall[]): this {\n this.logger.debug('Adding assistant message with tool calls', { toolCount: toolCalls.length });\n\n this.state.messages.push({\n role: 'assistant',\n content: content,\n tool_calls: toolCalls,\n });\n\n this.state.metadata.toolCallCount += toolCalls.length;\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message\n */\n addToolResult(toolCallId: string, content: string, toolName?: string): this {\n this.logger.debug('Adding tool result', { toolCallId, toolName });\n\n const message: ConversationMessage = {\n role: 'tool',\n tool_call_id: toolCallId,\n content: content,\n };\n\n if (toolName) {\n message.name = toolName;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Alias for addToolResult (more intuitive naming)\n */\n addToolMessage(toolCallId: string, content: string, toolName?: string): this {\n return this.addToolResult(toolCallId, content, toolName);\n }\n\n /**\n * Inject context into the conversation with advanced options\n *\n * @param context - Array of content items to inject\n * @param options - Injection options (position, format, deduplication, etc.)\n */\n injectContext(context: DynamicContentItem[], options?: InjectOptions): this {\n const opts: Required<InjectOptions> = {\n position: 'end',\n format: 'structured',\n deduplicate: this.config.deduplicateContext ?? true,\n deduplicateBy: 'id',\n priority: 'medium',\n weight: 1.0,\n category: undefined as any,\n source: undefined as any,\n ...options,\n };\n\n this.logger.debug('Injecting context', { itemCount: context.length, options: opts });\n\n // Filter out duplicates if enabled\n const itemsToAdd: DynamicContentItem[] = [];\n\n for (const item of context) {\n const enrichedItem: DynamicContentItem = {\n ...item,\n priority: item.priority || opts.priority,\n weight: item.weight || opts.weight,\n category: item.category || opts.category,\n source: item.source || opts.source,\n timestamp: item.timestamp || new Date(),\n };\n\n // Check deduplication\n if (opts.deduplicate) {\n let skip = false;\n\n switch (opts.deduplicateBy) {\n case 'id':\n if (enrichedItem.id && this.state.contextManager.hasContext(enrichedItem.id)) {\n this.logger.debug('Skipping duplicate context by ID', { id: enrichedItem.id });\n skip = true;\n }\n break;\n case 'hash':\n if (this.state.contextManager.hasContentHash(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by hash');\n skip = true;\n }\n break;\n case 'content':\n if (this.state.contextManager.hasSimilarContent(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by content');\n skip = true;\n }\n break;\n }\n\n if (skip) {\n continue;\n }\n }\n\n itemsToAdd.push(enrichedItem);\n }\n\n // Only proceed if we have items to add\n if (itemsToAdd.length === 0) {\n return this;\n }\n\n // Calculate position\n const position = this.calculatePosition(opts.position);\n\n // Format and inject\n for (const item of itemsToAdd) {\n const formatted = this.formatContextItem(item, opts.format);\n const contextMessage: ConversationMessage = {\n role: 'user',\n content: formatted,\n };\n\n this.state.messages.splice(position, 0, contextMessage);\n\n // Track in context manager\n this.state.contextManager.track(item, position);\n }\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Inject system-level context\n */\n injectSystemContext(context: Section<Context> | string): this {\n this.logger.debug('Injecting system context');\n\n let messageContent: string;\n if (typeof context === 'string') {\n messageContent = context;\n } else {\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(context);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Get the number of messages in the conversation\n */\n getMessageCount(): number {\n return this.state.messages.length;\n }\n\n /**\n * Get the last message in the conversation\n */\n getLastMessage(): ConversationMessage | undefined {\n return this.state.messages[this.state.messages.length - 1];\n }\n\n /**\n * Get all messages\n */\n getMessages(): ConversationMessage[] {\n return [...this.state.messages];\n }\n\n /**\n * Check if conversation has any tool calls\n */\n hasToolCalls(): boolean {\n return this.state.metadata.toolCallCount > 0;\n }\n\n /**\n * Get conversation metadata\n */\n getMetadata(): ConversationMetadata {\n return { ...this.state.metadata };\n }\n\n /**\n * Export messages in OpenAI format\n */\n toMessages(): ConversationMessage[] {\n return this.state.messages.map(msg => ({ ...msg }));\n }\n\n /**\n * Serialize conversation to JSON\n */\n toJSON(): string {\n const serialized: SerializedConversation = {\n messages: this.state.messages,\n metadata: {\n ...this.state.metadata,\n created: this.state.metadata.created.toISOString(),\n lastModified: this.state.metadata.lastModified.toISOString(),\n },\n contextProvided: Array.from(this.state.contextProvided),\n };\n\n return JSON.stringify(serialized, null, 2);\n }\n\n /**\n * Restore conversation from JSON\n */\n static fromJSON(json: string, config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const parsed: SerializedConversation = JSON.parse(json);\n\n const builder = ConversationBuilder.create(\n {\n model: parsed.metadata.model,\n ...config,\n },\n logger\n );\n\n // Restore state\n builder.state.messages = parsed.messages;\n builder.state.metadata = {\n ...parsed.metadata,\n created: new Date(parsed.metadata.created),\n lastModified: new Date(parsed.metadata.lastModified),\n };\n builder.state.contextProvided = new Set(parsed.contextProvided);\n\n return builder;\n }\n\n /**\n * Clone the conversation for parallel exploration\n */\n clone(): ConversationBuilder {\n this.logger.debug('Cloning conversation');\n\n const cloned = ConversationBuilder.create(\n { ...this.config },\n this.logger\n );\n\n // Deep copy state (note: contextManager is already created in constructor)\n cloned.state.messages = this.state.messages.map(msg => ({ ...msg }));\n cloned.state.metadata = { ...this.state.metadata };\n cloned.state.contextProvided = new Set(this.state.contextProvided);\n\n // Copy context manager state\n const allContext = this.state.contextManager.getAll();\n allContext.forEach(item => {\n cloned.state.contextManager.track(item, item.position);\n });\n\n return cloned;\n }\n\n /**\n * Truncate conversation to last N messages\n */\n truncate(maxMessages: number): this {\n this.logger.debug('Truncating conversation', { maxMessages, current: this.state.messages.length });\n\n if (this.state.messages.length > maxMessages) {\n this.state.messages = this.state.messages.slice(-maxMessages);\n this.updateMetadata();\n }\n\n return this;\n }\n\n /**\n * Remove all messages of a specific type\n */\n removeMessagesOfType(role: 'system' | 'user' | 'assistant' | 'tool'): this {\n this.logger.debug('Removing messages of type', { role });\n\n this.state.messages = this.state.messages.filter(msg => msg.role !== role);\n this.updateMetadata();\n\n return this;\n }\n\n /**\n * Get the context manager\n */\n getContextManager(): ContextManager {\n return this.state.contextManager;\n }\n\n /**\n * Get conversation state (for conditional injection)\n */\n getState(): ConversationState {\n return {\n messages: [...this.state.messages],\n metadata: { ...this.state.metadata },\n contextProvided: new Set(this.state.contextProvided),\n contextManager: this.state.contextManager,\n };\n }\n\n // ===== SEMANTIC MESSAGE METHODS (Feature 5) =====\n\n /**\n * Add a system message using semantic builder\n */\n asSystem(content: string | Section<Instruction>): this {\n const message = MessageBuilder.system(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message using semantic builder\n */\n asUser(content: string | Section<Content>): this {\n const message = MessageBuilder.user(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message using semantic builder\n */\n asAssistant(content: string | null, toolCalls?: ToolCall[]): this {\n const builder = MessageBuilder.assistant(this.logger)\n .withFormatter(this.config.formatter || Formatter.create());\n\n if (content) {\n builder.withContent(content);\n }\n\n if (toolCalls) {\n builder.withToolCalls(toolCalls);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n if (toolCalls) {\n this.state.metadata.toolCallCount += toolCalls.length;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message using semantic builder\n */\n asTool(callId: string, result: any, metadata?: Record<string, any>): this {\n const builder = MessageBuilder.tool(callId, this.logger)\n .withResult(result);\n\n if (metadata) {\n builder.withMetadata(metadata);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Configure token budget\n */\n withTokenBudget(config: TokenBudgetConfig): this {\n this.logger.debug('Configuring token budget', { max: config.max });\n this.budgetManager = new TokenBudgetManager(config, this.config.model, this.logger);\n return this;\n }\n\n /**\n * Configure conversation logging\n */\n withLogging(config: LogConfig): this {\n this.logger.debug('Configuring conversation logging');\n this.conversationLogger = new ConversationLogger(config, this.logger);\n this.conversationLogger.onConversationStart({\n model: this.config.model,\n startTime: new Date(),\n });\n return this;\n }\n\n /**\n * Save conversation log\n */\n async saveLog(): Promise<string> {\n if (!this.conversationLogger) {\n throw new Error('Logging not enabled. Call withLogging() first.');\n }\n\n this.conversationLogger.onConversationEnd({\n totalMessages: this.state.messages.length,\n toolCallsExecuted: this.state.metadata.toolCallCount,\n iterations: 0,\n success: true,\n });\n\n return await this.conversationLogger.save();\n }\n\n /**\n * Get current token usage\n */\n getTokenUsage(): TokenUsage {\n if (!this.budgetManager) {\n return { used: 0, max: Infinity, remaining: Infinity, percentage: 0 };\n }\n return this.budgetManager.getCurrentUsage(this.state.messages);\n }\n\n /**\n * Manually compress conversation\n */\n compress(_strategy?: CompressionStrategy): this {\n if (this.budgetManager) {\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n return this;\n }\n\n /**\n * Build and return the builder (for fluent API compatibility)\n */\n build(): this {\n return this;\n }\n\n /**\n * Calculate position for context injection\n */\n private calculatePosition(position: InjectOptions['position']): number {\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, this.state.messages.length));\n }\n\n switch (position) {\n case 'end':\n return this.state.messages.length;\n case 'before-last':\n return Math.max(0, this.state.messages.length - 1);\n case 'after-system': {\n // Find last system message (reverse search for compatibility)\n let lastSystemIdx = -1;\n for (let i = this.state.messages.length - 1; i >= 0; i--) {\n if (this.state.messages[i].role === 'system') {\n lastSystemIdx = i;\n break;\n }\n }\n return lastSystemIdx >= 0 ? lastSystemIdx + 1 : 0;\n }\n default:\n return this.state.messages.length;\n }\n }\n\n /**\n * Format context item based on format option\n */\n private formatContextItem(item: DynamicContentItem, format: 'structured' | 'inline' | 'reference'): string {\n switch (format) {\n case 'structured': {\n let result = `## ${item.title || 'Context'}\\n\\n${item.content}`;\n\n // Add metadata if available\n const metadata: string[] = [];\n if (item.source) {\n metadata.push(`Source: ${item.source}`);\n }\n if (item.timestamp) {\n metadata.push(`Timestamp: ${item.timestamp.toISOString()}`);\n }\n if (metadata.length > 0) {\n result += `\\n\\n_${metadata.join(' | ')}_`;\n }\n\n return result;\n }\n\n case 'inline':\n return `Note: ${item.title ? `${item.title}: ` : ''}${item.content}`;\n\n case 'reference':\n return `[Context Reference: ${item.id || 'unknown'}]\\nSee attached context${item.title ? ` for ${item.title}` : ''}`;\n\n default:\n return item.content;\n }\n }\n\n /**\n * Update metadata after state changes\n */\n private updateMetadata(): void {\n this.state.metadata.messageCount = this.state.messages.length;\n this.state.metadata.lastModified = new Date();\n }\n}\n\n/**\n * Export the builder for use in other modules\n */\nexport default ConversationBuilder;\n\n"],"names":["ConversationBuilderConfigSchema","z","object","model","string","formatter","any","optional","trackContext","boolean","default","deduplicateContext","ConversationBuilder","create","config","logger","defaultConfig","fromPrompt","prompt","targetModel","debug","Formatter","request","formatPrompt","messages","forEach","msg","state","push","updateMetadata","messageCount","length","addSystemMessage","content","messageContent","format","role","addUserMessage","message","budgetManager","canAddMessage","warn","compress","addAssistantMessage","addAssistantWithToolCalls","toolCalls","toolCount","tool_calls","metadata","toolCallCount","addToolResult","toolCallId","toolName","tool_call_id","name","addToolMessage","injectContext","context","options","opts","position","deduplicate","deduplicateBy","priority","weight","category","undefined","source","itemCount","itemsToAdd","item","enrichedItem","timestamp","Date","skip","id","contextManager","hasContext","hasContentHash","hasSimilarContent","calculatePosition","formatted","formatContextItem","contextMessage","splice","track","injectSystemContext","getMessageCount","getLastMessage","getMessages","hasToolCalls","getMetadata","toMessages","map","toJSON","serialized","created","toISOString","lastModified","contextProvided","Array","from","JSON","stringify","fromJSON","json","parsed","parse","builder","Set","clone","cloned","allContext","getAll","truncate","maxMessages","current","slice","removeMessagesOfType","filter","getContextManager","getState","asSystem","MessageBuilder","system","withContent","withFormatter","buildForModel","asUser","user","asAssistant","assistant","withToolCalls","asTool","callId","result","tool","withResult","withMetadata","withTokenBudget","max","TokenBudgetManager","withLogging","conversationLogger","ConversationLogger","onConversationStart","startTime","saveLog","Error","onConversationEnd","totalMessages","toolCallsExecuted","iterations","success","save","getTokenUsage","used","Infinity","remaining","percentage","getCurrentUsage","_strategy","build","Math","min","lastSystemIdx","i","title","join","wrapLogger","DEFAULT_LOGGER","ContextManager"],"mappings":"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"}
|
package/dist/formatter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sources":["../src/formatter.ts"],"sourcesContent":["import { Instruction } from \"riotprompt\";\nimport { z } from \"zod\";\nimport * as Chat from \"./chat\";\nimport { getPersonaRole, Message, Model } from \"./chat\";\nimport { DEFAULT_FORMAT_OPTIONS } from \"./constants\";\nimport { Section } from \"./items/section\";\nimport { Weighted } from \"./items/weighted\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Prompt } from \"./prompt\";\nimport { clean, stringifyJSON } from \"./util/general\";\n\nexport const SectionSeparatorSchema = z.enum([\"tag\", \"markdown\"]);\nexport const SectionTitlePropertySchema = z.enum([\"title\", \"name\"]);\n\nexport type SectionSeparator = z.infer<typeof SectionSeparatorSchema>;\nexport type SectionTitleProperty = z.infer<typeof SectionTitlePropertySchema>;\n\n\nexport const FormatOptionsSchema = z.object({\n sectionSeparator: SectionSeparatorSchema,\n sectionIndentation: z.boolean(),\n sectionTitleProperty: SectionTitlePropertySchema,\n sectionTitlePrefix: z.string().optional(),\n sectionTitleSeparator: z.string().optional(),\n sectionDepth: z.number().default(0),\n});\n\nexport type FormatOptions = z.infer<typeof FormatOptionsSchema>;\n\n\nexport const OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n formatOptions: FormatOptionsSchema.partial().optional().default(DEFAULT_FORMAT_OPTIONS),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n formatPersona: (model: Model, persona: Section<Instruction>) => Message;\n format: <T extends Weighted>(weightedText: T | Section<T>, sectionDepth?: number) => string;\n formatArray: <T extends Weighted>(items: (T | Section<T>)[], sectionDepth?: number) => string;\n formatPrompt: (model: Model, prompt: Prompt) => Chat.Request;\n}\n\n// Type guard to check if an object is a Section\nfunction isSection<T extends Weighted>(obj: T | Section<T>): obj is Section<T> {\n return obj && typeof obj === 'object' && 'items' in obj && Array.isArray((obj as Section<T>).items);\n}\n\n// Type guard to check if an object is a Section\nfunction isWeighted<T extends Weighted>(obj: T | Section<T>): obj is T {\n return obj && typeof obj === 'object' && 'text' in obj;\n}\n\n\nexport const create = (formatterOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(formatterOptions || {}) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Formatter');\n\n let formatOptions: FormatOptions = DEFAULT_FORMAT_OPTIONS;\n if (options?.formatOptions) {\n formatOptions = {\n ...formatOptions,\n ...clean(options.formatOptions),\n };\n }\n\n const formatPersona = (model: Model, persona: Section<Instruction>): Message => {\n logger.silly(`Formatting persona`);\n if (persona) {\n const formattedPersona = formatSection(persona);\n\n return {\n role: getPersonaRole(model),\n content: `${formattedPersona}`,\n }\n } else {\n throw new Error(\"Persona is required\");\n }\n }\n\n const format = <T extends Weighted>(\n item: T | Section<T>,\n sectionDepth?: number,\n ): string => {\n logger.silly(`Formatting ${isSection(item) ? \"section\" : \"item\"} Item: %s`, stringifyJSON(item));\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n let result: string = \"\";\n if (isSection(item)) {\n result = formatSection(item, currentSectionDepth + 1);\n } else if (isWeighted(item)) {\n result = item.text;\n } else {\n //If the item is neither a section nor a weighted item, it is empty.\n result = '';\n }\n return result;\n }\n\n const formatSection = <T extends Weighted>(section: Section<T>, sectionDepth?: number): string => {\n logger.silly(`Formatting section`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n if (section) {\n const formattedItems = section.items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n\n if (formatOptions.sectionSeparator === \"tag\") {\n return `<${section.title ?? \"section\"}>\\n${formattedItems}\\n</${section.title ?? \"section\"}>`;\n } else {\n // Use the current section depth for heading level\n const headingLevel = currentSectionDepth;\n const hashes = '#'.repeat(headingLevel);\n logger.silly(`\\t\\tHeading level: ${headingLevel}`);\n logger.silly(`\\t\\tSection title: ${section.title}`);\n return `${hashes} ${formatOptions.sectionTitlePrefix ? `${formatOptions.sectionTitlePrefix} ${formatOptions.sectionTitleSeparator} ` : \"\"}${section.title}\\n\\n${formattedItems}`;\n }\n } else {\n return '';\n }\n }\n\n // Helper function to format arrays of items or sections\n const formatArray = <T extends Weighted>(\n items: (T | Section<T>)[],\n sectionDepth?: number\n ): string => {\n logger.silly(`Formatting array`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n return items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n }\n\n const formatPrompt = (model: Model, prompt: Prompt): Chat.Request => {\n logger.silly('Formatting prompt');\n const chatRequest: Chat.Request = Chat.createRequest(model);\n\n if (prompt.persona) {\n [prompt.persona].forEach((persona: Section<Instruction>) => {\n chatRequest.addMessage(formatPersona(model, persona));\n });\n }\n\n let formattedAreas: string = formatSection(prompt.instructions) + '\\n\\n';\n\n if (prompt.contents) {\n formattedAreas += formatSection(prompt.contents) + '\\n\\n';\n }\n\n if (prompt.contexts) {\n formattedAreas += formatSection(prompt.contexts) + '\\n\\n';\n }\n\n chatRequest.addMessage({\n role: \"user\",\n content: formattedAreas,\n });\n\n return chatRequest;\n }\n\n return {\n formatPersona,\n format,\n formatPrompt,\n formatArray,\n }\n}\n"],"names":["SectionSeparatorSchema","z","enum","SectionTitlePropertySchema","FormatOptionsSchema","object","sectionSeparator","sectionIndentation","boolean","sectionTitleProperty","sectionTitlePrefix","string","optional","sectionTitleSeparator","sectionDepth","number","default","OptionSchema","logger","any","DEFAULT_LOGGER","formatOptions","partial","DEFAULT_FORMAT_OPTIONS","isSection","obj","Array","isArray","items","isWeighted","create","formatterOptions","options","parse","wrapLogger","clean","formatPersona","model","persona","silly","formattedPersona","formatSection","role","getPersonaRole","content","Error","format","item","stringifyJSON","currentSectionDepth","result","text","section","formattedItems","map","join","title","headingLevel","hashes","repeat","formatArray","formatPrompt","prompt","chatRequest","Chat","forEach","addMessage","formattedAreas","instructions","contents","contexts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formatter.js","sources":["../src/formatter.ts"],"sourcesContent":["import { Instruction } from \"riotprompt\";\nimport { z } from \"zod\";\nimport * as Chat from \"./chat\";\nimport { getPersonaRole, Message, Model } from \"./chat\";\nimport { DEFAULT_FORMAT_OPTIONS } from \"./constants\";\nimport { Section } from \"./items/section\";\nimport { Weighted } from \"./items/weighted\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Prompt } from \"./prompt\";\nimport { clean, stringifyJSON } from \"./util/general\";\n\nexport const SectionSeparatorSchema = z.enum([\"tag\", \"markdown\"]);\nexport const SectionTitlePropertySchema = z.enum([\"title\", \"name\"]);\n\nexport type SectionSeparator = z.infer<typeof SectionSeparatorSchema>;\nexport type SectionTitleProperty = z.infer<typeof SectionTitlePropertySchema>;\n\n\nexport const FormatOptionsSchema = z.object({\n sectionSeparator: SectionSeparatorSchema,\n sectionIndentation: z.boolean(),\n sectionTitleProperty: SectionTitlePropertySchema,\n sectionTitlePrefix: z.string().optional(),\n sectionTitleSeparator: z.string().optional(),\n sectionDepth: z.number().default(0),\n});\n\nexport type FormatOptions = z.infer<typeof FormatOptionsSchema>;\n\n\nexport const OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n formatOptions: FormatOptionsSchema.partial().optional().default(DEFAULT_FORMAT_OPTIONS),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n formatPersona: (model: Model, persona: Section<Instruction>) => Message;\n format: <T extends Weighted>(weightedText: T | Section<T>, sectionDepth?: number) => string;\n formatArray: <T extends Weighted>(items: (T | Section<T>)[], sectionDepth?: number) => string;\n formatPrompt: (model: Model, prompt: Prompt) => Chat.Request;\n}\n\n// Type guard to check if an object is a Section\nfunction isSection<T extends Weighted>(obj: T | Section<T>): obj is Section<T> {\n return obj && typeof obj === 'object' && 'items' in obj && Array.isArray((obj as Section<T>).items);\n}\n\n// Type guard to check if an object is a Section\nfunction isWeighted<T extends Weighted>(obj: T | Section<T>): obj is T {\n return obj && typeof obj === 'object' && 'text' in obj;\n}\n\n\nexport const create = (formatterOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(formatterOptions || {}) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Formatter');\n\n let formatOptions: FormatOptions = DEFAULT_FORMAT_OPTIONS;\n if (options?.formatOptions) {\n formatOptions = {\n ...formatOptions,\n ...clean(options.formatOptions),\n };\n }\n\n const formatPersona = (model: Model, persona: Section<Instruction>): Message => {\n logger.silly(`Formatting persona`);\n if (persona) {\n const formattedPersona = formatSection(persona);\n\n return {\n role: getPersonaRole(model),\n content: `${formattedPersona}`,\n }\n } else {\n throw new Error(\"Persona is required\");\n }\n }\n\n const format = <T extends Weighted>(\n item: T | Section<T>,\n sectionDepth?: number,\n ): string => {\n logger.silly(`Formatting ${isSection(item) ? \"section\" : \"item\"} Item: %s`, stringifyJSON(item));\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n let result: string = \"\";\n if (isSection(item)) {\n result = formatSection(item, currentSectionDepth + 1);\n } else if (isWeighted(item)) {\n result = item.text;\n } else {\n //If the item is neither a section nor a weighted item, it is empty.\n result = '';\n }\n return result;\n }\n\n const formatSection = <T extends Weighted>(section: Section<T>, sectionDepth?: number): string => {\n logger.silly(`Formatting section`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n if (section) {\n const formattedItems = section.items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n\n if (formatOptions.sectionSeparator === \"tag\") {\n return `<${section.title ?? \"section\"}>\\n${formattedItems}\\n</${section.title ?? \"section\"}>`;\n } else {\n // Use the current section depth for heading level\n const headingLevel = currentSectionDepth;\n const hashes = '#'.repeat(headingLevel);\n logger.silly(`\\t\\tHeading level: ${headingLevel}`);\n logger.silly(`\\t\\tSection title: ${section.title}`);\n return `${hashes} ${formatOptions.sectionTitlePrefix ? `${formatOptions.sectionTitlePrefix} ${formatOptions.sectionTitleSeparator} ` : \"\"}${section.title}\\n\\n${formattedItems}`;\n }\n } else {\n return '';\n }\n }\n\n // Helper function to format arrays of items or sections\n const formatArray = <T extends Weighted>(\n items: (T | Section<T>)[],\n sectionDepth?: number\n ): string => {\n logger.silly(`Formatting array`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n return items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n }\n\n const formatPrompt = (model: Model, prompt: Prompt): Chat.Request => {\n logger.silly('Formatting prompt');\n const chatRequest: Chat.Request = Chat.createRequest(model);\n\n if (prompt.persona) {\n [prompt.persona].forEach((persona: Section<Instruction>) => {\n chatRequest.addMessage(formatPersona(model, persona));\n });\n }\n\n let formattedAreas: string = formatSection(prompt.instructions) + '\\n\\n';\n\n if (prompt.contents) {\n formattedAreas += formatSection(prompt.contents) + '\\n\\n';\n }\n\n if (prompt.contexts) {\n formattedAreas += formatSection(prompt.contexts) + '\\n\\n';\n }\n\n chatRequest.addMessage({\n role: \"user\",\n content: formattedAreas,\n });\n\n return chatRequest;\n }\n\n return {\n formatPersona,\n format,\n formatPrompt,\n formatArray,\n }\n}\n"],"names":["SectionSeparatorSchema","z","enum","SectionTitlePropertySchema","FormatOptionsSchema","object","sectionSeparator","sectionIndentation","boolean","sectionTitleProperty","sectionTitlePrefix","string","optional","sectionTitleSeparator","sectionDepth","number","default","OptionSchema","logger","any","DEFAULT_LOGGER","formatOptions","partial","DEFAULT_FORMAT_OPTIONS","isSection","obj","Array","isArray","items","isWeighted","create","formatterOptions","options","parse","wrapLogger","clean","formatPersona","model","persona","silly","formattedPersona","formatSection","role","getPersonaRole","content","Error","format","item","stringifyJSON","currentSectionDepth","result","text","section","formattedItems","map","join","title","headingLevel","hashes","repeat","formatArray","formatPrompt","prompt","chatRequest","Chat","forEach","addMessage","formattedAreas","instructions","contents","contexts"],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { ConversationBuilder, ConversationMessage, ToolCall } from './conversation';
|
|
2
|
+
import { ToolRegistry, Tool } from './tools';
|
|
3
|
+
import { ReflectionReport, ReflectionConfig } from './reflection';
|
|
4
|
+
/**
|
|
5
|
+
* Tool usage policy for a phase
|
|
6
|
+
*/
|
|
7
|
+
export type ToolUsagePolicy = 'required' | 'encouraged' | 'optional' | 'forbidden';
|
|
8
|
+
/**
|
|
9
|
+
* LLM client interface (generic, provider-agnostic)
|
|
10
|
+
*/
|
|
11
|
+
export interface LLMClient {
|
|
12
|
+
complete(messages: ConversationMessage[], tools?: any[]): Promise<{
|
|
13
|
+
content: string | null;
|
|
14
|
+
tool_calls?: ToolCall[];
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Context provided to strategy execution
|
|
19
|
+
*/
|
|
20
|
+
export interface StrategyContext {
|
|
21
|
+
conversation: ConversationBuilder;
|
|
22
|
+
tools: ToolRegistry;
|
|
23
|
+
llm: LLMClient;
|
|
24
|
+
state: StrategyState;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Current state of strategy execution
|
|
28
|
+
*/
|
|
29
|
+
export interface StrategyState {
|
|
30
|
+
phase: string | number;
|
|
31
|
+
iteration: number;
|
|
32
|
+
toolCallsExecuted: number;
|
|
33
|
+
startTime: number;
|
|
34
|
+
insights: Insight[];
|
|
35
|
+
findings: any[];
|
|
36
|
+
errors: Error[];
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Insight discovered during execution
|
|
41
|
+
*/
|
|
42
|
+
export interface Insight {
|
|
43
|
+
source: string;
|
|
44
|
+
content: string;
|
|
45
|
+
confidence: number;
|
|
46
|
+
relatedTo?: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Result of tool execution
|
|
50
|
+
*/
|
|
51
|
+
export interface ToolResult {
|
|
52
|
+
callId: string;
|
|
53
|
+
toolName: string;
|
|
54
|
+
result: any;
|
|
55
|
+
error?: Error;
|
|
56
|
+
duration: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Action to take after iteration
|
|
60
|
+
*/
|
|
61
|
+
export type IterationAction = 'continue' | 'stop' | 'next-phase';
|
|
62
|
+
/**
|
|
63
|
+
* Action to take for tool call
|
|
64
|
+
*/
|
|
65
|
+
export type ToolCallAction = 'execute' | 'skip' | 'defer';
|
|
66
|
+
/**
|
|
67
|
+
* Result of a phase
|
|
68
|
+
*/
|
|
69
|
+
export interface PhaseResult {
|
|
70
|
+
name: string;
|
|
71
|
+
iterations: number;
|
|
72
|
+
toolCalls: number;
|
|
73
|
+
success: boolean;
|
|
74
|
+
insights?: Insight[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Final strategy result
|
|
78
|
+
*/
|
|
79
|
+
export interface StrategyResult {
|
|
80
|
+
finalMessage: ConversationMessage | undefined;
|
|
81
|
+
phases: PhaseResult[];
|
|
82
|
+
totalIterations: number;
|
|
83
|
+
toolCallsExecuted: number;
|
|
84
|
+
duration: number;
|
|
85
|
+
success: boolean;
|
|
86
|
+
conversation: ConversationBuilder;
|
|
87
|
+
reflection?: ReflectionReport;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Configuration for a strategy phase
|
|
91
|
+
*/
|
|
92
|
+
export interface StrategyPhase {
|
|
93
|
+
name: string;
|
|
94
|
+
maxIterations: number;
|
|
95
|
+
toolUsage: ToolUsagePolicy;
|
|
96
|
+
allowedTools?: string[];
|
|
97
|
+
minToolCalls?: number;
|
|
98
|
+
maxToolCalls?: number;
|
|
99
|
+
instructions?: string;
|
|
100
|
+
earlyExit?: boolean;
|
|
101
|
+
requireFinalAnswer?: boolean;
|
|
102
|
+
adaptiveDepth?: boolean;
|
|
103
|
+
continueIf?: (state: StrategyState) => boolean;
|
|
104
|
+
skipIf?: (state: StrategyState) => boolean;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Iteration strategy interface
|
|
108
|
+
*/
|
|
109
|
+
export interface IterationStrategy {
|
|
110
|
+
name: string;
|
|
111
|
+
description: string;
|
|
112
|
+
maxIterations: number;
|
|
113
|
+
maxToolCalls?: number;
|
|
114
|
+
timeoutMs?: number;
|
|
115
|
+
phases?: StrategyPhase[];
|
|
116
|
+
onStart?: (context: StrategyContext) => Promise<void>;
|
|
117
|
+
onIteration?: (iteration: number, state: StrategyState) => Promise<IterationAction>;
|
|
118
|
+
onToolCall?: (toolCall: ToolCall, state: StrategyState) => Promise<ToolCallAction>;
|
|
119
|
+
onToolResult?: (result: ToolResult, state: StrategyState) => Promise<void>;
|
|
120
|
+
onPhaseComplete?: (phase: PhaseResult, state: StrategyState) => Promise<void>;
|
|
121
|
+
onComplete?: (result: StrategyResult) => Promise<void>;
|
|
122
|
+
shouldContinue?: (state: StrategyState) => boolean;
|
|
123
|
+
shouldCallTool?: (tool: Tool, state: StrategyState) => boolean;
|
|
124
|
+
selectTools?: (available: Tool[], state: StrategyState) => Tool[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* StrategyExecutor executes iteration strategies.
|
|
128
|
+
*
|
|
129
|
+
* Features:
|
|
130
|
+
* - Execute multi-phase strategies
|
|
131
|
+
* - Manage tool calls and results
|
|
132
|
+
* - Track state and metrics
|
|
133
|
+
* - Handle timeouts and errors
|
|
134
|
+
* - Provide lifecycle hooks
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* const executor = new StrategyExecutor(llmClient);
|
|
139
|
+
*
|
|
140
|
+
* const result = await executor.execute(
|
|
141
|
+
* conversation,
|
|
142
|
+
* toolRegistry,
|
|
143
|
+
* strategy
|
|
144
|
+
* );
|
|
145
|
+
*
|
|
146
|
+
* console.log('Completed in', result.totalIterations, 'iterations');
|
|
147
|
+
* console.log('Used', result.toolCallsExecuted, 'tools');
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export declare class StrategyExecutor {
|
|
151
|
+
private llm;
|
|
152
|
+
private logger;
|
|
153
|
+
private metricsCollector?;
|
|
154
|
+
private reflectionConfig?;
|
|
155
|
+
constructor(llm: LLMClient, logger?: any);
|
|
156
|
+
/**
|
|
157
|
+
* Enable reflection generation
|
|
158
|
+
*/
|
|
159
|
+
withReflection(config: ReflectionConfig): this;
|
|
160
|
+
/**
|
|
161
|
+
* Execute a strategy
|
|
162
|
+
*/
|
|
163
|
+
execute(conversation: ConversationBuilder, tools: ToolRegistry, strategy: IterationStrategy): Promise<StrategyResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Save reflection report
|
|
166
|
+
*/
|
|
167
|
+
private saveReflection;
|
|
168
|
+
/**
|
|
169
|
+
* Execute a single phase
|
|
170
|
+
*/
|
|
171
|
+
private executePhase;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Factory for creating iteration strategies
|
|
175
|
+
*/
|
|
176
|
+
export declare class IterationStrategyFactory {
|
|
177
|
+
/**
|
|
178
|
+
* Investigate then respond strategy
|
|
179
|
+
* Phase 1: Use tools to gather information
|
|
180
|
+
* Phase 2: Synthesize into final answer
|
|
181
|
+
*/
|
|
182
|
+
static investigateThenRespond(config?: {
|
|
183
|
+
maxInvestigationSteps?: number;
|
|
184
|
+
requireMinimumTools?: number;
|
|
185
|
+
finalSynthesis?: boolean;
|
|
186
|
+
}): IterationStrategy;
|
|
187
|
+
/**
|
|
188
|
+
* Multi-pass refinement strategy
|
|
189
|
+
* Generate, critique, refine repeatedly
|
|
190
|
+
*/
|
|
191
|
+
static multiPassRefinement(config?: {
|
|
192
|
+
passes?: number;
|
|
193
|
+
critiqueBetweenPasses?: boolean;
|
|
194
|
+
improvementThreshold?: number;
|
|
195
|
+
}): IterationStrategy;
|
|
196
|
+
/**
|
|
197
|
+
* Breadth-first investigation
|
|
198
|
+
* Explore broadly before going deep
|
|
199
|
+
*/
|
|
200
|
+
static breadthFirst(config?: {
|
|
201
|
+
levelsDeep?: number;
|
|
202
|
+
toolsPerLevel?: number;
|
|
203
|
+
}): IterationStrategy;
|
|
204
|
+
/**
|
|
205
|
+
* Depth-first investigation
|
|
206
|
+
* Deep dive immediately
|
|
207
|
+
*/
|
|
208
|
+
static depthFirst(config?: {
|
|
209
|
+
maxDepth?: number;
|
|
210
|
+
backtrackOnFailure?: boolean;
|
|
211
|
+
}): IterationStrategy;
|
|
212
|
+
/**
|
|
213
|
+
* Adaptive strategy
|
|
214
|
+
* Changes behavior based on progress
|
|
215
|
+
*/
|
|
216
|
+
static adaptive(_config?: {
|
|
217
|
+
strategies?: IterationStrategy[];
|
|
218
|
+
switchConditions?: Array<{
|
|
219
|
+
when: (state: StrategyState) => boolean;
|
|
220
|
+
switchTo: number;
|
|
221
|
+
}>;
|
|
222
|
+
}): IterationStrategy;
|
|
223
|
+
/**
|
|
224
|
+
* Simple iteration (basic tool-use loop)
|
|
225
|
+
*/
|
|
226
|
+
static simple(config?: {
|
|
227
|
+
maxIterations?: number;
|
|
228
|
+
allowTools?: boolean;
|
|
229
|
+
}): IterationStrategy;
|
|
230
|
+
}
|
|
231
|
+
export default IterationStrategyFactory;
|