Typed, named entrypoints on an agent module.
An operation declares an input schema, an output schema, and a block of instructions. The macro generates a function on the agent module that validates the input, runs a transient agent session forced to produce a structured result, validates the output, and returns it.
Declaring
defmodule MyApp.ReviewAgent do
use Condukt
@impl true
def tools, do: [Condukt.Tools.Read]
operation :review_pr,
input: %{
type: "object",
properties: %{
repo: %{type: "string"},
pr_number: %{type: "integer"}
},
required: ["repo", "pr_number"]
},
output: %{
type: "object",
properties: %{
verdict: %{type: "string", enum: ["approve", "request_changes", "comment"]},
summary: %{type: "string"}
},
required: ["verdict", "summary"]
},
instructions: """
Read the PR, decide a verdict, and write a summary.
"""
endCalling
{:ok, %{verdict: "approve", summary: _}} =
MyApp.ReviewAgent.review_pr(%{repo: "tuist/condukt", pr_number: 1})Each call spins up a transient Condukt.Session, runs the agent loop with
the agent's tools plus a synthetic submit_result tool, captures the
structured result, and tears the session down. No history is kept across
calls.
Schemas must be JSON Schema maps. Atom keys are accepted in both schemas and call-site arguments — they are normalized internally.
Summary
Functions
Runs an operation declared on agent_module.
Functions
Runs an operation declared on agent_module.
Returns {:ok, result} on success or {:error, reason} on failure.
Failure reasons:
{:invalid_input, %JSV.ValidationError{}}— args did not match the input schema{:invalid_output, %JSV.ValidationError{}}— model output did not match the output schema:no_result_submitted— the agent finished without callingsubmit_result{:unknown_operation, name}— no operation by that name on the module- any error returned by the underlying
Condukt.Session.run/3