Skip to main content
After you create Calls in W&B Weave, you often want to open a single call to inspect its inputs, outputs, and metadata. This page shows how to view a call in the UI or in the SDK, and how to customize how trace data is rendered in the UI using weave.Markdown.
To view a Call in the UI:
  1. Navigate to wandb.ai and select your project.
  2. In the Weave project sidebar, click Traces.
  3. Find the Call you want to view in the table.
  4. Click on the Call to open its details page.
For details on the Trace view, see Navigate the Weave Trace view.

Chat-style rendering in the Trace view

When you open a trace and select a call in the trace tree, the Call tab shows inputs and outputs for that op. For many LLM calls, Weave recognizes common provider request and response shapes and renders them as a chat-style layout (conversation bubbles) instead of only raw JSON. This applies to a single call inside the Trace view. For multi-turn sessions and the Threads chat pane, see Chat view behavior.

When chat-style rendering appears

Weave looks for structured message data in the logged inputs and outputs. Examples include:
  • OpenAI Chat Completions-style requests: A messages array whose elements include role and content, similar to the payload passed to client.chat.completions.create(...). When you use OpenAI tracing, those calls are logged in this shape automatically.
  • Matching responses: Response objects that carry assistant text in fields such as choices and nested message content, consistent with Chat Completions API responses.
Other integrations that log compatible chat completion inputs and outputs (for example Hugging Face Inference Client chat_completion calls) can also render as chat in the UI.

When you see raw JSON instead

If inputs and outputs do not match a recognized pattern, the Call tab shows structured JSON. To improve readability while keeping the underlying data, use weave.Markdown with postprocess_inputs and postprocess_output on @weave.op functions, as described in the next section.

Customize rendered traces with weave.Markdown

Use weave.Markdown to customize how your trace information is displayed without losing the original data. This allows you to render your inputs and outputs as readable blocks of formatted content while preserving the underlying data structure.
Use postprocess_inputs and postprocess_output functions in your @weave.op decorator to format your trace data. The following code sample uses postprocessors to render a call in Weave with emojis and more readable formatting:
import weave

def postprocess_inputs(query) -> weave.Markdown:
    search_box = f"""
**Search Query:**
``+`
{query}
``+`
"""
    return {"search_box": weave.Markdown(search_box),
            "query": query}

def postprocess_output(docs) -> weave.Markdown:
    formatted_docs = f"""
# {docs[0]["title"]}

{docs[0]["content"]}

[Read more]({docs[0]["url"]})

---

# {docs[1]["title"]}

{docs[1]["content"]}

[Read more]({docs[1]["url"]})
"""
    return weave.Markdown(formatted_docs)

@weave.op(
    postprocess_inputs=postprocess_inputs,
    postprocess_output=postprocess_output,
)
def rag_step(query):
    # example newspaper articles of the companies on the S&P 500 
    docs = [
        {
            "title": "OpenAI",
            "content": "OpenAI is a company that makes AI models.",
            "url": "https://www.openai.com",
        },
        {
            "title": "Google",
            "content": "Google is a company that makes search engines.",
            "url": "https://www.google.com",
        },
    ]
    return docs

if __name__ == "__main__":
    weave.init('markdown_renderers')
    rag_step("Tell me about OpenAI")
In the following screenshot, you can see the unformatted and formatted outputs side by side. A call rendered in the Weave UI using the code sample.