add tests
This commit is contained in:
commit
e01a51e2ae
17 changed files with 823 additions and 0 deletions
108
ege-checker.py
Normal file
108
ege-checker.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
import os
|
||||
import base64
|
||||
import time
|
||||
from dotenv import load_dotenv
|
||||
from openai import OpenAI
|
||||
import httpx
|
||||
|
||||
load_dotenv()
|
||||
|
||||
# Наш финальный список "выживших"
|
||||
MODELS_TO_TEST = [
|
||||
"openai/claude-opus-4-6",
|
||||
"openai/gpt-4o",
|
||||
"openai/gpt-5-pro"
|
||||
]
|
||||
|
||||
client = OpenAI(
|
||||
api_key=os.getenv("LAOZHANG_API_KEY"),
|
||||
base_url=os.getenv("LAOZHANG_BASE_URL"),
|
||||
http_client=httpx.Client(timeout=httpx.Timeout(600.0, connect=30.0))
|
||||
)
|
||||
|
||||
|
||||
def encode_image(image_path):
|
||||
with open(image_path, "rb") as img:
|
||||
return base64.b64encode(img.read()).decode('utf-8')
|
||||
|
||||
|
||||
def get_instructions(criteria_file):
|
||||
with open("SKILL.md", "r", encoding="utf-8") as f:
|
||||
skill = f.read()
|
||||
c_path = os.path.join("references", criteria_file)
|
||||
with open(c_path, "r", encoding="utf-8") as f:
|
||||
criteria = f.read()
|
||||
return f"{skill}\n\n{criteria}"
|
||||
|
||||
|
||||
def run_mass_check(base_dir="photo", criteria_file="russian-essay-criteria.md"):
|
||||
# 1. Находим все папки учеников
|
||||
students = [d for d in os.listdir(
|
||||
base_dir) if os.path.isdir(os.path.join(base_dir, d))]
|
||||
if not students:
|
||||
print("[!] В папке photo пусто. Создай там папки с именами учеников.")
|
||||
return
|
||||
|
||||
print(f"=== ЗАПУСК МАССОВОЙ ПРОВЕРКИ: {len(students)} учеников ===")
|
||||
instructions = get_instructions(criteria_file)
|
||||
|
||||
for student in students:
|
||||
student_path = os.path.join(base_dir, student)
|
||||
photos = sorted([f for f in os.listdir(student_path)
|
||||
if f.lower().endswith(('.jpg', '.jpeg', '.png'))])
|
||||
|
||||
if not photos:
|
||||
print(f"[SKIP] У {student} нет фото.")
|
||||
continue
|
||||
|
||||
print(f"\n>>> РАБОТАЕМ С: {student.upper()} ({len(photos)} листа)")
|
||||
|
||||
# Подготовка контента ОДИН РАЗ для всех моделей (экономим время)
|
||||
message_content = [
|
||||
{"type": "text", "text": "Распознай рукописный текст и проверь сочинение строго по критериям ФИПИ."}]
|
||||
for p in photos:
|
||||
b64 = encode_image(os.path.join(student_path, p))
|
||||
message_content.append({
|
||||
"type": "image_url",
|
||||
"image_url": {"url": f"data:image/jpeg;base64,{b64}"}
|
||||
})
|
||||
|
||||
for model_id in MODELS_TO_TEST:
|
||||
safe_name = model_id.replace("/", "_")
|
||||
output_file = f"REPORT_{student}_{safe_name}.md"
|
||||
|
||||
# Проверка: если файл уже есть — пропускаем
|
||||
if os.path.exists(output_file):
|
||||
print(f" [-] {model_id}: Уже проверено.")
|
||||
continue
|
||||
|
||||
print(f" [!] Запуск {model_id}...")
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
response = client.chat.completions.create(
|
||||
model=model_id,
|
||||
messages=[
|
||||
{"role": "system", "content": instructions},
|
||||
{"role": "user", "content": message_content}
|
||||
],
|
||||
temperature=0.0
|
||||
)
|
||||
|
||||
res_text = response.choices[0].message.content
|
||||
duration = round(time.time() - start_time, 1)
|
||||
|
||||
with open(output_file, "w", encoding="utf-8") as f:
|
||||
header = f"--- \n**Ученик:** {student}\n**Модель:** {model_id}\n**Время:** {duration} сек.\n---\n\n"
|
||||
f.write(header + res_text)
|
||||
|
||||
print(f" [OK] Готово! ({duration} сек.)")
|
||||
time.sleep(12) # Безопасная пауза для лимитов
|
||||
|
||||
except Exception as e:
|
||||
print(f" [ERR] Ошибка у {model_id}: {str(e)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_mass_check()
|
||||
print("\n=== ВСЕ ПРОВЕРКИ ВЫПОЛНЕНЫ ===")
|
||||
Loading…
Add table
Add a link
Reference in a new issue