メインコンテンツへスキップ
Weave Op は、すべての Call を自動的にログする、バージョン管理された関数です。このガイドは、Weave を使ってコードをインストルメント化する開発者向けです。Ops を作成する方法、Weave UI での表示をカスタマイズする方法、Weave がログするデータを制御する方法、サンプリングと削除を管理する方法を紹介します。
Op を作成するには、Python 関数に weave.op() デコレータを付けます。
import weave

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

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

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

カスタムの表示名を設定すると、特に関数名が汎用的だったり自動生成されたものだったりする場合に、Weave UI で Op を識別しやすくなります。
Op の表示名をカスタマイズするには、@weave.op デコレータで name パラメーターを設定します。
@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 の Call をどの程度の頻度でトレースするかを制御するには、@weave.op デコレータで tracing_sample_rate パラメーターを設定します。これは、高頻度の Ops で Call の一部のみをトレースすればよい場合に使用します。エージェントの開発中は、その動作を把握して調整しやすくするために、すべてのトレースを収集してください。本番環境では、エージェントの動作に対する可観測性を維持しつつコストを抑えるために、トレースのサンプリングを設定します。Weave は、サンプリング率を最も外側の Ops にのみ適用します。ネストされた op にサンプリング率が設定されていても、親 op が先にそれを Call した場合、Weave はネストされた 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
Weave が op の Call をサンプリングしない場合:
  • 関数は通常どおり実行されます。
  • Weave はトレースデータを受信しません。
  • Weave はその Call の子 op をトレースしません。
サンプリング率は 0.0 以上 1.0 以下である必要があります。
デフォルトでは、Weave は各 Call をログする際に、その Call へのリンクを表示します。logging中にcall linkが表示されないようにするには、WEAVE_PRINT_CALL_LINK 環境変数を false に設定します。これは、出力の冗長さを抑え、ログの煩雑さを減らしたい場合に便利です。
export WEAVE_PRINT_CALL_LINK=false

Op を削除する

Op バージョンを削除すると、project から削除されます。古くなったバージョンや不要なバージョンを整理するために使用します。
Op のバージョンを削除するには、Op ref で .delete() を呼び出します。
weave.init('intro-example')
my_op_ref = weave.ref('track_me:v1')
my_op_ref.delete()
削除した Op にアクセスすると、エラーになります。