Ir para o conteúdo
Trilha
Capítulos

Referência

ai

Cliente OpenAI-compatível, ferramentas, agentes, handoffs e composição.

import "github.com/emersonjoe/trilha/ai" — sem dependências externas.

Client#

Campo / funçãoPapel
NewFromEnv() *ClientOPENAI_API_KEY, OPENAI_BASE_URL (padrão https://api.openai.com/v1) e TRILHA_AI_MODEL (ou OPENAI_MODEL; padrão gpt-4o-mini)
BaseURL, APIKey, Model stringconfiguração direta
Headers map[string]stringcabeçalhos extras (OpenRouter, Azure...)
HTTPClient *http.Clientcliente HTTP (padrão com timeout de 2 min)
Chat(ctx, Request) (*Response, error)uma chamada; Response.Text() e Response.ToolCalls()
Stream(ctx, Request, func(Delta) error) errorresposta em pedaços; Delta.Content, Delta.ToolCalls, Delta.Usage no fim

Respostas não-2xx viram *ai.Error{Status, Code, Message}.

Request e mensagens#

Request{Model, Messages, Tools, ToolChoice, Temperature, MaxTokens, ResponseFormat, Extra}. Extra map[string]any é mesclado no JSON enviado, para parâmetros específicos do provedor. ResponseFormat{Type: "json_schema", JSONSchema: ...} pede saída estruturada.

Construtores: ai.System(s), ai.User(s), ai.Assistant(s), ai.ToolResult(callID, s).

Tool#

func NewTool(name, description string, schema json.RawMessage, fn ToolFunc) *Tool
type ToolFunc func(ctx context.Context, args json.RawMessage) (string, error)
func Schema(s string) json.RawMessage           // valida o JSON; pânico no início se inválido
func Typed[T any](fn func(ctx, in T) (string, error)) ToolFunc

schema == nil significa "sem argumentos". Erros e pânicos da função viram texto para o modelo (error: ...) e aparecem em Step.Err.

Agent#

CampoPapel
Nameidentifica o agente em Step.Agent e nos handoffs (transfer_to_<slug>)
Instructionsmensagem system
Modelsubstitui o modelo do cliente
Tools []*Toolferramentas
Handoffs []*Agentagentes para os quais este pode transferir a conversa
MaxTurnslimite de chamadas ao modelo por Run (padrão 10; excedido → ErrMaxTurns)
Temperature *float64, ResponseFormatpassados em cada requisição
func Run(ctx, cli *Client, agent *Agent, input string, history ...Message) (*Result, error)
func RunStream(ctx, cli *Client, agent *Agent, input string, fn func(Event), history ...Message) (*Result, error)

Result{Output, Agent, Messages, Steps, Usage, Turns}. Messages serve de histórico para a próxima chamada (mensagens system do histórico são ignoradas; valem as do agente atual).

Event.Type: text (Text), tool_call e tool_result (Step), handoff (Step.HandoffTo, Agent = novo agente), done (Result), error (Err).

Ferramentas de uma mesma rodada rodam em paralelo; a ordem dos resultados no histórico é a ordem em que o modelo as pediu. Um handoff troca a mensagem system, mantém o histórico e continua o laço com o agente alvo.

Composição#

func (a *Agent) AsTool(cli *Client, description string) *Tool   // {"input": "..."} → texto
func Parallel(ctx, cli, input string, agents ...*Agent) ([]*Result, error)
func Chain(ctx, cli, input string, agents ...*Agent) (*Result, error)

Parallel devolve na ordem dos agentes e propaga o primeiro erro; Chain passa Output de um como input do próximo.