Skip to main content
When you call an LLM directly, outside of LangChain or a supported integration, you need to provide specific metadata so that LangSmith can display token counts, calculate costs, and let you open the run in the Playground with the correct provider and model. There are four requirements for a fully functional LLM trace:
If you are using LangChain OSS, the OpenAI wrapper, or the Anthropic wrapper, these details are handled automatically.The examples on this page use the traceable decorator/wrapper (the recommended approach for Python and JS/TS). The same requirements apply if you use the RunTree or API directly.

Messages format

When tracing a custom model or a custom input/output format, it must either follow the LangChain format, OpenAI completions format or Anthropic messages format. For more details, refer to the OpenAI Chat Completions or Anthropic Messages documentation. The LangChain format is:

Convert custom I/O formats into LangSmith compatible formats

If you’re using a custom input or output format, you can convert it to a LangSmith compatible format using process_inputs/processInputs and process_outputs/processOutputs functions on the @traceable decorator (Python) or traceable function (TS). process_inputs/processInputs and process_outputs/processOutputs accept functions that allow you to transform the inputs and outputs of a specific trace before they are logged to LangSmith. They have access to the trace’s inputs and outputs, and can return a new dictionary with the processed data. Here’s a boilerplate example of how to use process_inputs and process_outputs to convert a custom I/O format into a LangSmith compatible format:

Identify a custom model in traces

When using a custom model, it is recommended to also provide the following metadata fields to identify the model when viewing traces and when filtering.
  • ls_provider: The provider of the model, e.g. “openai”, “anthropic”, etc.
  • ls_model_name: The name of the model, e.g. “gpt-4.1-mini”, “claude-3-opus-20240229”, etc.
This code will log the following trace:
LangSmith UI showing an LLM call trace called ChatOpenAI with a system and human input followed by an AI Output.
If you implement a custom streaming chat_model, you can “reduce” the outputs into the same format as the non-streaming version. This is currently only supported in Python.
If ls_model_name is not present in extra.metadata, other fields might be used from the extra.metadata for estimating token counts. The following fields are used in the order of precedence:
  1. metadata.ls_model_name
  2. inputs.model
  3. inputs.model_name
To learn more about how to use the metadata fields, refer to the Add metadata and tags guide.

Provide token and cost information

Token counts enable cost calculation and are displayed in the trace UI. There are two ways to provide them:
  • Set usage_metadata on the run tree: call get_current_run_tree() / getCurrentRunTree() inside your @traceable function and set the usage_metadata field. This does not change your function’s return value.
  • Return usage_metadata in the output: include usage_metadata as a top-level key in the dictionary your function returns.

Supported usage_metadata fields

To send costs directly (for non-linear pricing), you can also include input_cost, output_cost, and total_cost fields. See Cost tracking for details on configuring model pricing and viewing costs in the UI.

Time-to-first-token

If you are using traceable or one of our SDK wrappers, LangSmith will automatically populate time-to-first-token for streaming LLM runs. However, if you are using the RunTree API directly, you will need to add a new_token event to the run tree in order to properly populate time-to-first-token. Here’s an example: