> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-docs-hivemind-launch.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Ops をカスタマイズする

> 視認性を高めるために Ops に色を付ける方法、ログする内容を変更する方法、サンプリング率を制御する方法を学びます

Weave Op は、すべての Call を自動的にログする、バージョン管理された関数です。

<Tabs>
  <Tab title="Python">
    Op を作成するには、Python 関数を `weave.op()` でデコレートします

    ```python lines theme={null}
    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](/ja/weave/guides/tools/serve) または [deploy](/ja/weave/guides/tools/deploy) できます。
  </Tab>

  <Tab title="TypeScript">
    Op を作成するには、TypeScript 関数を `weave.op` でラップします

    ```typescript lines theme={null}
    import * as weave from 'weave'

    function trackMe(v: number) {
        return v + 5
    }

    const trackMeOp = weave.op(trackMe)
    trackMeOp(15)

    // インラインで行うこともでき、こちらのほうが便利な場合があります
    const trackMeInline = weave.op((v: number) => v + 5)
    trackMeInline(15)
    ```
  </Tab>
</Tabs>

<div id="customize-display-names">
  ## 表示名をカスタマイズする
</div>

<Tabs>
  <Tab title="Python">
    `@weave.op` デコレーターの `name` パラメーターを設定すると、Op の表示名をカスタマイズできます。

    ```python lines theme={null}
    @weave.op(name="custom_name")
    def func():
        ...
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={null}
    この機能はまだTypeScriptでは利用できません。
    ```
  </Tab>
</Tabs>

<div id="apply-kinds-and-colors">
  ## kind と color を適用する
</div>

Weave UI で Ops をより見やすく整理するには、コード内の `@weave.op` デコレータに `kind` 引数と `color` 引数を追加して、カスタムの kind と color を設定します。たとえば、次のコードでは親関数に `LLM` の `kind` と `blue` の `color` を、ネストされた関数に `tool` の `kind` と `red` の `color` を適用しています。

<Tabs>
  <Tab title="Python">
    ```python lines theme={null}
    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()
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={null}
    この機能はまだ TypeScript では利用できません。
    ```
  </Tab>
</Tabs>

これにより、次のように Weave UI 内の Ops に color と kind が適用されます。

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-hivemind-launch/ZegPXYL2RL3US8k1/images/weave/weave_colors_kinds.png?fit=max&auto=format&n=ZegPXYL2RL3US8k1&q=85&s=1b018e339f2ff475a73612cf020653e8" alt="LLM の kind と blue の color を持つ親 call と、tool の kind と red の color を持つネストされた call を示す Weave UI。" width="1288" height="605" data-path="images/weave/weave_colors_kinds.png" />
</Frame>

使用できる `kind` の値は次のとおりです。

* `agent`
* `llm`
* `tool`
* `search`

使用できる `color` の値は次のとおりです。

* `red`
* `orange`
* `yellow`
* `green`
* `blue`
* `purple`

<div id="customize-logged-inputs-and-outputs">
  ## ログする入力と出力をカスタマイズする
</div>

<Tabs>
  <Tab title="Python">
    元の関数を変更せずに Weave がログするデータを変えたい場合 (たとえば、機密データを隠すため) 、Op デコレーターに `postprocess_inputs` と `postprocess_output` を渡せます。

    `postprocess_inputs` は、キーが argument 名、値が argument の値である dict を受け取り、変換後の入力を含む dict を返します。

    `postprocess_output` は、通常その関数が返す任意の値を受け取り、変換後の出力を返します。

    ```python lines theme={null}
    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")
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={null}
    この機能は TypeScript ではまだ利用できません。
    ```
  </Tab>
</Tabs>

<div id="control-sampling-rate">
  ## サンプリング率を制御する
</div>

<Tabs>
  <Tab title="Python">
    `@weave.op` デコレーターで `tracing_sample_rate` パラメーターを設定すると、Op の call がどの頻度でトレースされるかを制御できます。これは、高頻度で実行される Ops で、call の一部だけをトレースすればよい場合に便利です。

    エージェントの開発中は、その挙動をより適切に把握して理解できるよう、すべてのトレースを収集することを推奨します。一方、本番では、エージェントの挙動の可観測性を維持しつつレートコストを抑えるために、トレースサンプリングを設定することを推奨します。

    Weave では、サンプリング率は最も外側の Op にのみ適用されます。ネストされた Op にサンプリング率が設定されていても、親 Op から先に呼び出された場合、そのネストされた Op のサンプリング率は無視されます。

    ```python lines theme={null}
    @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 以下である必要があります。
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={null}
    この機能はまだ TypeScript では利用できません。
    ```
  </Tab>
</Tabs>

<div id="control-call-link-output">
  ## call linkの出力を制御する
</div>

logging中にcall linkが表示されないようにするには、`WEAVE_PRINT_CALL_LINK` 環境変数を `false` に設定します。これは、出力の冗長さを抑え、ログの煩雑さを減らしたい場合に便利です。

```bash lines theme={null}
export WEAVE_PRINT_CALL_LINK=false
```

<div id="deleting-an-op">
  ## Op を削除する
</div>

<Tabs>
  <Tab title="Python">
    Op のバージョンを削除するには、Op ref で `.delete()` を呼び出します。

    ```python lines theme={null}
    weave.init('intro-example')
    my_op_ref = weave.ref('track_me:v1')
    my_op_ref.delete()
    ```

    削除した Op にアクセスすると、エラーになります。
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={null}
    この機能は TypeScript ではまだ利用できません。
    ```
  </Tab>
</Tabs>
