YAML Metadata Warning: empty or missing yaml metadata in repo card (https://huggingface.co/docs/hub/model-cards#model-card-metadata)

base_model: unsloth/Qwen3-4B-Instruct-2507-unsloth-bnb-4bit tags:

  • text-generation-inference
  • transformers
  • unsloth
  • qwen3 license: apache-2.0

このモデルは、テキストエディタ上における過去数回の操作履歴から、次に行われる編集を予測するモデル(Next Edit Prediction Model)です。 AlibabaのQwen3-4B-Instruct-2507をファインチューニングして作成されました。

使い方

Qwen3-Instructの標準的なChatTemplateをそのまま使用しています。

system_prompt = """You are a code completion assistant. Your job is to rewrite the excerpt provided by the user, analyzing their edits and suggesting appropriate edits within the excerpt, taking into account the cursor's position.
The region where you can suggest the next edit is between <|editable_region_start|> and <|editable_region_end|>. Please predict the next edit between these tags and write the code that will fit within that region after the edits are applied."""

user_prompt = """### User Edits:
{}

### Currently User Code:
{}

"""
model_name = "SousiOmine/minoshiro-NEP-v1-sft"

# load the tokenizer and the model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)

prompt = user_prompt.format(直近のユーザーによる編集(後述), コード(後述))
chat = [
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": prompt},
]

input = tokenizer.apply_chat_template(chat, tokenize = False, add_generation_prompt = True)

inputs = tokenizer(
[
    input
], return_tensors = "pt").to("cuda")

from transformers import TextStreamer
_ = model.generate(
    **tokenizer(input, return_tensors = "pt").to("cuda"),
    max_new_tokens = 1000, # Increase for longer outputs!
    temperature = 0.7, top_p = 0.8, top_k = 20, # For non thinking
    streamer = TextStreamer(tokenizer, skip_prompt = True),
)

システムプロンプトは、次のような内容を指定してください。

You are a code completion assistant. Your job is to rewrite the excerpt provided by the user, analyzing their edits and suggesting appropriate edits within the excerpt, taking into account the cursor's position.
The region where you can suggest the next edit is between <|editable_region_start|> and <|editable_region_end|>. Please predict the next edit between these tags and write the code that will fit within that region after the edits are applied.

簡素な内容ですが、この内容で正常に動作するようトレーニングを行っています。 ここからシステムプロンプトを変更すると、正常に編集予測を出力できない可能性があります。

ユーザーメッセージを、次のような形式で送信します。

### User Edits:
直近の編集1~数回による変更をmarkdownのdiffで記述

### Currently User Code:
<|editable_region_start|>
次の編集を予測させたい範囲のコードをここに記述
<|editable_region_end|>

モデルからの出力は以下のような構造となります。

<think>

</think>

<|editable_region_start|>
予測した次の編集が適用されたコード
<|editable_region_end|>

モデルは、入力でeditable_regionマーカーで囲まれた範囲のコードから、次に編集がなされるであろう箇所を予測し、その部分だけを変更して出力します。 このマーカー内のコードは、特定のファイル全体でも、一部でも動作します。 editable_regionマーカーは、大きければ大きいほど正確な編集を適用できますが、コンテキストの増加によってモデルの推論速度は低下します。 モデルの推論速度と相談しながら、モデルに提供するコードの範囲を決定してください。

ユーザーロールでの入力と、モデルの出力の例を示します。

### User Edits:
```diff
@@ -215,6 +215,31 @@
         // StartCoroutine(RespawnRoutine());
     }
 
+    // --------------------------------------------------------------
+    // 未完成メソッド(ここで編集中)
+    // --------------------------------------------------------------
+
+    /// <summary>
+    /// プレイヤーが特定のアイテムを取得したときの処理。
+    /// 現在、アイテムタイプに応じた効果を実装中。
+    /// </summary>
+    /// <param name="item">取得したアイテムの情報</param>
+    private void OnItemPickup(ItemData item)
+    {
+        // TODO: アイテムタイプごとの分岐処理を実装
+        // switch (item.type)
+        // {
+        //     case ItemType.HealthPotion:
+        //         Heal(item.value);
+        //         break;
+        //     case ItemType.SpeedBoost:
+        //         // Speed boost logic
+        //         break;
+        //     // さらに他のタイプ...
+        // }
+
+        // 現在、アイテム取得のログだけ出力
+        Debug.Log($"Picked up item: {item.name} (ID: {item.id})");
+    }

Currently User Code:

<|editable_region_start|> private void Die() { // 死亡アニメーション再生 animator.SetTrigger("Die");

    // 死亡イベント呼び出し
    onDeath?.Invoke();

    // コントローラ無効化
    this.enabled = false;

    // TODO: リスポーン処理の実装
    // StartCoroutine(RespawnRoutine());
}

// --------------------------------------------------------------
// コルーチン例(現在作成中)
// --------------------------------------------------------------

private IEnumerator RespawnRoutine()
{
    // リスポーンまでの待機時間
    float waitTime = 3f;
    // TODO: リスポーンエフェクトを再生
    // PlayRespawnEffect();

    yield return new WaitForSeconds(waitTime);

    // プレイヤー位置をリスポーン地点にリセット
    Transform spawnPoint = FindObjectOfType<SpawnManager>()?.GetSpawnPoint() ?? transform;
    transform.position = spawnPoint.position;
    transform.rotation = spawnPoint.rotation;

    // ステータスリセット
    currentHealth = maxHealth;
    UpdateHealthUI();

    // 再度コントローラ有効化
    this.enabled = true;

    // アニメーションリセット
    animator.ResetTrigger("Die");
    animator.SetTrigger("Idle");
}

// --------------------------------------------------------------
// デバッグコマンド(エディタ上でのテスト用)
// --------------------------------------------------------------

#if UNITY_EDITOR private void OnValidate() { // 変数が不正な場合はデフォルトにフォールバック if (moveSpeed < 0) moveSpeed = 5f; if (jumpForce < 0) jumpForce = 7f; if (maxHealth <= 0) maxHealth = 100; }

[ContextMenu("Heal Full")]
private void DebugHealFull()
{
    Heal(maxHealth);
}

[ContextMenu("Take 10 Damage")]
private void DebugTakeDamage()
{
    TakeDamage(10);
}

#endif

// --------------------------------------------------------------
// 未完成メソッド(ここで編集中) <|user_cursor_is_here|>
// --------------------------------------------------------------

/// <summary>
/// プレイヤーが特定のアイテムを取得したときの処理。
/// 現在、アイテムタイプに応じた効果を実装中。
/// </summary>
/// <param name="item">取得したアイテムの情報</param>
private void OnItemPickup(ItemData item)
{
    // TODO: アイテムタイプごとの分岐処理を実装
    // switch (item.type)
    // {
    //     case ItemType.HealthPotion:
    //         Heal(item.value);
    //         break;
    //     case ItemType.SpeedBoost:
    //         // Speed boost logic
    //         break;
    //     // さらに他のタイプ...
    // }

    // 現在、アイテム取得のログだけ出力
    Debug.Log($"Picked up item: {item.name} (ID: {item.id})");

<|editable_region_end|>


```assistant_role
<tool_call>

<tool_call>

<|editable_region_start|>
    private void Die()
    {
        // 死亡アニメーション再生
        animator.SetTrigger("Die");

        // 死亡イベント呼び出し
        onDeath?.Invoke();

        // コントローラ無効化
        this.enabled = false;

        // TODO: リスポーン処理の実装
        // StartCoroutine(RespawnRoutine());
    }

    // --------------------------------------------------------------
    // コルーチン例(現在作成中)
    // --------------------------------------------------------------

    private IEnumerator RespawnRoutine()
    {
        // リスポーンまでの待機時間
        float waitTime = 3f;
        // TODO: リスポーンエフェクトを再生
        // PlayRespawnEffect();

        yield return new WaitForSeconds(waitTime);

        // プレイヤー位置をリスポーン地点にリセット
        Transform spawnPoint = FindObjectOfType<SpawnManager>()?.GetSpawnPoint() ?? transform;
        transform.position = spawnPoint.position;
        transform.rotation = spawnPoint.rotation;

        // ステータスリセット
        currentHealth = maxHealth;
        UpdateHealthUI();

        // 再度コントローラ有効化
        this.enabled = true;

        // アニメーションリセット
        animator.ResetTrigger("Die");
        animator.SetTrigger("Idle");
    }

    // --------------------------------------------------------------
    // デバッグコマンド(エディタ上でのテスト用)
    // --------------------------------------------------------------

#if UNITY_EDITOR
    private void OnValidate()
    {
        // 変数が不正な場合はデフォルトにフォールバック
        if (moveSpeed < 0) moveSpeed = 5f;
        if (jumpForce < 0) jumpForce = 7f;
        if (maxHealth <= 0) maxHealth = 100;
    }

    [ContextMenu("Heal Full")]
    private void DebugHealFull()
    {
        Heal(maxHealth);
    }

    [ContextMenu("Take 10 Damage")]
    private void DebugTakeDamage()
    {
        TakeDamage(10);
    }
#endif

    // --------------------------------------------------------------
    // 未完成メソッド(ここで編集中)
    // --------------------------------------------------------------

    /// <summary>
    /// プレイヤーが特定のアイテムを取得したときの処理。
    /// 現在、アイテムタイプに応じた効果を実装中。
    /// </summary>
    /// <param name="item">取得したアイテムの情報</param>
    private void OnItemPickup(ItemData item)
    {
        // TODO: アイテムタイプごとの分岐処理を実装
        switch (item.type)
        {
            case ItemType.HealthPotion:
                Heal(item.value);
                break;
            case ItemType.SpeedBoost:
                // Speed boost logic
                break;
            // さらに他のタイプ...
        }

        // 現在、アイテム取得のログだけ出力
        Debug.Log($"Picked up item: {item.name} (ID: {item.id})");
<|editable_region_end|>
Downloads last month
4
Safetensors
Model size
4B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support