Files
fission-console/LLM/llm_prompt_round4.py

74 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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")