Framework de agentes

lxai

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.

v0.1.0 ~60% completo

Highlights

  • Uma sessão por processo (gen_server)
  • Modelos plugáveis (OpenAI, ZAI)
  • Ferramentas executadas em paralelo
  • Storage de sessão & recuperação
  • Memória por usuário
  • Times multi-agente

Features

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.

Modelos

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.

Ferramentas

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 & storage

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ória

Memórias por usuário ficam guardadas (ETS) e injetadas no system prompt, então os agentes lembram preferências entre sessões.

Times

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.

Examples

Construir & rodar um agente

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)

Agente com uma ferramenta

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})

Streaming de tokens

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

Time: coordinate

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")

Install

# project.yml
dependencies:
  lxai:
    path: ../../lx_libs/lxai
  lxai_openai:
    path: ../../lx_libs/lxai_openai
  # ou lxai_zai para o provider ZAI