Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.bitfab.ai/llms.txt

Use this file to discover all available pages before exploring further.

Bitfab integrates with BAML to automatically capture rendered prompts and LLM metadata on the current span — no manual setPrompt or addContext calls needed. Wrap a BAML method with wrapBAML / wrap_baml and Bitfab extracts everything automatically. Canonical signatures: TypeScript wrapBAML · Python wrap_baml

Supported Languages

LanguageMethodStatus
TypeScriptwrapBAML()✅ Supported
Pythonwrap_baml()✅ Supported
RubyNot yet supported
GoNot yet supported

Quick Start

import { Bitfab } from "bitfab"
import { b } from "./baml_client"

const bitfab = new Bitfab({
  apiKey: process.env.BITFAB_API_KEY,
  bamlClient: b,
})

const tracedClassify = bitfab.withSpan(
  "classify",
  { type: "llm" },
  bitfab.wrapBAML(b.ClassifyText),
)

const result = await tracedClassify("Hello world")

What Gets Captured

wrapBAML / wrap_baml creates a BAML Collector, runs the method through a tracked client, then extracts:
DataSpan FieldSource
Rendered prompt (system + user messages)span_data.promptBAML Collector HTTP request body
Model namespan_data.contexts[].modelBAML Collector HTTP request body or URL
Providerspan_data.contexts[].providerBAML Collector call metadata
Input tokensspan_data.contexts[].inputTokensBAML Collector usage
Output tokensspan_data.contexts[].outputTokensBAML Collector usage
Durationspan_data.contexts[].durationMsBAML Collector timing
If @boundaryml/baml (TypeScript) or baml-py (Python) is not installed, the BAML method is called directly without instrumentation.

TypeScript

Installation

npm install bitfab @boundaryml/baml

Method Signature

// Form 1: bamlClient passed in constructor
bitfab.wrapBAML(method: Function): WrappedBamlFn
bitfab.wrapBAML(method: Function, options: WrapBAMLOptions): WrappedBamlFn

// Form 2: bamlClient passed at call site
bitfab.wrapBAML(bamlClient: unknown, method: Function): WrappedBamlFn
bitfab.wrapBAML(bamlClient: unknown, method: Function, options: WrapBAMLOptions): WrappedBamlFn
Parameters:
  • method (Function, required) — The BAML method to wrap (e.g., b.ClassifyText)
  • bamlClient (unknown, optional) — The BAML client instance. Required if not passed in the Bitfab constructor
  • options (WrapBAMLOptions, optional) — Configuration options
WrapBAMLOptions:
  • onCollector?: (collector: unknown) => void — Callback fired after each invocation with the BAML Collector instance
Returns: A WrappedBamlFn — an async function with the same signature as the original, plus a .collector property.

Usage

import { Bitfab } from "bitfab"
import { b } from "./baml_client"

const bitfab = new Bitfab({
  apiKey: process.env.BITFAB_API_KEY,
  bamlClient: b,
})

const tracedClassify = bitfab.withSpan(
  "classify",
  { type: "llm" },
  bitfab.wrapBAML(b.ClassifyText),
)

const result = await tracedClassify("Hello world")

Explicit Client

const bitfab = new Bitfab({ apiKey: process.env.BITFAB_API_KEY })

const tracedClassify = bitfab.withSpan(
  "classify",
  { type: "llm" },
  bitfab.wrapBAML(b, b.ClassifyText),
)

Accessing the BAML Collector

The wrapped function exposes a .collector property containing the BAML Collector from the most recent call:
const tracedClassify = bitfab.withSpan(
  "classify",
  { type: "llm" },
  bitfab.wrapBAML(b.ClassifyText),
)

await tracedClassify("Hello world")

const collector = tracedClassify.collector // BAML Collector instance
The .collector is null before the first call or if @boundaryml/baml is not installed.

onCollector Callback

For more control, pass an onCollector callback:
const tracedClassify = bitfab.withSpan(
  "classify",
  { type: "llm" },
  bitfab.wrapBAML(b.ClassifyText, {
    onCollector: (collector) => {
      console.log("BAML collector:", collector)
    },
  }),
)
With the explicit client form, options go in the third argument:
bitfab.wrapBAML(b, b.ClassifyText, {
  onCollector: (collector) => { /* ... */ },
})
If the callback throws, the error is silently caught — it never crashes your application.

Error Handling

If @boundaryml/baml is not installed, wrapBAML falls back to calling the method directly on the BAML client without instrumentation. Metadata extraction errors are silently caught.

Python

Installation

pip install bitfab-py baml-py

Method Signature

# Form 1: baml_client passed in constructor
bitfab.wrap_baml(method: Callable) -> Callable

# Form 2: baml_client passed at call site
bitfab.wrap_baml(baml_client: Any, method: Callable) -> Callable
Parameters:
  • method (Callable, required) — The BAML method to wrap (e.g., b.ClassifyText)
  • baml_client (Any, optional) — The BAML client instance. Required if not passed in the Bitfab constructor
Returns: An async wrapper with the same signature as the original method.

Usage

import os
from bitfab import Bitfab
from baml_client import b

bitfab = Bitfab(api_key=os.environ["BITFAB_API_KEY"], baml_client=b)

@bitfab.span("classify", type="llm")
async def classify(text: str):
    return await bitfab.wrap_baml(b.ClassifyText)(text=text)

result = await classify("Hello world")

Explicit Client

bitfab = Bitfab(api_key=os.environ["BITFAB_API_KEY"])

@bitfab.span("classify", type="llm")
async def classify(text: str):
    return await bitfab.wrap_baml(b, b.ClassifyText)(text=text)

Error Handling

If baml-py is not installed, wrap_baml falls back to calling the method directly on the BAML client without instrumentation. Metadata extraction errors are silently caught.