Packages

A Fair Source multi-agent runtime with deterministic agent scoring and replayable run history.

Current section

Files

Jump to
syntropy lib syntropy_web controllers api task_controller.ex
Raw

lib/syntropy_web/controllers/api/task_controller.ex

defmodule SyntropyWeb.Api.TaskController do
use SyntropyWeb, :controller
alias Syntropy.HistoryStore
alias SyntropyWeb.Api.{ControllerHelpers, TaskJSON, TaskRequest}
@spec index(Plug.Conn.t(), map()) :: Plug.Conn.t()
def index(conn, params) do
limit = ControllerHelpers.limit(params)
tasks =
Syntropy.recent_tasks(limit)
|> Enum.map(&serialize_task/1)
json(conn, %{data: tasks})
end
@spec show(Plug.Conn.t(), map()) :: Plug.Conn.t()
def show(conn, %{"id" => task_id}) do
case Syntropy.task(task_id) do
nil -> ControllerHelpers.not_found(conn, "Task", task_id)
task -> json(conn, %{data: serialize_task(task)})
end
end
@spec create(Plug.Conn.t(), map()) :: Plug.Conn.t()
def create(conn, params) do
with {:ok, %{prompt: prompt, opts: opts}} <- TaskRequest.parse(params),
{:ok, task} <- Syntropy.submit(prompt, opts) do
json(conn, %{data: serialize_task(task)})
else
{:error, errors} when is_list(errors) ->
ControllerHelpers.invalid_request(conn, "Invalid task request.", errors)
{:error, reason} ->
ControllerHelpers.task_failure(conn, reason)
end
end
defp serialize_task(task) do
snapshot_ids =
task.task_id
|> HistoryStore.for_task()
|> Enum.map(& &1.id)
TaskJSON.task(task, snapshot_ids)
end
end