メインコンテンツへスキップ
Weave Op は、すべての Call を自動的にログする、バージョン管理された関数です。
Op を作成するには、Python 関数を weave.op() でデコレートします
import weave

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

weave.init('intro-example')
track_me(15)
Op を呼び出すと、前回の Call からコードが変更されている場合は新しい Op バージョンが作成され、関数の入力と出力がログされます。@weave.op() でデコレートした関数は、呼び出す前に weave.init('your-project-name') を実行しなければ、通常どおりに動作します (コードのバージョン管理やトラッキングは行われません) 。Ops は Weave toolbelt を使用して serve または deploy できます。

表示名をカスタマイズする

@weave.op デコレーターの name パラメーターを設定すると、Op の表示名をカスタマイズできます。
@weave.op(name="custom_name")
def func():
    ...

kind と color を適用する

Weave UI で Ops をより見やすく整理するには、コード内の @weave.op デコレータに kind 引数と color 引数を追加して、カスタムの kind と color を設定します。たとえば、次のコードでは親関数に LLMkindbluecolor を、ネストされた関数に toolkindredcolor を適用しています。
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()
これにより、次のように Weave UI 内の Ops に color と kind が適用されます。
LLM の kind と blue の color を持つ親 call と、tool の kind と red の color を持つネストされた call を示す Weave UI。
使用できる kind の値は次のとおりです。
  • agent
  • llm
  • tool
  • search
使用できる color の値は次のとおりです。
  • red
  • orange
  • yellow
  • green
  • blue
  • purple

ログする入力と出力をカスタマイズする

元の関数を変更せずに Weave がログするデータを変えたい場合 (たとえば、機密データを隠すため) 、Op デコレーターに postprocess_inputspostprocess_output を渡せます。postprocess_inputs は、キーが argument 名、値が argument の値である dict を受け取り、変換後の入力を含む dict を返します。postprocess_output は、通常その関数が返す任意の値を受け取り、変換後の出力を返します。
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")

サンプリング率を制御する

@weave.op デコレーターで tracing_sample_rate パラメーターを設定すると、Op の call がどの頻度でトレースされるかを制御できます。これは、高頻度で実行される Ops で、call の一部だけをトレースすればよい場合に便利です。エージェントの開発中は、その挙動をより適切に把握して理解できるよう、すべてのトレースを収集することを推奨します。一方、本番では、エージェントの挙動の可観測性を維持しつつレートコストを抑えるために、トレースサンプリングを設定することを推奨します。Weave では、サンプリング率は最も外側の Op にのみ適用されます。ネストされた Op にサンプリング率が設定されていても、親 Op から先に呼び出された場合、そのネストされた Op のサンプリング率は無視されます。
@weave.op(tracing_sample_rate=0.1)  # call の約 10% のみをトレース
def high_frequency_op(x: int) -> int:
    return x + 1

@weave.op(tracing_sample_rate=1.0)  # 常にトレース(デフォルト)
def always_traced_op(x: int) -> int:
    return x + 1
Op の call がサンプリングされない場合:
  • 関数は通常どおり実行されます
  • トレースデータは Weave に送信されません
  • その call では子 Op もトレースされません
サンプリング率は 0.0 以上 1.0 以下である必要があります。
logging中にcall linkが表示されないようにするには、WEAVE_PRINT_CALL_LINK 環境変数を false に設定します。これは、出力の冗長さを抑え、ログの煩雑さを減らしたい場合に便利です。
export WEAVE_PRINT_CALL_LINK=false

Op を削除する

Op のバージョンを削除するには、Op ref で .delete() を呼び出します。
weave.init('intro-example')
my_op_ref = weave.ref('track_me:v1')
my_op_ref.delete()
削除した Op にアクセスすると、エラーになります。