mcpField
S
shinka-convert

shinka-convert

github.com/sakanaai開発1.5k230 回インストール3 週間前に更新
リポジトリ

shinka-convert について

shinka-convert は、既存のコードベースを Shinka 対応タスクに変換するエージェントスキルです。既定では独立したタスクのスナップショットと評価器を作成し、元のソースコードは変更しません。

主な機能

  1. 01プロジェクト構成と依存関係を調査
  2. 02独立した Shinka タスクディレクトリを作成
  3. 03対象を絞った進化領域を指定
  4. 04評価器と Shinka 設定を生成
  5. 05評価と出力をスモークテスト

活用シーン

  1. 01既存スクリプトを Shinka 最適化向けに準備
  2. 02リポジトリを独立した進化タスクに変換
  3. 03タスク準備時に元のソースを保持

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sakanaai/shinkaevolve --skill shinka-convert

インストール後、Claude Code で/shinka-convertを入力して読み込まれたか確認します。

同梱ファイルscripts/run_evo.pyscripts/shinka.yaml

詳細

Shinka 変換スキル

既存のプロジェクトを Shinka 対応タスクに変換するには、このスキルを使用してください。

これは shinka-setup に代わる開始方法です。

  • shinka-setup:自然言語のタスク説明から新しいタスクを作成
  • shinka-convert:既存のコードベースを Shinka タスクに変換

変換後も、ユーザーが shinka-run を使用できる状態にします。

使用するタイミング

次のような場合に、このスキルを呼び出してください。

  • Shinka/ShinkaEvolve で既存のスクリプトやリポジトリを最適化したい
  • 現在のコードを Shinka の出力シグネチャ、metrics.json、correct.json、または EVOLVE-BLOCK マーカーに対応させたい
  • 現在の作業ディレクトリから、サイドカー形式の Shinka タスクを生成したい

次の場合は、このスキルを使用しないでください。

  • 自然言語の説明だけをもとに、新しいタスクのひな形を作成したい
  • evaluate.py と initial.<ext> がすでに存在し、進化の実行だけを行いたい。この場合は shinka-run を使用してください

ユーザーからの入力

まず自由形式の指示を受け取り、影響の大きい詳細が不足している場合に限って追加質問をします。

次の情報を確認してください。

  • 最適化する動作またはファイル/関数
  • スコアの方向性と主要な指標
  • 制約:正確性、実行時間、メモリ、決定性、スタイル、編集可能な範囲
  • 元のソースを変更せずに残す必要があるか
  • 必要なデータ/アセット/依存関係

デフォルトの出力

ユーザーから別の場所を指定されない限り、./shinka_task/ にサイドカー形式のタスクディレクトリを生成します。

タスクディレクトリには次のものを含めます。

  • evaluate.py
  • run_evo.py
  • shinka.yaml
  • initial.<ext>
  • 評価に必要な最小限の実行可能なソースサブツリーのコピー

ユーザーからインプレース変換を明示的に依頼されない限り、元のソースツリーは編集しないでください。

