Packages

Agent Development Kit for Elixir — OTP-native AI agent framework inspired by Google ADK

Current section

Files

Jump to
adk lib adk.ex
Raw

lib/adk.ex

defmodule ADK do
@moduledoc """
The main entry point for ADK Elixir.
## Quick Start
agent = ADK.new("assistant", model: "test", instruction: "Help the user.")
ADK.chat(agent, "Hello!")
"""
@doc "Create a new LLM agent with minimal configuration."
@spec new(String.t(), keyword()) :: ADK.Agent.LlmAgent.t()
def new(name, opts \\ []) do
ADK.Agent.LlmAgent.new(Keyword.merge(opts, name: name))
end
@doc "Run an agent and return a list of events."
@spec run(ADK.Agent.t(), String.t() | map(), keyword()) :: [ADK.Event.t()]
def run(agent, message, opts \\ []) do
message = if is_binary(message), do: %{text: message}, else: message
runner = %ADK.Runner{app_name: opts[:app_name] || "adk_default", agent: agent}
user_id = opts[:user_id] || "default"
session_id = opts[:session_id] || generate_id()
ADK.Runner.run(runner, user_id, session_id, message, opts)
end
@doc "Send a message and get the final text response. Blocking."
@spec chat(ADK.Agent.t(), String.t(), keyword()) :: String.t() | nil
def chat(agent, message, opts \\ []) do
run(agent, message, opts)
|> Enum.filter(&ADK.Event.final_response?/1)
|> Enum.map(&ADK.Event.text/1)
|> List.last()
end
@doc "Create a sequential pipeline from agents."
@spec sequential([ADK.Agent.t()], keyword()) :: ADK.Agent.t()
def sequential(agents, opts \\ []) do
ADK.Agent.SequentialAgent.new(
name: opts[:name] || "sequential",
sub_agents: agents
)
end
defp generate_id do
:crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false)
end
end