> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# DeepSWE v1.1 の評価を実行する

> DeepSWE v1.1 の小規模なサンプルを使用し、コードパッチの生成と採点をそれぞれ別のサンドボックスで実行します。

[DeepSWE](https://github.com/datacurve-ai/deep-swe) v1.1 の小規模なサンプルを使用して、コーディングエージェントを評価します。CoreWeave Sandboxes は、エージェントがコードを編集し、ベンチマークがそのパッチを検証するための環境を提供します。DeepSWE レシピには、評価スクリプト、依存関係のロックファイル、サンドボックスアダプターが含まれています。

このレシピは、[mini-swe-agent](https://github.com/SWE-agent/mini-swe-agent) コーディングエージェントをローカルマシン上で実行し、エージェントのシェルコマンドをサーバーレスサンドボックスに送信します。エージェントが終了すると、評価フレームワークである [Pier](https://pypi.org/project/datacurve-pier/0.3.1/) がコミットされた変更を収集し、エージェント用サンドボックスを停止します。続いて、新たに起動した検証用サンドボックスがパッチを適用し、非公開のテストを実行します。

この例では、モデルへのリクエストに [Serverless Inference](https://docs.wandb.ai/inference) 経由で `moonshotai/Kimi-K2.7-Code` を使用します。ただし、DeepSWE と Sandboxes の利用にこのプロバイダーは必須ではありません。提供されるレシピでは、Forge のエンドポイントと認証情報の処理が固定されています。`--model` オプションを使用すると、同じエンドポイント上の別のモデルを選択できます。別のプロバイダーを使用する場合は、レシピのモデルの設定と認証を変更する必要があります。

非公開のテストファイルは検証用サンドボックスにのみ渡されます。レシピは、両方のサンドボックスを外向きのネットワークアクセスを拒否した状態で作成します。サンドボックスと推論の認証情報は、ローカルマシンの外に送信されることはありません。

<Note>
  このガイドは、小規模なサンプルでインテグレーションを検証するためのものです。ホスト側のエージェントアダプターと run の制限は、公式の DeepSWE リーダーボードのセットアップとは異なります。2 つのタスクの結果から、ベンチマーク全体でのパフォーマンスを推定することはできません。
</Note>

<h2 id="prerequisites">
  前提条件
</h2>

開始する前に、次の前提条件を満たしていることを確認してください。

* Python 3.12 以降、Git、および [`uv`](https://docs.astral.sh/uv/getting-started/installation/) パッケージマネージャー。
* サーバーレスサンドボックスが有効になっている組織で Sandbox User ロールが付与された [CoreWeave API アクセストークン](/ja/products/sandboxes/placement#coreweave-api-access-token)。
* Serverless Inference 上のサンプルモデルにアクセスできる [Forge APIキー](https://wandb.ai/authorize)。
* ローカルマシンから Sandboxes API および `https://api.inference.wandb.ai/v1` へのネットワークアクセス。

各タスクは 2 CPU と 8 GiB のメモリをリクエストします。デフォルトでは、タスクは順番に実行され、エージェント用と検証用にそれぞれ別のサンドボックスが使用されます。GPU やローカルへの Docker のインストールは不要です。アダプターはタスクの CPU とメモリの設定を使用しますが、`storage_mb` 設定は強制しません。

[サンドボックスの使用料金がどのアカウントに請求されるか](/ja/products/sandboxes/placement#choose-and-get-credentials)と[推論の料金](https://docs.wandb.ai/inference/usage-limits/)を確認してください。ステップ数と時間制限は実行の範囲を制限するものであり、支出の上限ではありません。

<h2 id="install-the-recipe">
  レシピをインストールする
</h2>

recipes リポジトリをクローンし、ロックされた依存関係をインストールします。

```bash theme={"system"}
git clone https://github.com/coreweave/cwsandbox-recipes.git
cd cwsandbox-recipes/recipes/deepswe
uv sync --locked
```

このレシピでは、Pier 0.3.1、`mini-swe-agent` 2.2.6、`cwsandbox` 1.14.2 のバージョンが固定されています。以降のコマンドは `recipes/deepswe` ディレクトリで実行してください。

タスクのイメージと検証器のレイアウトをアダプターと一致させるため、テスト済みの DeepSWE リビジョンを取得します。

```bash theme={"system"}
git clone https://github.com/datacurve-ai/deep-swe.git
git -C deep-swe checkout 0b9fabbb63b9104d678fe965e1632f2dd9eaa2ea
```

<h2 id="configure-the-example-model-and-credentials">
  サンプルモデルと認証情報を設定する
</h2>

レシピを実行するターミナルで、両方の認証情報を設定します。`[API-ACCESS-TOKEN]` を CoreWeave API アクセストークンに、`[FORGE-API-KEY]` を Forge APIキーに置き換えるか、シークレットマネージャーからエクスポートしてください：

```bash theme={"system"}
export CWSANDBOX_API_KEY="[API-ACCESS-TOKEN]"
export FORGE_API_KEY="[FORGE-API-KEY]"
export MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT=3
export MSWEA_SILENT_STARTUP=1
```

このレシピでは、サンドボックスの認証に CoreWeave 認証を明示的に指定しています。上流のレシピは `FORGE_API_KEY` 変数を自動的には認識しないため、推論時に `FORGE_API_KEY` を読み取るようにローカルコピーを設定してください。

`run.py` で、`parse_args()` 内の認証情報チェックを次のコードに置き換えます。

```python theme={"system"}
for key in ["CWSANDBOX_API_KEY"] + (
    ["FORGE_API_KEY"] if args.agent == "mini" else []
):
    if not os.environ.get(key):
        parser.error(f"Set {key} in the environment")
```

`host_agent.py` で、`HostMiniSweAgent.run()` の冒頭にある推論キーの割り当て部分を次のコードに置き換えます。

```python theme={"system"}
os.environ["OPENAI_API_KEY"] = os.environ["FORGE_API_KEY"]
```

`OPENAI_API_KEY` は、この OpenAI 互換エンドポイントで LiteLLM が使用する変数です。これにより、認証情報はシリアライズされたモデルの設定ではなく、プロセスのメモリ内に保持されます。レシピはプロセスの環境変数から値を読み取るため、project の `.env` ファイルは自動では読み込まれません。

サンドボックスを作成する前に、モデルにアクセスできることを検証します。

```bash theme={"system"}
uv run --locked python - <<'PY'
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.inference.wandb.ai/v1",
    api_key=os.environ["FORGE_API_KEY"],
    timeout=60,
)
response = client.chat.completions.create(
    model="moonshotai/Kimi-K2.7-Code",
    messages=[{"role": "user", "content": "Respond with exactly OK."}],
    max_tokens=64,
)
print(response.choices[0].message.content)
PY
```

リクエストが成功すると、`OK` などの短い応答が返されます。サンプルを開始する前に、認証、モデルへのアクセス、クレジットに関するエラーがあれば解決してください。

<h2 id="run-a-sample">
  サンプルを実行する
</h2>

インテグレーションの初回確認として、Python タスクを 1 つ実行します。

```bash theme={"system"}
uv run --locked python run.py \
  --tasks deep-swe/tasks \
  --task tomlkit-toml-table-converters \
  --steps 160 --agent-timeout 1800 \
  --job-name kimi-smoke
```

タスクが 1 つだけの run でも、ステップ数または時間の利用枠の大半を使用することがあります。この run の目的はインテグレーションの確認であり、モデルがタスクを解けなくても run は成功します。

サンプルを拡張するには、新しいジョブ名を指定して、Go のタスクと Python のタスクを 1 つずつ実行します。

```bash theme={"system"}
uv run --locked python run.py \
  --tasks deep-swe/tasks \
  --task abs-stepped-slices \
  --task tomlkit-toml-table-converters \
  --steps 160 --agent-timeout 1800 \
  --job-name kimi-sample
```

レシピは、サンドボックスの作成、完了したモデルのステップ、サンドボックスのシャットダウンを報告します。各タスクには、エージェントのステップ数の上限 (160) とエージェントのタイムアウト (30 分) が設定されています。シェルコマンドのタイムアウトは 120 秒です。コマンドがタイムアウトした場合は観測結果として扱われるため、エージェントは処理を続行できます。

タスクのコレクションフックは、ベースコミットと `HEAD` リファレンスの差分を抽出します。変更を送信するパッチに含めるには、エージェントが変更をコミットする必要があります。コミットされていない編集は収集されません。

新しく run を実行する場合は、新しいジョブ名を使用してください。Pier は既存のジョブディレクトリを再開できるため、`kimi-sample` というジョブ名を再利用しても、クリーンな状態から再実行されるわけではありません。決定論的なランダムサンプリングやその他のレシピオプションについては、[レシピの README](https://github.com/coreweave/cwsandbox-recipes/blob/main/recipes/deepswe/README.md) を参照してください。

<h3 id="configure-concurrency-and-retries">
  同時実行数と再試行を設定する
</h3>

Pier はレシピの試行キューを管理します。`--concurrency` を使用して、同時に実行する試行の最大数を設定します。デフォルトは `1` です。まずこの設定でワークフロー全体を検証してください。その後、推論プロバイダーの利用枠の範囲内で、同時実行数を段階的に増やします。この利用枠には、同じアカウントを使用する他のジョブからのリクエストも含まれます。モデルへのアクセスチェックに成功しても、同時リクエストを処理できるキャパシティがあることの確認にはなりません。

レシピのデフォルトは `--max-retries 2` です。`RateLimitError`、`APIConnectionError`、または `ServiceUnavailableError` が発生した場合、Pier は試行を最大 2 回まで再開できます。1 回目の再試行の前には 30 秒、2 回目の前には 60 秒待機します。

再試行のたびにエージェントの新しい試みが開始されるため、追加料金が発生する可能性があります。ステップ数とエージェント時間の制限は、実行ごとに個別に適用されます。また、再試行のたびに新しいサンドボックスが作成されるため、作成されるサンドボックスの総数が同時試行数の上限を超えることがあります。

認証エラー、`SandboxFailedError` などのサンドボックスの起動失敗、上記以外の例外、および検証器のスコアが低い場合は、自動再試行はトリガーされません。試行の再試行を無効にするには、`--max-retries 0` を設定します。

レシピは、Pier が試行ディレクトリを置き換える前に、失敗した試みを `jobs/[JOB-NAME]/failed-attempts/[TRIAL-NAME]/[ATTEMPT-ID]/` に保存します。通常の試行ディレクトリとジョブの概要には、最後の実行の結果が格納されます。並列実行用のコマンドについては、レシピの[同時実行数と再試行の設定](https://github.com/coreweave/cwsandbox-recipes/blob/main/recipes/deepswe/README.md#configure-concurrency-and-retries)を参照してください。

<h3 id="handle-inference-throttling">
  推論のスロットリングに対処する
</h3>

`rate_limit_exceeded` と `concurrency limit reached for requests` を含む HTTP `429` 応答は、推論プロバイダーがモデルリクエストを拒否したことを示します。Forge は project 単位およびユーザー単位で制限を適用します。`--concurrency` の値を下げ、同じ推論アカウントを使用している他のジョブからの同時モデルリクエストも減らしてください。制限の引き上げが必要な場合は、[推論の制限に関するドキュメント](https://docs.wandb.ai/inference/usage-limits/#concurrency-limits)の案内に従ってサポートに問い合わせてください。

この例の `MSWEA_MODEL_RETRY_STOP_AFTER_ATTEMPT=3` 設定では、mini-swe-agent は失敗したモデルクエリごとに、初回を含めて最大 3 回まで試みます。リクエストが成功すれば、これらの再試行では同じ会話がそのまま継続されます。また、モデルクライアントが 1 回の試みの中で再試行を行う場合もあります。対象となる例外によってリクエストの再試行回数を使い切った場合は、Pier が試行の再試行ポリシーを適用します。

Pier 0.3.1 が制限するのは試行全体の数です。このレシピには、推論リクエスト専用の同時実行制限や、同時実行数を自動で調整する機能はありません。再試行回数を増やすだけでは、持続的な過負荷は解消されません。

1 つのジョブの中で、スロットリングされた試行の一部は回復し、残りは再試行を使い切るということもあります。再試行を使い切った試行には最終的な例外が記録され、レシピはゼロ以外のステータスで終了します。これらの試行が何の通知もなくスキップされることはありません。

持続的なスロットリングを解消したら、影響を受けたタスクだけを、同時実行数を下げて新しいジョブ名で再実行してください。再試行が別のエラーで終了した場合は、`failed-attempts/` ディレクトリもあわせて確認してください。推論のスロットリングとサンドボックスの起動失敗は、それぞれ切り分けて診断する必要があります。具体的なコマンドや、Pier に組み込まれているエラーでフィルタリングしたジョブ復旧の方法については、レシピの[スロットリングからの復旧手順](https://github.com/coreweave/cwsandbox-recipes/blob/main/recipes/deepswe/README.md#recover-from-inference-throttling)を参照してください。

<h2 id="inspect-the-results">
  結果を確認する
</h2>

以下の例では、2 タスクのジョブを確認します。1 タスクの run を確認する場合は、`kimi-sample` を `kimi-smoke` に置き換えてください。まず、ジョブの概要を読み取ります。

```bash theme={"system"}
uv run --locked python -m json.tool jobs/kimi-sample/result.json
```

`stats.n_completed_trials` は、エラーになったものも含めて完了した試行の数をカウントします。`stats.n_retries` がカウントするのは追加で実行された試行の数であり、追加のベンチマークサンプル数ではありません。回復した試行では、最終結果に例外がなくても、アーカイブ済みのエラーが残っている場合があります。

ジョブの集計スコアを解釈する前に、`stats.n_errored_trials` と、各試行の最終的な `exception_info` および `verifier_result` を確認してください。検証の開始に失敗し、パッチが 1 件も採点されなかった場合、集計平均が `0` になることがあります。

検証器の二値報酬が `0` または `1` で、例外が発生していない試行は、ワークフローを完了しています。報酬 `1` は、必須チェックにすべて合格したことを意味します。報酬 `0` は、パッチが必須チェックの一部を満たさなかったことを意味します。例外、報酬の欠落、または報酬 `-1` は run エラーです。run エラーはモデル性能とは切り離して調査してください。

`jobs/kimi-sample/` 配下の各試行ディレクトリには、以下のファイルが含まれます。

| File | 内容 |
| - | - |
| `result.json` | 試行のステータス、所要時間、トークン数、検証器の結果 |
| `agent/mini.trajectory.json` | モデルとの会話とシェル操作 |
| `artifacts/model.patch` | エージェントのコミットから収集したパッチ |
| `verifier/reward.json` | 二値報酬と部分スコア |
| `verifier/ctrf.json` | 構造化されたテスト結果 |
| `verifier/test-stdout.txt` | 検証器の出力 |

エージェントが自身のテストに合格したと報告していても、非公開のテストの結果を必ず確認してください。`reward.json` では、`f2p_passed` と `f2p_total` が新しい動作に対するチェックの数を、`p2p_passed` と `p2p_total` が既存のチェックの数をカウントします。必須チェックが 1 つでも失敗すると、`partial` スコアが高くても二値の `reward` が `0` になることがあります。

保存済みのトークン数は不完全な場合があります。このアダプターでは、ツール呼び出しがないために拒否された応答は、トークンを消費しても、その使用量が軌跡に記録されないことがあります。これらの数値から算出したコストはあくまで部分的な見積もりとして扱い、実際の料金はプロバイダーの請求で確認してください。事前確認のリクエストとサンドボックスの料金は別途発生します。

エージェントがパッチを送信したものの検証器の起動に失敗した場合は、`artifacts/model.patch` と元のエラー結果を保持してください。このレシピには、検証器のみを再試行するためのサポートされたコマンドはありません。モデルを新たに run すると新しい試行として扱われ、保存済みパッチの再採点にはなりません。別途再採点を行う場合は、変更していないパッチと、それに対応するタスクリビジョンを使用し、その結果を個別に保持する必要があります。

検証器を単独で確認するには、レシピの [no-edit および reference-solution コントロール](https://github.com/coreweave/cwsandbox-recipes/blob/main/recipes/deepswe/README.md#4-inspect-the-results)の手順に従ってください。これらのコントロールはモデルを呼び出さないため、モデルの結果とは分けて扱う必要があります。

<h2 id="clean-up">
  クリーンアップ
</h2>

Pier は、正常完了時およびエラー発生時のクリーンアップ中に、エージェント用と検証用のサンドボックスを停止します。また、各サンドボックスには 90 分の最大ライフタイムが設定されています。パッチ、軌跡、またはテストレポートが必要な場合は、ジョブディレクトリを削除せずに残しておいてください。

クリーンアップが完了する前にローカルの評価プロセスが強制終了された場合は、残っているサンドボックスを停止してください。`[SANDBOX-ID]` は、run のログに記載されているサンドボックス ID に置き換えてください。

```bash theme={"system"}
uv run --locked python - <<'PY'
from cwsandbox import AuthStrategy, Sandbox

sandbox = Sandbox.from_id(
    "[SANDBOX-ID]", auth=AuthStrategy.COREWEAVE_API_KEY
).result()
sandbox.stop(missing_ok=True).result()
PY
```

このレシピでは、GPU デプロイメント、モデルエンドポイント、Persistent Volume は作成されません。

<h2 id="troubleshooting">
  トラブルシューティング
</h2>

| 症状 | 対処 |
| - | - |
| 推論の認証エラーまたは権限エラー | Forge の APIキー、モデルへのアクセス権、推論クレジットを確認してください。サンドボックスの認証はこれとは別です。 |
| 推論の HTTP `429` または `RateLimitError` | プロバイダーのエラーメッセージを確認してください。同時実行数に関するエラーの場合は、[推論のスロットリングに対処する](#handle-inference-throttling)の手順に従ってください。再試行を使い切った場合は run のエラーとして扱われ、モデルのスコアには含まれません。 |
| モデルのステップまたは検証結果が得られる前にサンドボックスが失敗する | サンドボックスのステータスを確認し、イメージのプル失敗やキャパシティ不足が原因でないか調べてください。ジョブのアーティファクトを保持したまま、インフラストラクチャーのエラーを解決してから再実行してください。 |
| `Unsupported verifier Dockerfile` | 固定されたデータセットのリビジョンと、サポートされているサンプルタスクを使用してください。その他の検証用レイアウトを使用するには、アダプターの変更が必要です。 |
| `model.patch` ファイルが空になる | エージェントが上限に達する前に変更をコミットしたかどうかを確認してください。 |
| エージェントがステップ数または時間制限に達する | `--steps` または `--agent-timeout` の値を増やす前に、保存済みの軌跡とトークン使用量を確認してください。 |
| サンドボックス内で依存関係のインストールが失敗する | 外部へのネットワークアクセスは拒否されています。タスクにプリインストールされている依存関係を使用するか、タスクのイメージを調べてください。 |

<h2 id="next-steps">
  次のステップ
</h2>

詳細については、次のリソースを参照してください。

* [評価の概要](/ja/products/sandboxes/evals): 評価ワークフローを選択し、モデルの推論とベンチマークの実行を分離します。
* [DeepSWE レシピ](https://github.com/coreweave/cwsandbox-recipes/tree/main/recipes/deepswe): アダプター、テスト、サンプリングオプションを確認します。
* [SWE-bench による評価](/ja/products/sandboxes/client/guides/swebench): 別のベンチマークで既存のパッチを評価します。
* [クリーンアップパターン](/ja/products/sandboxes/client/guides/cleanup-patterns): 独自のアプリケーションでサンドボックスのライフサイクルを管理します。
