Skip to main content
Tracking inputs, outputs, and metadata, along with data flowing through your app, is essential to understanding your system’s performance. Versioning your app over time is equally important, because it shows how changes to your code or parameters affect your outputs. Weave’s Model class tracks these changes for you. This tutorial is for developers who want to compare and reproduce results across different versions of an LLM application. By the end, you’ll have a versioned Weave Model that captures your application’s parameters and code. You’ll also know how to retrieve and reuse a previous version. In this tutorial, you’ll learn:
  • How to use Weave Model to track and version your application and its parameters.
  • How to export, modify, and reuse a Weave Model already logged.

Use weave.Model

The weave.Model class is only supported in Python.
Using Weave Models means that Weave stores and versions parameters such as model vendor IDs, prompts, temperature, and more when they change. To create a Model in Weave, you need the following:
  • A class that inherits from weave.Model.
  • Type definitions on all class fields.
  • A typed invoke function with the @weave.op() decorator.
When you change the class fields or the code that defines your model, Weave logs these changes and updates the version. This ensures that you can compare the generations across different versions of your app. In the following example, Weave tracks and versions the model name, temperature, and system prompt:
import json
from openai import OpenAI

import weave

@weave.op()
def extract_dinos(wmodel: weave.Model, sentence: str) -> dict:
    response = wmodel.client.chat.completions.create(
        model=wmodel.model_name,
        temperature=wmodel.temperature,
        messages=[
            {
                "role": "system",
                "content": wmodel.system_prompt
            },
            {
                "role": "user",
                "content": sentence
            }
            ],
            response_format={ "type": "json_object" }
        )
    return response.choices[0].message.content

# Subclass with a weave.Model
class ExtractDinos(weave.Model):
    client: OpenAI = None
    model_name: str
    temperature: float
    system_prompt: str

    # Ensure your function is called `invoke` or `predict`
    @weave.op()
    def invoke(self, sentence: str) -> dict:
        dino_data  = extract_dinos(self, sentence)
        return json.loads(dino_data)
Now you can instantiate and call the model with invoke:
weave.init('jurassic-park')
client = OpenAI()

system_prompt = """Extract any dinosaur `name`, their `common_name`, \
names and whether its `diet` is a herbivore or carnivore, in JSON format."""

dinos = ExtractDinos(
    client=client,
    model_name='gpt-4o',
    temperature=0.4,
    system_prompt=system_prompt
)

sentence = """I watched as a Tyrannosaurus rex (T. rex) chased after a Triceratops (Trike), \
both carnivore and herbivore locked in an ancient dance. Meanwhile, a gentle giant \
Brachiosaurus (Brachi) calmly munched on treetops, blissfully unaware of the chaos below."""

result = dinos.invoke(sentence)
print(result)
After calling .invoke(), the trace in Weave tracks the model parameters along with the code for the model functions decorated with weave.op(). The model is also versioned (v21 in this case). Click the model to see all the calls that used that version. Reusing a weave model A note on using weave.Model:
  • You can use predict instead of invoke for the name of the function in your Weave Model if you prefer.
  • To track other class methods with Weave, wrap them in weave.op().
  • Weave ignores parameters starting with an underscore and doesn’t log them.

Export and reuse a logged weave.Model

Now that your model is versioned in Weave, you can retrieve any previous version and run it again without redefining it in code. This is useful for reproducing past results or for sharing a specific model version with others. Because Weave stores and versions Models that you’ve invoked, you can export and reuse them.

Get the Model ref

In the Weave UI, you can get the Model ref for a particular version.

Use the Model

Once you have the URI of the Model object, you can export and reuse it. The exported model is already initialized and ready to use:
# The exported Weave model is already initialized and ready to call.
new_dinos = weave.ref("weave://morgan/jurassic-park/object/ExtractDinos:ey4udBU2MU23heQFJenkVxLBX4bmDsFk7vsGcOWPjY4").get()

# Set the client to the OpenAI client again.
new_dinos.client = client

new_sentence = """I also saw an Ankylosaurus grazing on giant ferns"""
new_result = new_dinos.invoke(new_sentence)
print(new_result)
You can now see that the new input uses the same Model version (v21): Reusing a weave model You now have a versioned Weave Model that you can iterate on, retrieve, and reuse across different versions of your application.

What’s next