Passer au contenu principal
Un Op Weave est une fonction versionnée qui enregistre automatiquement tous les Appels.
Pour créer un Op, décorez une fonction Python avec weave.op()
import weave

@weave.op()
def track_me(v):
    return v + 5

weave.init('intro-example')
track_me(15)
L’appel d’un Op crée une nouvelle version de l’Op si le code a changé depuis le dernier appel, et enregistre les entrées et les sorties de la fonction.Les fonctions que vous décorez avec @weave.op() se comportent normalement (sans gestion des versions du code ni suivi) si vous n’appelez pas weave.init('your-project-name') avant de les appeler.Les Ops peuvent être servis ou déployés à l’aide de la boîte à outils Weave.

Personnaliser les noms d’affichage

Vous pouvez personnaliser le nom d’affichage de l’op en définissant le paramètre name dans le décorateur @weave.op :
@weave.op(name="custom_name")
def func():
    ...

Appliquer des types et des couleurs

Pour mieux organiser vos Ops dans la Weave UI, vous pouvez leur attribuer des types et des couleurs personnalisés en ajoutant les arguments kind et color aux décorateurs @weave.op dans votre code. Par exemple, le code suivant attribue le type LLM et la couleur blue à la fonction parente, ainsi que le type tool et la couleur red à une fonction imbriquée :
import weave

weave.init("<your-team-name>/<your-project-name>")

@weave.op(kind="LLM", color="blue")
def llm_func():
    @weave.op(kind="tool", color="red")
    def tool_func():
        return "tool result"

    tool_result = tool_func()
    
    return f"llm result with {tool_result}"

llm_func()
Cela applique ces couleurs et ces types à vos Ops dans la Weave UI, comme ceci :
La Weave UI, montrant un appel parent avec le type LLM et la couleur blue, ainsi qu’un appel imbriqué avec le type tool et la couleur red.
Les valeurs kind disponibles sont :
  • agent
  • llm
  • tool
  • search
Les valeurs color disponibles sont :
  • red
  • orange
  • yellow
  • green
  • blue
  • purple

Personnaliser les entrées et sorties enregistrées

Si vous souhaitez modifier les données que Weave enregistre sans modifier la fonction d’origine (par exemple, pour masquer des données sensibles), vous pouvez passer postprocess_inputs et postprocess_output au décorateur op.postprocess_inputs prend en entrée un dict où les clés sont les noms des arguments et les valeurs, les valeurs des arguments, puis renvoie un dict contenant les entrées transformées.postprocess_output prend en entrée n’importe quelle valeur normalement renvoyée par la fonction et renvoie la sortie transformée.
from dataclasses import dataclass
from typing import Any
import weave

@dataclass
class CustomObject:
    x: int
    secret_password: str

def postprocess_inputs(inputs: dict[str, Any]) -> dict[str, Any]:
    return {k:v for k,v in inputs.items() if k != "hide_me"}

def postprocess_output(output: CustomObject) -> CustomObject:
    return CustomObject(x=output.x, secret_password="REDACTED")

@weave.op(
    postprocess_inputs=postprocess_inputs,
    postprocess_output=postprocess_output,
)
def func(a: int, hide_me: str) -> CustomObject:
    return CustomObject(x=a, secret_password=hide_me)

weave.init('hide-data-example') # 🐝
func(a=1, hide_me="password123")

Contrôler le taux d’échantillonnage

Vous pouvez contrôler la fréquence à laquelle les appels d’un Op sont tracés en définissant le paramètre tracing_sample_rate dans le décorateur @weave.op. C’est utile pour les Ops à fréquence élevée lorsque vous n’avez besoin de tracer qu’un sous-ensemble des appels.Bien que nous recommandions de collecter toutes les traces pendant le développement d’agents afin de vous aider à mieux définir et comprendre leur comportement, nous recommandons de configurer l’échantillonnage des traces en Production pour réduire les coûts liés au volume tout en conservant une visibilité sur le comportement de votre agent.Weave applique les taux d’échantillonnage uniquement aux Ops les plus externes. Si un Op imbriqué a un taux d’échantillonnage, mais qu’un Op parent l’appelle en premier, le taux d’échantillonnage de l’Op imbriqué est ignoré.
@weave.op(tracing_sample_rate=0.1)  # Ne tracer qu’environ 10 % des appels
def high_frequency_op(x: int) -> int:
    return x + 1

@weave.op(tracing_sample_rate=1.0)  # Toujours tracer (par défaut)
def always_traced_op(x: int) -> int:
    return x + 1
Lorsqu’un appel d’un Op n’est pas échantillonné :
  • La fonction s’exécute normalement
  • Aucune donnée de trace n’est envoyée à Weave
  • Les Ops enfants ne sont pas non plus tracés pour cet appel
Le taux d’échantillonnage doit être compris entre 0.0 et 1.0, bornes incluses.
Si vous souhaitez empêcher l’affichage des liens d’appel pendant le logging, vous pouvez définir la variable d’environnement WEAVE_PRINT_CALL_LINK sur false. Cela peut être utile si vous voulez réduire la verbosité de la sortie et alléger vos journaux.
export WEAVE_PRINT_CALL_LINK=false

Suppression d’un Op

Pour supprimer une version d’un Op, appelez .delete() sur la référence de l’Op.
weave.init('intro-example')
my_op_ref = weave.ref('track_me:v1')
my_op_ref.delete()
Tenter d’accéder à un Op supprimé renvoie une erreur.