Braintrust, otwarty SDK i zamknięta platforma ocen
Braintrust to hostowana platforma do mierzenia jakości aplikacji opartych na modelach językowych: zbiory testowe, funkcje oceniające, ślady wywołań, porównania eksperymentów i playground do iterowania nad promptem. SDK jest otwarte, sama platforma nie, a rachunek płacisz za liczbę zapisanych ocen i za ilość wysłanych danych. Ta asymetria decyduje o tym, kiedy narzędzie ma sens.
Co Braintrust właściwie robi
Pod nazwą kryją się cztery osobne rzeczy i mieszanie ich ze sobą jest najczęstszą przyczyną nieporozumień przy pierwszym kontakcie.
Pierwsza to biblioteka do uruchamiania ewaluacji offline. Definiujesz zbiór przypadków, funkcję zadania i listę scorerów, a SDK przepuszcza przez to wszystko dane i liczy wyniki. Druga to logger produkcyjny, czyli zapis rzeczywistych wywołań modelu ze spanami, kosztem i czasem odpowiedzi. Trzecia to sam serwis: magazyn eksperymentów, przeglądarka śladów, wykresy, porównanie dwóch przebiegów obok siebie oraz playground, w którym zmieniasz prompt i od razu widzisz wynik na tym samym zbiorze. Czwarta to autoevals, osobna biblioteka gotowych funkcji oceniających.
Rozróżnienie jest ważne, bo pierwsza, druga i czwarta część są otwarte i da się je czytać, a trzecia jest zamknięta i dostępna tylko jako usługa. Kod SDK potrafi policzyć wyniki lokalnie, ale nie ma czego zastąpić, gdy chcesz zobaczyć historię eksperymentów. Bez konta zostaje ci to, co wypisze konsola.
Warstwa integracji jest szeroka. W eksportach pakietu npm widać funkcje wrapOpenAI, wrapAnthropic, wrapMistral, wrapCohere, wrapGroq, wrapOllama, wrapGoogleGenAI, wrapAISDK, BraintrustMiddleware, a także mostki do LangSmith poprzez wrapLangSmithClient i wrapLangSmithTraceable. Po stronie Pythona odpowiedniki nazywają się wrap_openai, wrap_anthropic, wrap_litellm, wrap_instructor i setup_pydantic_ai.
Otwarty SDK, zamknięta platforma
Licencja tego projektu wygląda inaczej w zależności od tego, gdzie ją sprawdzisz, więc trzeba przejrzeć trzy miejsca osobno.
W rejestrach jest MIT. Pakiet npm braintrust w wersji 3.28.0 ma "license": "MIT" w pliku package.json, a koło z PyPI dla wersji 0.34.0 deklaruje License-Expression: MIT w pliku METADATA. To samo dotyczy pakietu autoevals w npm.
W repozytoriach jest Apache 2.0. Plik LICENSE w braintrust-sdk-javascript oraz w braintrust-sdk-python zawiera pełny tekst licencji Apache w wersji 2.0 ze stycznia 2004 roku, a nie tekst MIT. Pliku LICENSE.md nie ma w żadnym z nich. Obie licencje są permisywne i praktyczne skutki tej rozbieżności są niewielkie, ale skaner zależności zgłosi ci konflikt, a dział prawny zapyta, która wersja obowiązuje. Odpowiedzi na to pytanie w samych plikach nie znajdziesz.
W opublikowanych paczkach nie ma własnego pliku licencyjnego. Archiwum npm zawiera katalog licenses/ z licencjami cudzych bibliotek, konkretnie forków orchestrion-js, import-in-the-middle i require-in-the-middle, oraz plik NOTICE opisujący te forki, ale tekstu licencji samego Braintrusta w środku nie ma. Koło z PyPI nie deklaruje pola License-File i w katalogu braintrust-0.34.0.dist-info żadnego pliku licencyjnego nie znajdziesz. Kod jest za to prawdziwy: archiwum npm waży około 4,3 MB, koło Pythona zawiera 374 pliki, w tym framework.py, logger.py i oai.py.
Ciekawa jest odwrotna sytuacja w autoevals 0.3.0. Koło z PyPI zawiera plik autoevals-0.3.0.dist-info/licenses/LICENSE z tekstem MIT, ale METADATA nie ma ani pola License-Expression, ani klasyfikatora licencji, przez co API PyPI zwraca dla tego pakietu license: null. Skaner czytający tylko metadane uzna pakiet za pozbawiony licencji, choć plik leży w środku. Repozytorium autoevals ma zwykły plik LICENSE z tekstem MIT i sygnaturą BrainTrust Data z 2023 roku.
Sama platforma nie jest otwarta i nie ma jej wariantu do uruchomienia u siebie na zwykłym planie. Strona cennika wymienia wdrożenie on-premise lub hostowane wyłącznie w planie Enterprise z wyceną indywidualną. To nie jest self hosting w sensie, w jakim rozumie go Langfuse, tylko kontrakt.
Dwie linie wersji, dwa repozytoria
Numeracja myli i to nie jest twoja wina. Pakiet npm braintrust ma numer 3.28.0, a pakiet PyPI o tej samej nazwie ma numer 0.34.0. Oba wyszły 17 sierpnia 2026 roku, npm o 19:08 UTC, PyPI o 19:29 UTC, czyli w odstępie około pół godziny.
To nie są dwie gałęzie tego samego kodu ani mirror. To dwa niezależne repozytoria z osobnymi cyklami wydawniczymi. Pole repository w pakiecie npm wskazuje na braintrustdata/braintrust-sdk-javascript z podkatalogiem js, a project_urls na PyPI wskazuje na braintrustdata/braintrust-sdk-python. Historyczny adres github.com/braintrustdata/braintrust-sdk, który wciąż krąży po dokumentacji i wpisach na blogach, odpowiada dziś przekierowaniem 301 na wariant javascriptowy.
Kanał wydań potwierdza rozdzielenie. Feed wydań repozytorium javascriptowego zawiera pozycje w formacie braintrust@3.28.0, braintrust@3.27.0 z 4 sierpnia i braintrust@3.26.0 z 1 sierpnia, a także osobno wydawany pakiet @braintrust/otel@0.3.0. Feed repozytorium pythonowego używa innego formatu: Python SDK v0.34.0, Python SDK v0.33.0 z 11 sierpnia, Python SDK v0.32.0 z 5 sierpnia.
Praktyczna konsekwencja jest taka, że numer wersji z przykładu w dokumentacji nic ci nie mówi, dopóki nie sprawdzisz, o którym języku mowa. Zakres zależności równorzędnych sprawdziłem osobno i tu akurat pułapki nie ma: pakiet @braintrust/otel 0.3.0 deklaruje braintrust w zakresie >=1.0.0-0, więc instaluje się bez konfliktu obok rdzenia 3.28.0.
npm install braintrust autoevals
pip install "braintrust[cli]" autoevals
export BRAINTRUST_API_KEY=twoj_klucz
npx braintrust eval tutorial.eval.ts
braintrust eval eval_hello.pyPierwszy eval i logowanie w produkcji
Struktura ewaluacji jest w obu językach ta sama i sprowadza się do trzech argumentów: data, task i scores. W Pythonie Eval przyjmuje ponadto experiment_name, trial_count, metadata, tags, max_concurrency, timeout, parameters, error_score_handler i no_send_logs, a dla kodu asynchronicznego istnieje osobna funkcja EvalAsync.
from braintrust import Eval
from autoevals import Factuality, Levenshtein
def task(input, hooks):
hooks.metadata["wersja_promptu"] = "v3"
return "Hi " + input
Eval(
"Say Hi Bot",
data=lambda: [
{"input": "Foo", "expected": "Hi Foo"},
{"input": "Bar", "expected": "Hello Bar"},
],
task=task,
scores=[Levenshtein, Factuality],
trial_count=3,
max_concurrency=8,
tags=["regresja"],
)W TypeScripcie sygnatura to Eval(name, evaluator, reporterOrOpts?), a pola obiektu ewaluatora mają nazwy w konwencji camelCase: data, task, scores, classifiers, experimentName, trialCount, metadata, tags, isPublic, update, maxConcurrency, timeout. Do logowania produkcyjnego służy initLogger z polami projectName, projectId, environment, asyncFlush, apiKey i appUrl.
import { initLogger, wrapOpenAI, wrapTraced, flush } from "braintrust";
import OpenAI from "openai";
initLogger({
projectName: "wsparcie-klienta",
environment: "production",
asyncFlush: true,
});
const client = wrapOpenAI(new OpenAI());
export const answer = wrapTraced(async function answer(pytanie: string) {
const res = await client.chat.completions.create({
model: "gpt-5-mini",
messages: [{ role: "user", content: pytanie }],
});
return res.choices[0].message.content;
});
await flush();Klucz czytany jest ze zmiennej BRAINTRUST_API_KEY, a w Node.js dodatkowo z najbliższego pliku .env.braintrust w katalogu bieżącym lub nadrzędnym. Diagnostykę włącza BRAINTRUST_DEBUG_LOG_LEVEL z wartościami error, warn, info lub debug. Pakiet pythonowy rejestruje się jako wtyczka pytest przez punkt wejścia pytest11, a po stronie javascriptowej istnieją wrapVitest i eksport vitest-evals-reporter, więc ewaluacje da się wpiąć w istniejący zestaw testów zamiast trzymać je obok.
Autoevals bez konta Braintrust
To najważniejsza informacja dla kogoś, kto boi się przywiązania do dostawcy. Biblioteka autoevals jest osobnym pakietem na licencji MIT i działa bez klucza do Braintrusta. Funkcja init przyjmuje argument client, którym może być dowolny klient zgodny z API OpenAI, oraz default_model do ustawienia modelu sędziego. Domyślnie używany jest gpt-5-mini.
Scorery dzielą się na trzy grupy. Deterministyczne nie wołają żadnego modelu i liczą się lokalnie: Levenshtein, NumericDiff, JSONDiff, ValidJSON, ExactMatch, ListContains. Sędziowskie wołają model i zwracają ocenę z uzasadnieniem: Factuality, Battle, ClosedQA, Humor, Possible, Security, Sql, Summary, Translation. Trzecia grupa to metryki systemów z wyszukiwaniem, przeniesione wprost z nazewnictwa znanego z Ragas: Faithfulness, AnswerRelevancy, AnswerCorrectness, AnswerSimilarity, ContextPrecision, ContextRecall, ContextRelevancy, ContextEntityRecall.
from openai import OpenAI
from autoevals import init, Factuality, Levenshtein
init(client=OpenAI(base_url="http://localhost:11434/v1", api_key="brak"),
default_model="gpt-5-mini")
wynik = Factuality()(
input="Kto napisał Lalkę?",
output="Bolesław Prus",
expected="Bolesław Prus",
)
print(wynik.name, wynik.score, wynik.metadata)
print(Levenshtein(output="kot", expected="kox").score)Obiekt wyniku ma pola name, score w zakresie od zera do jedynki lub null oraz metadata. Zależności też warto znać, bo różnią się między językami. Wersja pythonowa ciągnie chevron, jsonschema, polyleven i pyyaml, a pakiet openai jest tam tylko w dodatku deweloperskim. Wersja javascriptowa ma openai w zakresie ^6.7.0 jako twardą zależność produkcyjną, więc instaluje się nawet wtedy, gdy modelu OpenAI w ogóle nie używasz. Do tego wymaga zod w zakresie ^3.25.0 || ^4.0.0 jako zależności równorzędnej.
Podsumowując możliwość wyjścia: scorery zabierzesz ze sobą, historii eksperymentów już nie.
Cennik i jednostka rozliczeniowa
Strona cennika renderuje się bez JavaScriptu, więc dane poniżej pochodzą z surowego HTML pobranego 22 sierpnia 2026 roku. Rozliczenie jest hybrydowe i składa się z czterech pozycji: stałej opłaty platformowej, kredytów na modele, przetworzonych danych liczonych w gigabajtach oraz ocen liczonych sztukowo.
| Pozycja | Starter | Pro | Enterprise |
|---|---|---|---|
| Opłata platformowa | 0 USD/mies. | 249 USD/mies. | wycena |
| Kredyty na modele | 10 USD | 249 USD | wycena |
| Przetworzone dane | 1 GB, potem 4 USD/GB | 5 GB, potem 3 USD/GB | wycena |
| Oceny | 10 tys., potem 2,50 USD za 1000 | 50 tys., potem 1,50 USD za 1000 | wycena |
| Retencja | 14 dni | 30 dni, dalej 0,50 USD/GB/mies. do 180 dni | wycena |
| Eksport do S3 | nie | nie | tak |
| SAML SSO | nie | nie | tak |
| Wdrożenie on-premise | nie | nie | tak |
Definicje z sekcji pytań są precyzyjne i mają znaczenie. Ocena to każdy pojedynczy zapisany wynik: „za każdym razem, gdy zapisujesz ocenę, licznik miesięczny rośnie o jeden". Przetworzone dane to dane wysłane do Braintrusta, a nie zajęta przestrzeń, i po przekroczeniu limitu skasowanie danych nie obniża licznika.
Policzmy zespół z tysiącem ocen dziennie, czyli trzydziestoma tysiącami miesięcznie przy miesiącu trzydziestodniowym. W planie Starter dziesięć tysięcy jest w cenie, a pozostałe dwadzieścia tysięcy kosztuje dwadzieścia razy 2,50 USD, czyli 50 USD, przy zerowej opłacie platformowej. W planie Pro trzydzieści tysięcy mieści się w limicie pięćdziesięciu tysięcy, więc za oceny nie płacisz nic, ale opłata platformowa wynosi 249 USD. Przy tym wolumenie Starter jest tańszy pięciokrotnie. Punkt zrównania na samej linii ocen wypada przy 199 tysiącach ocen miesięcznie, czyli około 6633 dziennie: Starter płaci wtedy 2,50 razy 189, a Pro 249 plus 1,50 razy 149, w obu przypadkach 472,50 USD. Zastrzeżenie wprost: ten rachunek obejmuje wyłącznie linię ocen. Przetworzonych danych nie da się przeliczyć bez znajomości rozmiaru pojedynczego śladu, więc świadomie tego nie zgaduję.
Co dzieje się po przekroczeniu limitu na planie darmowym, strona opisuje częściowo. Sekcja pytań mówi, że Starter nie wymaga karty i że użycie ponad limit włącza się przełącznikiem „on-demand usage" w ustawieniach rozliczeń albo przejściem na Pro. Czego dokładnie brakuje, gdy tego przełącznika nie włączysz, cennik nie precyzuje.
Jedna rozbieżność na tej samej stronie. Karta planu i tabela funkcji podają liczbę użytkowników jako nieograniczoną we wszystkich trzech planach, a odpowiedź na pytanie „Which plan is right for me?" opisuje Pro jako plan dla zespołów do pięciu osób. Obie liczby pochodzą z tego samego dokumentu i nie są ze sobą uzgodnione. Program dla startupów daje od 6 do 12 miesięcy planu Pro za darmo, pod warunkiem że jesteś nowym klientem i masz co najmniej 100 tysięcy dolarów pozyskanego finansowania. Ceny rocznej strona nie podaje, więc nie ma tu arytmetyki do sprawdzenia.
Braintrust wobec Langfuse, LangSmith, Promptfoo i Ragas
W tej kolekcji są już cztery pokrewne narzędzia i różnice między nimi sprowadzają się do dwóch osi: co jest otwarte i gdzie mieszkają dane.
| Narzędzie | Kod platformy | Wariant u siebie | Rozliczenie | Główny nacisk |
|---|---|---|---|---|
| Braintrust | zamknięty, SDK MIT | tylko Enterprise | oceny, dane, opłata stała | eksperymenty i playground |
| Langfuse | MIT | tak, bez negocjacji | zdarzenia w chmurze | śledzenie i prompty |
| LangSmith | zamknięty | plan dla dużych organizacji | ślady w chmurze | ekosystem LangChaina |
| Promptfoo | MIT | tak, lokalnie bez konta | brak dla wersji otwartej | testy z pliku konfiguracji |
| Ragas | Apache 2.0 | tak, biblioteka | brak | metryki systemów RAG |
Promptfoo jest przeciwieństwem Braintrusta pod względem progu wejścia: piszesz plik konfiguracyjny, uruchamiasz lokalnie i nie zakładasz konta. Langfuse jest wyborem, gdy dane muszą zostać na twojej infrastrukturze bez rozmowy z działem sprzedaży. LangSmith ma sens, gdy i tak stoisz na LangChainie. Ragas to biblioteka metryk, a nie platforma, i rozwiązuje węższy problem.
Braintrust wygrywa w jednym scenariuszu: kiedy nad promptem pracuje więcej osób niż tylko autor kodu. Playground, w którym menedżer produktu podmienia prompt i widzi wynik na tym samym zbiorze, oraz porównanie dwóch eksperymentów obok siebie to rzeczy, których nie zbudujesz w pół dnia. Dla jednoosobowego projektu, w którym i tak wszystko robisz z terminala, to przerost.
Typowe błędy
Pierwszy to szukanie repozytorium pod starym adresem. braintrustdata/braintrust-sdk jest dziś przekierowaniem i kod pythonowy leży gdzie indziej.
Drugi to porównywanie numerów wersji między językami. Trójka w npm i zero z kropką w PyPI opisują ten sam produkt w tym samym tygodniu. Przy czytaniu changelogów zawsze sprawdzaj, czyj to feed.
Trzeci to założenie, że skoro pakiet jest na MIT, to platforma też. Otwarte jest SDK i autoevals. Magazyn eksperymentów, interfejs i playground nie są.
Czwarty to przeoczenie flush przy asynchronicznym zapisie. Przy asyncFlush ustawionym na true funkcja w środowisku bezserwerowym może zakończyć się przed wysłaniem śladu.
Piąty to liczenie kosztu wyłącznie po ocenach. Przetworzone dane rosną niezależnie i po przekroczeniu limitu skasowanie danych nic nie daje, bo licznik jest kumulacyjny.
Szósty to poleganie na retencji. Czternaście dni na planie darmowym oznacza, że porównanie z eksperymentem sprzed trzech tygodni nie będzie możliwe, a eksport do S3 jest funkcją planu Enterprise. Jeśli historia ma znaczenie, trzymaj równolegle własną kopię wyników w repozytorium.
FAQ
Czy Braintrust jest open source
Częściowo. SDK w npm i PyPI oraz biblioteka autoevals są otwarte, przy czym rejestry deklarują MIT, a pliki LICENSE w repozytoriach zawierają tekst Apache 2.0. Platforma, czyli magazyn eksperymentów, interfejs i playground, jest zamknięta i dostępna jako usługa.
Czy da się używać autoevals bez konta Braintrust
Tak. Pakiet jest niezależny, a funkcja init przyjmuje dowolnego klienta zgodnego z API OpenAI, także lokalnego. Scorery deterministyczne w rodzaju Levenshtein czy JSONDiff nie potrzebują żadnego modelu.
Dlaczego npm ma wersję 3.28.0, a PyPI 0.34.0
Bo to dwa osobne repozytoria z niezależnymi cyklami wydawniczymi, mimo identycznej nazwy pakietu. Wydania z 17 sierpnia 2026 roku ukazały się tego samego dnia w odstępie około pół godziny, ale numery nigdy nie były zsynchronizowane.
Ile kosztuje tysiąc ocen dziennie
Na planie Starter za same oceny 50 USD miesięcznie, bo dziesięć tysięcy z trzydziestu tysięcy jest w cenie, a reszta kosztuje 2,50 USD za tysiąc. Na planie Pro oceny mieszczą się w limicie, ale płacisz 249 USD opłaty platformowej. Do tego dochodzą przetworzone dane, których nie da się oszacować bez znajomości rozmiaru śladu.
Czy Braintrusta można uruchomić u siebie
Na planach Starter i Pro nie. Strona cennika wymienia wdrożenie on-premise lub hostowane wyłącznie w planie Enterprise z wyceną indywidualną, co oznacza kontrakt, a nie pobranie obrazu.
Kiedy lepiej wybrać coś innego
Gdy pracujesz sam z terminala, prościej i taniej wypada Promptfoo. Gdy dane nie mogą opuścić twojej infrastruktury bez negocjacji, wybierz Langfuse. Gdy oceniasz wyłącznie system z wyszukiwaniem, wystarczy Ragas jako biblioteka.