Agentes
Construa com lxai:agent(model, tools, opts). Cada agente é um gen_server que guarda uma sessão; start_link, run, get_state, stop — supervisionado e reiniciável.
Agentes, idiomático em OTP
Framework agent-first para Lx, inspirado na Agno. Um Agent é um gen_server supervisionado (uma sessão por processo) com ferramentas, memória e storage; um Team é um processo líder com seu próprio sub-supervisor para os membros. Conecte qualquer provider (OpenAI, ZAI) e rode síncrono, em streaming ou totalmente assíncrono.
Construa com lxai:agent(model, tools, opts). Cada agente é um gen_server que guarda uma sessão; start_link, run, get_state, stop — supervisionado e reiniciável.
Um modelo é um handle %{module, state} com callbacks bind_tools / invoke / invoke_stream. lxai_openai e lxai_zai o implementam; há um stub para testes.
Structs Tool despachadas via erlang:apply. Chamadas de ferramenta do modelo rodam em paralelo (um worker cada), preservando a ordem; os resultados voltam pra conversa.
Sessões serializam para um behavior de storage (lxai_in_memory sobre ETS). Em restart a sessão é restaurada; agentes com storage usam restart :transient para recuperação.
Memórias por usuário ficam guardadas (ETS) e injetadas no system prompt, então os agentes lembram preferências entre sessões.
Coordene vários agentes com modos route / coordinate / collaborate, um líder, um router MFA e max_rounds. Delegue a um membro por role; membros podem até ser outros times.
require "lxai"
require "lxai_openai"
require "@lx/io"
model = lxai_openai:model("gpt-4o-mini")
agent = lxai:agent(model, [], %{
instructions: "Você é um assistente conciso.",
storage: :lxai_in_memory,
session_id: "s1"
})
{:ok, pid} = lxai:start_link(agent)
resp = lxai:run(pid, "O que é a BEAM?", nil)
io:puts(resp.content)
require "lxai"
require "lxai_tools"
tool = %lxai_tools:Tool{
name: "lookup_user",
description: "Encontra um usuário pelo nome",
parameters: %{name: :string},
module: :my_app,
function: :lookup_user
}
agent = lxai:agent(model, [tool], %{storage: :lxai_in_memory})
ref = lxai:run_stream(pid, "conte uma história", %lxai:RunConfig{}, self())
receive do
{:lxai_event, ref, {:content, delta}} -> io:puts(delta)
{:lxai_event, ref, {:final, resp}} -> io:puts("pronto")
end
members = [
{:researcher, lxai:agent(model_a, [], %{instructions: "Pesquisa"})},
{:writer, lxai:agent(model_b, [], %{instructions: "Escreve"})}
]
team = lxai:team(:coordinate, members, leader_agent)
{:ok, tpid} = lxai:start_team(team)
resp = lxai:team_run(tpid, "Escreva um post sobre Lx")
# project.yml
dependencies:
lxai:
path: ../../lx_libs/lxai
lxai_openai:
path: ../../lx_libs/lxai_openai
# ou lxai_zai para o provider ZAI