import "../api/openrouter_client.dart"; const _advisorSystemPrompt = "You are an advisor reviewing an AI agent's work in progress. " "You will be shown the full conversation history including tool calls and results. " "Your job is to give concise, actionable guidance: identify mistakes, " "suggest better approaches, flag assumptions that need verifying, or confirm " "the agent is on the right track. Be direct and specific."; const advisorToolDescription = "Call the advisor model for a second opinion on your current approach. " "Takes no parameters — your full conversation history is forwarded automatically. " "Call BEFORE committing to a significant approach, BEFORE declaring done, or when stuck."; class AdvisorService { Future run({ required String advisorModel, required String apiKey, required List> conversationSoFar, void Function(String toolName, Map input)? onToolCall, void Function(String toolName, String result)? onToolResult, }) async { onToolCall?.call("Advisor", {"model": advisorModel}); OpenRouterClient? client; try { client = OpenRouterClient( config: OpenRouterConfig(apiKey: apiKey), ); final response = await client.createMessage( model: advisorModel, maxTokens: 2048, messages: conversationSoFar, system: _advisorSystemPrompt, ); final text = response.content .whereType>() .where((b) => b["type"] == "text") .map((b) => b["text"] as String? ?? "") .join("\n") .trim(); final result = text.isEmpty ? "Advisor returned no guidance." : text; onToolResult?.call("Advisor", result); return result; } catch (e) { final err = "Advisor call failed: $e"; onToolResult?.call("Advisor", err); return err; } finally { client?.close(); } } }