Files
crewAI/docs/edge/pt-BR/observability/braintrust.mdx
Lucas Gomide a237ebabba feat: adopt directory-based docs versioning with Edge channel (#6202)
* feat: adopt directory-based docs versioning with Edge channel

Switch docs.crewai.com from navigation-only versioning (every version
selector entry rendered the same docs/<lang>/* source files) to
Mintlify's directory-based versioning so each version selector entry
renders its own snapshot. Add an "Edge" channel under docs/edge/<lang>/*
that always reflects main HEAD for unreleased work, eliminating
pre-release leakage onto frozen release labels. External links to
canonical /<lang>/* URLs are preserved via wildcard redirects that
always land on the current default version.

Layout:
- docs/edge/<lang>/*         rolling source (you edit here)
- docs/edge/enterprise-api.*.yaml
- docs/v<X.Y.Z>/<lang>/*     frozen, immutable snapshots
- docs/v<X.Y.Z>/enterprise-api.*.yaml
- docs/images/               shared, append-only
- docs/docs.json             nav + redirects

URLs follow the Mintlify-idiomatic shape: /edge/<lang>/<page> for
Edge, /v<X.Y.Z>/<lang>/<page> for every frozen snapshot. The wildcard
redirects /<lang>/:slug* -> /<default>/<lang>/:slug* keep stale links
working, and every freeze rewrites them (plus all per-section/per-page
redirects) so destinations always resolve to the current default
without depending on a second redirect hop.

Release flow integration (devtools release):
- New module crewai_devtools.docs_versioning.freeze() materialises
  docs/v<X.Y.Z>/ from docs/edge/, rewrites openapi: refs inside the
  snapshot, inserts the version into every language block in
  docs.json, and refreshes all redirect destinations.
- _update_docs_and_create_pr() in cli.py now calls that freeze during
  Phase 2 of devtools release. Edge changelogs are updated first (so
  the snapshot freeze picks them up), then the snapshot is staged
  alongside docs.json, branched as docs/freeze-v<X.Y.Z>, and the PR
  is titled [docs-freeze] docs: snapshot and changelog for v<X.Y.Z>
  — the title prefix the new CI guard reads.
- The PR still gates tag, GitHub release, PyPI publish, and the
  enterprise release as before; no new PRs are added.
- Pre-releases (1.X.YaN, 1.X.YbN, ...) skip the snapshot — they ride
  Edge — and the docs PR title omits the [docs-freeze] prefix.
- docs_check (AI-generated docs scaffolding) writes to
  docs/edge/<lang>/* so newly-generated unreleased docs land in Edge
  and never accidentally touch a frozen snapshot.

Migration scripts (one-shot):
- scripts/docs/freeze_historical_versions.py reconstructs all 16
  historical snapshots (v1.10.0 .. v1.14.7) from git tags via
  git archive | tar, rewriting openapi: MDX refs so each snapshot
  reads its own enterprise-api YAML rather than the live one.
- scripts/docs/prefix_version_paths.py one-shot-migrates docs.json:
  rewrites every page path in 16 versioned blocks to point under
  docs/v<X.Y.Z>/, inserts a new Edge entry per language, tags
  v1.14.7 as Latest (default), prunes pages whose target file
  doesn't exist in the snapshot (e.g. docs/ar/ didn't exist before
  v1.12.0), and writes the wildcard + per-section redirects.
- scripts/docs/freeze_current_edge.py is now a thin CLI wrapper
  around docs_versioning.freeze for manual one-off freezes (e.g.
  retroactively snapshotting a forgotten release).

CI guards (.github/workflows/docs-snapshots.yml):
- Frozen snapshots under docs/v[0-9]*/ are immutable; only PRs whose
  title contains [docs-freeze] (i.e. release-cut PRs generated by
  devtools release or the manual wrapper) may modify them.
- Images under docs/images/ are append-only since snapshots share a
  single image directory. Deleting or renaming an image breaks every
  historical snapshot that still references it.

Restored docs/images/crewai-otel-export.png from PR #3673; it was
deleted in PR #4908 but v1.10.0 / v1.10.1 snapshots still reference
it. Restoring instead of editing the snapshots preserves historical
rendering fidelity and validates the new append-only rule
retroactively.

Tests:
- lib/devtools/tests/test_docs_versioning.py covers the freeze: file
  copy, openapi rewrite, version insertion, default demotion, redirect
  upserts, per-section redirect rewriting, idempotency, and invalid
  inputs.

Verified locally with mintlify broken-links: 0 broken links across
the full site (Edge + 16 frozen versions, 4 locales).

AGENTS.md (repo root) is the contributor guide for the new model;
RELEASING.md is the release-cut runbook; README's Contribution
section links to both.

Co-authored-by: Cursor <cursoragent@cursor.com>

* style: resolve linter issues

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 11:56:59 -04:00

238 lines
8.9 KiB
Plaintext

---
title: Braintrust
description: Integração do Braintrust para CrewAI com rastreamento OpenTelemetry e avaliação
icon: magnifying-glass-chart
mode: "wide"
---
# Integração Braintrust
Este guia demonstra como integrar o **Braintrust** com **CrewAI** usando OpenTelemetry para rastreamento e avaliação abrangentes. Ao final deste guia, você poderá rastrear seus agentes CrewAI, monitorar seu desempenho e avaliar suas saídas usando a poderosa plataforma de observabilidade do Braintrust.
> **O que é Braintrust?** [Braintrust](https://www.braintrust.dev) é uma plataforma de avaliação e observabilidade de IA que fornece rastreamento, avaliação e monitoramento abrangentes para aplicações de IA com rastreamento de experimentos e análises de desempenho integrados.
## Começar
Vamos percorrer um exemplo simples de uso do CrewAI e integração com Braintrust via OpenTelemetry para observabilidade e avaliação abrangentes.
### Passo 1: Instalar Dependências
```bash
uv add braintrust[otel] crewai crewai-tools opentelemetry-instrumentation-openai opentelemetry-instrumentation-crewai python-dotenv
```
### Passo 2: Configurar Variáveis de Ambiente
Configure as chaves de API do Braintrust e configure o OpenTelemetry para enviar rastreamentos para o Braintrust. Você precisará de uma chave de API do Braintrust e sua chave de API do OpenAI.
```python
import os
from getpass import getpass
# Obter suas credenciais do Braintrust
BRAINTRUST_API_KEY = getpass("🔑 Digite sua Chave de API do Braintrust: ")
# Obter chaves de API para serviços
OPENAI_API_KEY = getpass("🔑 Digite sua chave de API do OpenAI: ")
# Configurar variáveis de ambiente
os.environ["BRAINTRUST_API_KEY"] = BRAINTRUST_API_KEY
os.environ["BRAINTRUST_PARENT"] = "project_name:crewai-demo"
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
```
### Passo 3: Inicializar OpenTelemetry com Braintrust
Inicialize a instrumentação OpenTelemetry do Braintrust para começar a capturar rastreamentos e enviá-los para o Braintrust.
```python
import os
from typing import Any, Dict
from braintrust.otel import BraintrustSpanProcessor
from crewai import Agent, Crew, Task
from crewai.llm import LLM
from opentelemetry import trace
from opentelemetry.instrumentation.crewai import CrewAIInstrumentor
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
from opentelemetry.sdk.trace import TracerProvider
def setup_tracing() -> None:
"""Configurar rastreamento OpenTelemetry com Braintrust."""
current_provider = trace.get_tracer_provider()
if isinstance(current_provider, TracerProvider):
provider = current_provider
else:
provider = TracerProvider()
trace.set_tracer_provider(provider)
provider.add_span_processor(BraintrustSpanProcessor())
CrewAIInstrumentor().instrument(tracer_provider=provider)
OpenAIInstrumentor().instrument(tracer_provider=provider)
setup_tracing()
```
### Passo 4: Criar uma Aplicação CrewAI
Vamos criar uma aplicação CrewAI onde dois agentes colaboram para pesquisar e escrever um post de blog sobre avanços em IA, com rastreamento abrangente habilitado.
```python
from crewai import Agent, Crew, Process, Task
from crewai_tools import SerperDevTool
def create_crew() -> Crew:
"""Criar uma crew com múltiplos agentes para rastreamento abrangente."""
llm = LLM(model="gpt-4o-mini")
search_tool = SerperDevTool()
# Definir agentes com papéis específicos
researcher = Agent(
role="Analista de Pesquisa Sênior",
goal="Descobrir desenvolvimentos de ponta em IA e ciência de dados",
backstory="""Você trabalha em um think tank de tecnologia líder.
Sua especialidade está em identificar tendências emergentes.
Você tem talento para dissecar dados complexos e apresentar insights acionáveis.""",
verbose=True,
allow_delegation=False,
llm=llm,
tools=[search_tool],
)
writer = Agent(
role="Estrategista de Conteúdo Tecnológico",
goal="Criar conteúdo envolvente sobre avanços tecnológicos",
backstory="""Você é um Estrategista de Conteúdo renomado, conhecido por seus artigos perspicazes e envolventes.
Você transforma conceitos complexos em narrativas convincentes.""",
verbose=True,
allow_delegation=True,
llm=llm,
)
# Criar tarefas para seus agentes
research_task = Task(
description="""Realize uma análise abrangente dos últimos avanços em {topic}.
Identifique tendências principais, tecnologias revolucionárias e impactos potenciais na indústria.""",
expected_output="Relatório de análise completo em pontos de bala",
agent=researcher,
)
writing_task = Task(
description="""Usando os insights fornecidos, desenvolva um post de blog envolvente
que destaque os avanços mais significativos em {topic}.
Seu post deve ser informativo, mas acessível, atendendo a um público conhecedor de tecnologia.
Faça soar legal, evite palavras complexas para não soar como IA.""",
expected_output="Post de blog completo de pelo menos 4 parágrafos",
agent=writer,
context=[research_task],
)
# Instanciar sua crew com um processo sequencial
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
verbose=True,
process=Process.sequential
)
return crew
def run_crew():
"""Executar a crew e retornar resultados."""
crew = create_crew()
result = crew.kickoff(inputs={"topic": "desenvolvimentos em IA"})
return result
# Executar sua crew
if __name__ == "__main__":
# A instrumentação já foi inicializada acima neste módulo
result = run_crew()
print(result)
```
### Passo 5: Visualizar Rastreamentos no Braintrust
Após executar sua crew, você pode visualizar rastreamentos abrangentes no Braintrust através de diferentes perspectivas:
<Tabs>
<Tab title="Rastreamento(Trace)">
<Frame>
<img src="/images/braintrust-trace-view.png" alt="Visualização de Rastreamento Braintrust"/>
</Frame>
</Tab>
<Tab title="Linha do Tempo(Timeline)">
<Frame>
<img src="/images/braintrust-timeline-view.png" alt="Visualização de Linha do Tempo Braintrust"/>
</Frame>
</Tab>
<Tab title="Thread">
<Frame>
<img src="/images/braintrust-thread-view.png" alt="Visualização de Thread Braintrust"/>
</Frame>
</Tab>
</Tabs>
### Passo 6: Avaliar via SDK (Experimentos)
Você também pode executar avaliações usando o Eval SDK do Braintrust. Isso é útil para comparar versões ou pontuar saídas offline. Abaixo está um exemplo em Python usando a classe `Eval` com a crew que criamos acima:
```python
# eval_crew.py
from braintrust import Eval
from autoevals import Levenshtein
def evaluate_crew_task(input_data):
"""Função de tarefa que envolve nossa crew para avaliação."""
crew = create_crew()
result = crew.kickoff(inputs={"topic": input_data["topic"]})
return str(result)
Eval(
"Crew de Pesquisa em IA", # Nome do projeto
{
"data": lambda: [
{"topic": "tendências de inteligência artificial 2024"},
{"topic": "avanços em aprendizado de máquina"},
{"topic": "ética e governança de IA"},
],
"task": evaluate_crew_task,
"scores": [Levenshtein],
},
)
```
Configure sua chave de API e execute:
```bash
export BRAINTRUST_API_KEY="YOUR_API_KEY"
braintrust eval eval_crew.py
```
Veja o [guia do Eval SDK do Braintrust](https://www.braintrust.dev/docs/start/eval-sdk) para mais detalhes.
### Principais Recursos da Integração Braintrust
- **Rastreamento Abrangente**: Rastreie todas as interações de agentes, uso de ferramentas e chamadas LLM
- **Monitoramento de Desempenho**: Monitore tempos de execução, uso de tokens e taxas de sucesso
- **Rastreamento de Experimentos**: Compare diferentes configurações de crew e modelos
- **Avaliação Automatizada**: Configure métricas de avaliação personalizadas para saídas de crew
- **Rastreamento de Erros**: Monitore e depure falhas em suas execuções de crew
- **Análise de Custos**: Rastreie uso de tokens e custos associados
### Informações de Compatibilidade de Versão
- Python 3.8+
- CrewAI >= 0.86.0
- Braintrust >= 0.1.0
- OpenTelemetry SDK >= 1.31.0
### Referências
- [Documentação Braintrust](https://www.braintrust.dev/docs) - Visão geral da plataforma Braintrust
- [Integração CrewAI Braintrust](https://www.braintrust.dev/docs/integrations/crew-ai) - Guia oficial de integração CrewAI
- [Eval SDK Braintrust](https://www.braintrust.dev/docs/start/eval-sdk) - Execute experimentos via SDK
- [Documentação CrewAI](https://docs.crewai.com/) - Visão geral do framework CrewAI
- [Documentação OpenTelemetry](https://opentelemetry.io/docs/) - Guia OpenTelemetry
- [GitHub Braintrust](https://github.com/braintrustdata/braintrust) - Código fonte do SDK Braintrust