Organize LLM assets and function lifecycle fixes

This commit is contained in:
Naeel
2026-04-28 13:04:08 +03:00
parent 82eba079f6
commit a534fddd2c
22 changed files with 1409 additions and 72 deletions
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env python3
import json
import re
import urllib.request
import urllib.error
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.
Языковые правила:
- Node.js: CommonJS без ESM export-обвязки.
- Python: обычный entrypoint без лишних импортов.
- PHP: обычный PHP-код без выдуманных контрактов.
- Ruby: корректный def/end без лишних зависимостей.
"""
CASES = [
{
"lang": "nodejs",
"question": "Сделай Fission Node.js функцию: вернуть 200 с приветствием по полю name или по умолчанию. Потом дай код и блок LLM что делает.",
},
{
"lang": "python",
"question": "Юзер сказал только 'сделай функцию, которая возвращает приветствие'. Сделай безопасный вариант для Fission на Python: взять context['name'], если он есть, иначе вернуть приветствие по умолчанию. Сначала нормализуй задачу, потом код, потом блок LLM что делает.",
},
{
"lang": "php",
"question": "Юзер просит Fission-функцию на PHP, но не знает, какой контракт у runtime. Сделай обычный PHP-обработчик: если в context есть name, вернуть JSON 200 с greeting, иначе использовать значение по умолчанию. Не выдумывай фреймворки. Потом код и блок LLM что делает.",
},
{
"lang": "ruby",
"question": "Юзер написал криво: 'нужна функция чтобы приветить человека и не упасть если данных нет'. Сделай Fission-функцию на Ruby: принять context, безопасно достать name, вернуть greeting JSON. Потом код и блок LLM что делает.",
},
]
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 ""
def explanation_tail(answer: str) -> str:
pieces = answer.split("```", 2)
if len(pieces) >= 3:
return pieces[2].strip()
return ""
for case in CASES:
ask_resp = post(ASK_API, {"question": PROMPT + "\n\nЗадача:\n" + case["question"]})
if ask_resp.get("http_error"):
print(f"=== {case['lang']} 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)
explanation = explanation_tail(answer)
check_resp = post(CHECK_API, {"language": case["lang"], "code": code}) if code else {"ok": False, "result": "no code extracted"}
print(f"=== {case['lang']} ===")
print("QUESTION:")
print(case["question"])
print("\nANSWER:")
print(answer)
print("\nEXTRACTED CODE:")
print(code)
print("\nHAS LLM heading:", "LLM что делает" in answer)
print("HAS explanation tail:", bool(explanation))
if explanation:
print(explanation[:800])
print("\nLINT:")
print(json.dumps(check_resp, ensure_ascii=False, indent=2)[:2000])
print("\n" + "=" * 72 + "\n")