A Bayle como backend de agentes
A maioria dos frameworks de agentes e assistentes conversa com um endpoint de chat completions compatível com a OpenAI. A Bayle é um deles, então um agente que deixa você configurar um provedor próprio roda na Bayle com três valores:
| Configuração | Valor |
|---|---|
| Base URL | https://api.bayle.ai |
| API key | Sua key da Bayle, lida de BAYLE_API_KEY |
| Modelo | Um id de modelo de GET /models |
Ver o prompt
Me ajude a configurar isto para usar a Bayle AI, uma API compatível com a OpenAI. Guia completo: https://docs.bayle.ai/pt-br/guides/agents/ai-agents/
Objetivo: fazer o meu agente de IA (ou framework de agentes) usar a Bayle como provedor de chat completions compatível com a OpenAI.
1. Descubra onde o meu agente aceita um provedor próprio: uma tela de configurações, um arquivo de configuração ou o construtor de um cliente. Se não der para saber qual é o agente pelo projeto, me pergunte.
2. Defina estes três valores:
Base URL: https://api.bayle.ai
API key: o valor de BAYLE_API_KEY, pela configuração de variável de ambiente do próprio agente, quando ele tiver uma
Modelo: MODEL_ID
A Bayle serve só chat completions, embeddings, imagens e vídeo. Desligue qualquer recurso do agente que dependa da Responses API, da Assistants API ou de upload de arquivos.
3. Escolha um modelo com suporte a function calling:
curl -s "https://api.bayle.ai/models?type=text" \
| jq -r '.data[] | select(.model_spec.capabilities.supportsFunctionCalling) | .id'
Me mostre a lista, deixe eu escolher e use esse id como MODEL_ID. Se o agente lida com conteúdo sensível, mostre também o model_spec.privacy de cada modelo.
4. Se o loop do agente for código meu: use stream: true nas respostas longas, repita 429, 503 e 504 com backoff e pare em 402 usd_spend_limit_exceeded em vez de tentar de novo.
5. Verifique com uma requisição real:
curl -s https://api.bayle.ai/chat/completions \
-H "Authorization: Bearer $BAYLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL_ID","messages":[{"role":"user","content":"Responda apenas a palavra pronto."}]}'
Depois rode um prompt curto pelo próprio agente.
Regras:
1. A base URL é https://api.bayle.ai exatamente como está escrita. Não acrescente nenhum caminho a ela.
2. Leia a key da variável de ambiente BAYLE_API_KEY. Nunca escreva a key em um arquivo que você criar, em um comando, em um commit nem no chat. Onde a ferramenta guarda a key na própria tela de configurações, me diga onde colar. Se BAYLE_API_KEY não estiver definida, pare e peça que eu crie uma key em https://chat.bayle.ai/developers e a exporte.
3. Pegue os ids de modelo só de GET https://api.bayle.ai/models (sem key). Nunca chute um.
4. Termine com uma requisição de teste de verdade, me mostre o resultado e liste os arquivos que você alterou.Escolha um modelo que chame ferramentas
Seção intitulada “Escolha um modelo que chame ferramentas”Um agente precisa de um modelo com suporte a function calling. GET /models não exige key, e o
model_spec.capabilities de cada modelo diz o que ele sabe fazer:
curl -s "https://api.bayle.ai/models?type=text" \ | jq -r '.data[] | select(.model_spec.capabilities.supportsFunctionCalling) | .id'O mesmo objeto traz supportsReasoning, supportsVision e optimizedForCode, que valem a pena
conferir para um agente de código ou multimodal. Se o seu agente lida com conteúdo sensível,
confira também model_spec.privacy; veja Privacidade.
Function calling
Seção intitulada “Function calling”Mande tools do jeito da OpenAI. Quando o modelo quer chamar uma ferramenta, o finish_reason é
tool_calls e as chamadas vêm em message.tool_calls.
import osfrom openai import OpenAI
client = OpenAI(api_key=os.environ["BAYLE_API_KEY"], base_url="https://api.bayle.ai")
tools = [{ "type": "function", "function": { "name": "get_weather", "description": "Get the weather for a city", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"], }, },}]
response = client.chat.completions.create( model="MODEL_ID", messages=[{"role": "user", "content": "What's the weather in Recife?"}], tools=tools,)call = response.choices[0].message.tool_calls[0]print(call.function.name, call.function.arguments)Execute a ferramenta, adicione o resultado como uma mensagem tool com o tool_call_id
correspondente e chame de novo. Geração de texto mostra o ciclo
completo.
Streaming
Seção intitulada “Streaming”Use stream: true para receber os tokens conforme são gerados. Agentes que mostram progresso, ou
que rodam tarefas longas, devem usar streaming: uma completion sem streaming precisa terminar em
30 segundos, enquanto um stream não tem prazo próprio da Bayle.
stream = client.chat.completions.create( model="MODEL_ID", messages=[{"role": "user", "content": "Plan a three-step refactor."}], stream=True,)for chunk in stream: if chunk.choices: print(chunk.choices[0].delta.content or "", end="", flush=True)Se um stream falhar no meio, o último evento é um envelope de erro seguido de [DONE]. Os SDKs
da OpenAI lançam uma exceção nesse caso; um parser escrito à mão deve verificar se cada evento
tem a chave error. Veja Como a Bayle funciona.
O que costuma pegar agentes
Seção intitulada “O que costuma pegar agentes”- Retentativas. A Bayle nunca repete uma chat completion por você, porque uma repetição
poderia ser cobrada duas vezes. Repita
429,503e504no seu agente, com backoff; veja Erros. - Saldo. Quando a key fica sem saldo, as requisições falham com
402usd_spend_limit_exceeded. O loop do agente deve parar aí, não tentar de novo. - Campos desconhecidos. Parâmetros que a Bayle não nomeia são repassados ao modelo como foram enviados, então opções específicas de cada framework em geral chegam até ele.
- Endpoints. Só chat completions, embeddings, imagens e vídeo são servidos. Um recurso de agente que dependa da Responses API, da Assistants API ou de upload de arquivos não vai funcionar.