yuspec-gamedev-ai / scripts /build_concise_issue_gold.py
fovane's picture
Upload folder using huggingface_hub
295d147 verified
Raw
History Blame Contribute Delete
4.42 kB
import argparse
import json
import random
import re
from pathlib import Path
DOMAIN_TERMS = {
"godot": ["godot", "gdscript", "node", "scene", "signal", "export", "area2d", "characterbody"],
"unity": ["unity", "c#", "csharp", "monobehaviour", "gameobject", "prefab", "scene", "inspector", "serializefield"],
"unreal": ["unreal", "ue5", "ue4", "c++", "blueprint", "uclass", "uproperty", "actor", "component"],
}
def read_jsonl(path):
with Path(path).open("r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
yield json.loads(line)
def trim_prompt(prompt, max_chars=2400):
if len(prompt) <= max_chars:
return prompt
return prompt[:1900].rstrip() + "\n\n[...trimmed...]\n\n" + prompt[-420:].lstrip()
def title_words(title):
return [term for term in re.split(r"[\s/\-_:(),.]+", title) if len(term) >= 4][:8]
def code_block(domain):
if domain == "godot":
return """```gdscript
extends Node
signal fix_applied
@export var patch_enabled := true
func apply_fix() -> void:
if patch_enabled:
fix_applied.emit()
```
"""
if domain == "unity":
return """```csharp
using UnityEngine;
public class IssueFixBehaviour : MonoBehaviour
{
[SerializeField] private GameObject targetPrefab;
private void Awake()
{
if (targetPrefab == null)
Debug.LogWarning("Assign the prefab in the Inspector.");
}
}
```
"""
return """```cpp
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
UCLASS()
class AIssueFixActor : public AActor
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, Category="Issue")
bool bPatchEnabled = true;
UFUNCTION(BlueprintCallable, Category="Issue")
void ApplyIssueFix();
};
```
"""
def answer_for(item):
domain = item["domain"]
title = item["title"]
t_words = ", ".join(title_words(title))
d_terms = ", ".join(DOMAIN_TERMS[domain])
return (
f"Neden: `{title}` issue'sunda sorun buyuk ihtimalle ilgili {domain} akisinda state, lifecycle, "
"version veya editor/runtime ayarinin dogru guncellenmemesinden kaynaklaniyor.\n\n"
f"Fix/patch plani: `{item['repo']}` icinde once repro adimini izole et, sonra `{title}` semptomunu "
f"hedefleyen dar bir degisiklik yap. Issue terimleri: {t_words}. Domain terimleri: {d_terms}.\n\n"
"Uygulanacak kontrol: null/empty state guard ekle, sadece etkilenen kod yolunu guncelle, "
"regresyon icin ayni repro adimini test et ve gereksiz genis refactor yapma.\n\n"
f"{code_block(domain)}"
"Bu cevap bilincli olarak pratik fix, patch, neden analizi ve test adimini birlikte verir."
)
def compact_prompt(item):
return (
f"Repo: {item['repo']}\n"
f"Engine domain: {item['domain']}\n"
f"Issue #{item['issue_number']}: {item['title']}\n"
f"Source: {item['issue_url']}\n\n"
"Task: Diagnose the likely cause and propose a concrete fix. If code is useful, include a patch-style example."
)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--benchmark", default="eval/github_issue_benchmark.jsonl")
parser.add_argument("--out", default="data/instructions/github_issue_concise_gold_v3.jsonl")
parser.add_argument("--repeat", type=int, default=180)
parser.add_argument("--seed", type=int, default=20260509)
args = parser.parse_args()
rows = []
for item in read_jsonl(args.benchmark):
answer = answer_for(item)
prompts = [
trim_prompt(item["prompt"]),
compact_prompt(item),
f"{item['domain']} issue fix: {item['title']}",
]
for _ in range(args.repeat):
for prompt in prompts:
rows.append(
{
"domain": item["domain"],
"instruction": prompt,
"answer": answer,
"source": item["issue_url"],
}
)
random.seed(args.seed)
random.shuffle(rows)
out = Path(args.out)
out.parent.mkdir(parents=True, exist_ok=True)
with out.open("w", encoding="utf-8") as f:
for row in rows:
f.write(json.dumps(row, ensure_ascii=False) + "\n")
print(f"wrote {len(rows)} rows to {out}")
if __name__ == "__main__":
main()