74 lines
3.8 KiB
Python
74 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
||
import json
|
||
import re
|
||
import urllib.error
|
||
import urllib.request
|
||
|
||
ASK_API = "https://fission.kube5s.ru/console/api/ai/ask"
|
||
CHECK_API = "https://fission.kube5s.ru/console/api/ai/check"
|
||
HEADERS = {"X-Test-Sub": "livetest@test.local", "Content-Type": "application/json"}
|
||
|
||
PROMPT = """Ты генерируешь код одной функции для Fission.
|
||
|
||
Правила ответа:
|
||
- Если ввод кривой, коротко нормализуй задачу.
|
||
- Если не хватает важного условия, задай один короткий вопрос или опиши допущение.
|
||
- Верни только нормализованную задачу, код и отдельный блок LLM что делает.
|
||
- Код должен быть синтаксически корректным и соответствовать runtime выбранного языка.
|
||
- Не добавляй лишний wrapper-код, лишние зависимости или выдуманные SDK.
|
||
- Раздел LLM что делает должен быть обычным текстом: без **, без markdown-кодблоков, без альтернативных заголовков.
|
||
|
||
Языковые правила:
|
||
- Node.js: CommonJS без ESM export-обвязки.
|
||
- Python: обычный entrypoint без лишних импортов.
|
||
- PHP: обычный PHP-код без выдуманных контрактов.
|
||
- Ruby: корректный def/end без лишних зависимостей.
|
||
"""
|
||
|
||
CASES = [
|
||
("nodejs", "Юзер сказал криво: приветствие, default name, не падать на пустом входе. Сделай Fission Node.js handler, который берёт name из JSON и отвечает 200 с greeting."),
|
||
("python", "Юзер просит обработать кривой input. Сделай Fission Python handler: если в context есть name, вернуть greeting, иначе default greeting."),
|
||
("php", "Юзер хочет JSON и приветствие. Сделай PHP-обработчик Fission: name из context, иначе default, ответ 200 и JSON body."),
|
||
("ruby", "Юзер хочет функцию, которая приветствует человека и не падает если name нет. Сделай Ruby handler для Fission с JSON greeting и default name."),
|
||
]
|
||
|
||
|
||
def post(url: str, payload: dict) -> dict:
|
||
body = json.dumps(payload).encode()
|
||
req = urllib.request.Request(url, data=body, headers=HEADERS)
|
||
try:
|
||
with urllib.request.urlopen(req, timeout=90) as resp:
|
||
return json.loads(resp.read())
|
||
except urllib.error.HTTPError as exc:
|
||
return {"http_error": exc.code, "body": exc.read().decode(errors="replace")}
|
||
|
||
|
||
def extract_code(answer: str) -> str:
|
||
match = re.search(r"```(?:[a-zA-Z0-9_+-]+)?\n(.*?)\n```", answer, re.S)
|
||
return match.group(1).strip() if match else ""
|
||
|
||
|
||
for lang, question in CASES:
|
||
ask_resp = post(ASK_API, {"question": PROMPT + "\n\nЗадача:\n" + question})
|
||
print(f"=== {lang} ===")
|
||
if ask_resp.get("http_error"):
|
||
print(f"HTTP {ask_resp['http_error']}")
|
||
print(ask_resp.get("body", ""))
|
||
print("\n" + "=" * 72 + "\n")
|
||
continue
|
||
|
||
answer = ask_resp.get("answer", ask_resp.get("error", "???"))
|
||
code = extract_code(answer)
|
||
lint_resp = post(CHECK_API, {"language": lang, "code": code}) if code else {"ok": False, "result": "no code extracted"}
|
||
|
||
print("QUESTION:")
|
||
print(question)
|
||
print("\nHAS EXACT HEADING:", bool(re.search(r"(^|\n)LLM что делает\s*$", answer, re.M)))
|
||
print("ANSWER:")
|
||
print(answer)
|
||
print("\nEXTRACTED CODE:")
|
||
print(code)
|
||
print("\nLINT:")
|
||
print(json.dumps(lint_resp, ensure_ascii=False, indent=2)[:2000])
|
||
print("\n" + "=" * 72 + "\n")
|