Methode - trace brute assainie
Script d'orchestration initiale
Contenu conserve tel que produit. Seules les eventuelles adresses et chemins internes sont neutralises pour la publication.
#!/usr/bin/env python3
import json
import subprocess
import time
from pathlib import Path
ROOT = Path(__file__).resolve().parent
PROMPTS = ROOT / "prompts"
OUTPUTS = ROOT / "productions"
PROOFS = ROOT / "preuves"
OUTPUTS.mkdir(exist_ok=True)
PROOFS.mkdir(exist_ok=True)
steps = [
("qwen2.5:7b", "01-qwen-legere.txt", "01-qwen-legere.md", {}),
("qwen2.5-coder:14b", "02-qwen-codeuse.txt", "02-qwen-codeuse.md", {"{{CADRAGE}}": "01-qwen-legere.md"}),
("gemma3:12b", "03-gemma-conversationnelle.txt", "03-gemma-conversationnelle.md", {"{{CADRAGE}}": "01-qwen-legere.md", "{{TECHNIQUE}}": "02-qwen-codeuse.md"}),
("qwen3:14b", "04-qwen-reviseuse.txt", "04-qwen-reviseuse.md", {"{{CADRAGE}}": "01-qwen-legere.md", "{{TECHNIQUE}}": "02-qwen-codeuse.md", "{{RESTITUTION}}": "03-gemma-conversationnelle.md"}),
("phi4:14b", "05-phi-synthetiseuse.txt", "05-phi-synthetiseuse.md", {"{{CADRAGE}}": "01-qwen-legere.md", "{{TECHNIQUE}}": "02-qwen-codeuse.md", "{{RESTITUTION}}": "03-gemma-conversationnelle.md", "{{REVUE}}": "04-qwen-reviseuse.md"}),
]
records = []
for model, prompt_name, output_name, replacements in steps:
prompt = (PROMPTS / prompt_name).read_text(encoding="utf-8")
for marker, source in replacements.items():
prompt = prompt.replace(marker, (OUTPUTS / source).read_text(encoding="utf-8"))
(PROOFS / f"resolved-{prompt_name}").write_text(prompt, encoding="utf-8")
started = time.time()
proc = subprocess.run(["ollama", "run", model], input=prompt, text=True, capture_output=True)
elapsed = round(time.time() - started, 3)
if proc.returncode != 0:
raise SystemExit(f"{model} a échoué: {proc.stderr}")
(OUTPUTS / output_name).write_text(proc.stdout.strip() + "\n", encoding="utf-8")
records.append({"model": model, "role_prompt": prompt_name, "output": output_name, "seconds": elapsed, "chars": len(proc.stdout)})
dossier = []
for record in records:
dossier.append(f"\n===== {record['model']} — {record['output']} =====\n")
dossier.append((OUTPUTS / record["output"]).read_text(encoding="utf-8"))
judge_template = (PROMPTS / "06-gpt-oss-juge.txt").read_text(encoding="utf-8")
judge_prompt = judge_template.replace("{{DOSSIER}}", "".join(dossier))
(PROOFS / "resolved-06-gpt-oss-juge.txt").write_text(judge_prompt, encoding="utf-8")
started = time.time()
proc = subprocess.run(["ollama", "run", "gpt-oss:20b"], input=judge_prompt, text=True, capture_output=True)
elapsed = round(time.time() - started, 3)
if proc.returncode != 0:
raise SystemExit(f"gpt-oss:20b a échoué: {proc.stderr}")
(OUTPUTS / "06-gpt-oss-juge.md").write_text(proc.stdout.strip() + "\n", encoding="utf-8")
records.append({"model": "gpt-oss:20b", "role_prompt": "06-gpt-oss-juge.txt", "output": "06-gpt-oss-juge.md", "seconds": elapsed, "chars": len(proc.stdout)})
(PROOFS / "execution.json").write_text(json.dumps(records, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(json.dumps(records, ensure_ascii=False, indent=2))