ワークフロー

  1. 現在の作業ディレクトリを確認します。
    • 言語、エントリーポイント、パッケージ/モジュール構成、依存関係、現在の出力を特定します。
    • 推測ではなく、コードから得られる具体的な根拠を優先します。
  2. ユーザーの指示から進化可能な領域を推定します。
    • 曖昧な場合は、対象を絞って追加質問します。
    • 変更可能な領域は、実用上可能な限り小さく保ちます。
  3. 実行に必要な最小限のスナップショット範囲を選びます。
    • タスクを独立して実行するために必要なソースサブツリーのみをコピーします。
    • インポートや実行環境の都合で必要な場合を除き、リポジトリ全体のスナップショットは避けます。
  4. サイドカー形式のタスクディレクトリを作成します。
    • デフォルト:./shinka_task/
    • 既存のタスクディレクトリは、承諾なしに上書きしないでください。
  5. スナップショットを安定した Shinka の契約に合わせて書き換えます。
    • 進化可能な領域以外では、元の動作を維持します。
    • 実用上可能な範囲で CLI の動作を維持します。
    • shinka-run が検出できるよう、進化候補のエントリーファイルを initial.<ext> という名前にします。
    • 範囲を絞った EVOLVE-BLOCK-START/EVOLVE-BLOCK-END マーカーを追加します。
  6. 評価器のパスを生成します。
    • Python:run_experiment(...) の公開を優先し、run_shinka_eval を使用します。
    • Python 以外:subprocess を使用し、metrics.json と correct.json を書き込みます。
  7. run_evo.py と shinka.yaml を生成します。
    • init_program_path と language が候補ファイルに一致するようにします。
    • 出力がそのまま shinka-run と互換性を保つようにします。
  8. 引き渡し前にスモークテストを実行します。
    • python evaluate.py --program_path <initial file> --results_dir /tmp/shinka_convert_smoke を実行します。
    • 評価器が例外なく実行されることを確認します。
    • 必須の指標/正確性の出力が書き込まれることを確認します。
  9. 次の手順をユーザーに確認します。
    • 手動で進化を実行する
    • または shinka-run スキルを使用する

言語ごとの変換方針

Python
  • 推奨方法:スナップショット内で run_experiment(...) を公開し、run_shinka_eval 経由で評価します
  • 既存コードが CLI のみの場合は、インポートが不安定すぎる場合を除き、subprocess を使った評価器を無理に作るのではなく、スナップショットに薄いラッパーを追加します
  • コピーしたタスクスナップショット内で、インポートが安定して解決されるようにします
Python 以外
  • 候補プログラムは、それぞれの実行環境で実行可能な状態を保ちます
  • Python の evaluate.py を Shinka のエントリーポイントとして使用します
  • results_dir に metrics.json と correct.json を書き込みます

必須の評価コントラクト

メトリクスには以下を含める必要があります。

  • combined_score
  • public
  • private
  • extra_data
  • text_feedback

正確性には以下を含める必要があります。

  • correct
  • error

ユーザーが集計時に変換する逆向きのメトリクスを明示的に定義している場合を除き、combined_score の値が高いほど、パフォーマンスが高いことを示します。

Python 変換テンプレート

コピーしたプログラムは、次のような形にすることをおすすめします。

from __future__ import annotations

# EVOLVE-BLOCK-START
def optimize_me(...):
    ...
# EVOLVE-BLOCK-END

def run_experiment(random_seed: int | None = None, **kwargs):
    ...
    return score, text_feedback

評価器は次のとおりです。

from shinka.core import run_shinka_eval

def main(program_path: str, results_dir: str):
    metrics, correct, err = run_shinka_eval(
        program_path=program_path,
        results_dir=results_dir,
        experiment_fn_name="run_experiment",
        num_runs=3,
        get_experiment_kwargs=get_kwargs,
        aggregate_metrics_fn=aggregate_fn,
        validate_fn=validate_fn,
    )
    if not correct:
        raise RuntimeError(err or "Evaluation failed")

Python 以外の変換テンプレート

evaluate.py を使って候補を実行し、出力を書き込みます。

import json
import os
from pathlib import Path

def main(program_path: str, results_dir: str):
    os.makedirs(results_dir, exist_ok=True)
    metrics = {
        "combined_score": 0.0,
        "public": {},
        "private": {},
        "extra_data": {},
        "text_feedback": "",
    }
    correct = {"correct": False, "error": ""}

    (Path(results_dir) / "metrics.json").write_text(json.dumps(metrics, indent=2))
    (Path(results_dir) / "correct.json").write_text(json.dumps(correct, indent=2))

同梱アセット

  • 開始用ランナーテンプレートとして scripts/run_evo.py を使用します
  • 開始用設定テンプレートとして scripts/shinka.yaml を使用します

注意事項

  • 進化領域は狭く保ち、プロジェクト全体をデフォルトで変更可能にしないでください
  • 可能な限り、進化領域の外で正確性チェックを維持してください
  • 決定論的な評価と安定したシードを優先してください
  • 変換したタスクの準備ができたら、shinka-run で続行することを提案してください

コメント