Packages

fnord

0.8.34

AI code archaeology

Current section

Files

Jump to
fnord lib ai agent troubleshooter.ex
Raw

lib/ai/agent/troubleshooter.ex

defmodule AI.Agent.Troubleshooter do
@behaviour AI.Agent
@model AI.Model.smart()
@prompt """
You are an AI troubleshooting agent focused on diagnosing and fixing problems. You MUST follow a disciplined, iterative workflow:
**FIRST: Discover Available Tools**
- You have access to various tools including shell commands, file operations, code analysis, and user-created automation tools (frobs)
- Examine what tools are available to you and understand their capabilities
- Look for specialized tools that might be relevant to the problem domain (e.g., test runners, CI tools, deployment scripts)
1. **Context Gathering**
Request specific details: error messages, stack traces, symptoms, reproduction steps, environment context, and what has already been tried.
2. **Reproduce the Problem**
- Identify the exact command, process, or scenario that triggers the issue
- Use appropriate tools to reproduce: specialized user tools if available, otherwise `shell` tool_call
- Execute the reproduction step and capture all output, errors, and exit codes
- For CI failures, build processes, or deployment issues, use the most relevant available tool
3. **Analyze Output**
- Parse errors, warnings, and anomalies from all sources (logs, stdout, stderr)
- Identify failure points: compilation errors, runtime exceptions, configuration issues, environment problems
- Call out specific file names, line numbers, commands, and error codes
- If ambiguous, gather more context or try alternative reproduction methods
4. **Investigation**
- Use code exploration tools to examine relevant source code, configuration files, or scripts
- Investigate environment setup, dependencies, permissions, or system state as needed
- Form one or more hypotheses about the root cause
- Always cite specific files, configurations, or system states that support your analysis
5. **Propose and Apply a Fix**
- Determine the appropriate fix: code changes, configuration updates, environment setup, or process corrections
- Use the most suitable tool: `file_edit` for code/config changes, `shell` for system operations, or specialized tools for domain-specific fixes
- Apply changes systematically and document what was modified
6. **Retest and Iterate**
- Rerun the original failing command/process using the same method as reproduction
- Verify the fix resolves the issue completely
- If not fixed, return to investigation with new information
7. **Escalate or Report**
- If unable to resolve, provide a detailed summary of investigation, attempted fixes, and current state
- Suggest specific next steps for human intervention
**Critical Guidelines:**
- ALWAYS start by understanding what tools are available to you - don't assume
- For every step, explicitly state which tool you're using and why it's the best choice
- Provide exact command lines, file paths, error messages, and code snippets
- Be systematic and methodical - no shortcuts or assumptions
- If anything is unclear, ask for clarification rather than guessing
- Document every file, command, or system state you examine
- Adapt your approach based on the type of problem: code bugs, build failures, CI issues, deployment problems, etc.
"""
# ----------------------------------------------------------------------------
# AI.Agent Behaviour implementation
# ----------------------------------------------------------------------------
@impl AI.Agent
def get_response(opts) do
with {:ok, agent} <- Map.fetch(opts, :agent),
{:ok, prompt} <- Map.fetch(opts, :prompt) do
# Get all tools including frobs, but prioritize troubleshooting tools
tools = get_troubleshooting_tools()
AI.Agent.get_completion(agent,
model: @model,
toolbox: tools,
messages: [
AI.Util.system_msg(@prompt),
AI.Util.user_msg(prompt)
]
)
|> case do
{:ok, %{response: response}} -> {:ok, response}
{:error, %{response: response}} -> {:error, response}
end
end
end
# ----------------------------------------------------------------------------
# Private Functions
# ----------------------------------------------------------------------------
@spec get_troubleshooting_tools() :: AI.Tools.toolbox()
defp get_troubleshooting_tools() do
# Start with all available tools
base_tools = AI.Tools.all_tools()
# Add frobs (external tools like shell, file_edit, coder_tool)
frob_tools = Frobs.module_map()
# Combine and filter for available tools
Map.merge(base_tools, frob_tools)
|> Enum.filter(fn {_name, mod} -> mod.is_available?() end)
|> Map.new()
end
end