Current section
Files
Jump to
Current section
Files
lib/superintelligence_web/controllers/agent_controller.ex
defmodule SuperintelligenceWeb.AgentController do
use SuperintelligenceWeb, :controller
alias Superintelligence.AIAgent.{Coordinator, Brain, ToolRegistry}
def index(conn, _params) do
agents = Coordinator.list_agents()
json(conn, %{agents: format_agents(agents)})
end
def show(conn, %{"id" => agent_name}) do
case Map.get(Coordinator.list_agents(), agent_name) do
nil ->
conn
|> put_status(404)
|> json(%{error: "Agent not found"})
agent ->
json(conn, %{agent: format_agent(agent_name, agent)})
end
end
def create(conn, %{"name" => name} = params) do
config = Map.get(params, "config", %{})
case Coordinator.create_agent(name, config) do
{:ok, agent} ->
conn
|> put_status(201)
|> json(%{agent: format_agent(name, agent)})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
def execute_task(conn, %{"task" => task_description} = params) do
opts = Map.get(params, "options", [])
case Coordinator.submit_task(task_description, opts) do
{:ok, task_id} ->
json(conn, %{
task_id: task_id,
message: "Task submitted successfully"
})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
def execute_action(conn, %{"id" => agent_name, "action" => action} = params) do
args = Map.get(params, "args", %{})
case Superintelligence.AIAgent.Agent.execute_task(agent_name, action) do
{:ok, result} ->
json(conn, %{result: result})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
def status(conn, %{"id" => agent_name}) do
case Superintelligence.AIAgent.Agent.get_status(agent_name) do
status when is_map(status) ->
json(conn, %{status: status})
_ ->
conn
|> put_status(404)
|> json(%{error: "Agent not found"})
end
end
def tasks(conn, _params) do
tasks = Coordinator.list_tasks()
json(conn, %{tasks: format_tasks(tasks)})
end
def task_status(conn, %{"task_id" => task_id}) do
case Coordinator.get_task_status(task_id) do
nil ->
conn
|> put_status(404)
|> json(%{error: "Task not found"})
task ->
json(conn, %{task: format_task(task)})
end
end
def tools(conn, _params) do
tools = ToolRegistry.list_tools()
json(conn, %{tools: tools})
end
def create_tool(conn, %{"name" => name, "code" => code, "description" => description, "parameters" => parameters}) do
case ToolRegistry.create_or_update_tool(name, code, description, parameters) do
{:ok, tool} ->
conn
|> put_status(201)
|> json(%{tool: tool, message: "Tool created successfully"})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
def execute_tool(conn, %{"name" => name, "args" => args}) do
case ToolRegistry.execute_tool(name, args) do
{:ok, result} ->
json(conn, %{result: result})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
def delete(conn, %{"id" => agent_name}) do
case Coordinator.stop_agent(agent_name) do
:ok ->
json(conn, %{message: "Agent stopped successfully"})
{:error, reason} ->
conn
|> put_status(400)
|> json(%{error: reason})
end
end
# Private helpers
defp format_agents(agents) do
Enum.map(agents, fn {name, agent} ->
format_agent(name, agent)
end)
end
defp format_agent(name, agent) do
%{
name: name,
status: agent.status,
current_task: agent.current_task,
created_at: agent.created_at,
config: agent.config
}
end
defp format_tasks(tasks) do
tasks
|> Map.values()
|> Enum.map(&format_task/1)
end
defp format_task(task) do
%{
id: task.id,
description: task.description,
status: task.status,
created_at: task.created_at,
assigned_agent: task.assigned_agent,
result: task.result
}
end
end