73 lines
3.9 KiB
Python
73 lines
3.9 KiB
Python
#!/usr/bin/env python3
|
||
import json
|
||
import re
|
||
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"}
|
||
|
||
CASES = [
|
||
{
|
||
"lang": "nodejs",
|
||
"question": "Сгенерируй только код Fission-функции на Node.js. Задача: принять JSON с полем name и вернуть ответ 200 с приветствием. Код должен быть синтаксически корректным. После кода отдельным блоком кратко объясни, что делает код.",
|
||
},
|
||
{
|
||
"lang": "python",
|
||
"question": "Сгенерируй только код Fission-функции на Python. Задача: принять словарь context, взять context['name'] если он есть и вернуть строку приветствия. Код должен быть синтаксически корректным. После кода отдельным блоком кратко объясни, что делает код.",
|
||
},
|
||
{
|
||
"lang": "php",
|
||
"question": "Сгенерируй только код Fission-функции на PHP. Задача: вернуть JSON-ответ 200 с приветствием, если имя есть в context. Код должен быть синтаксически корректным. После кода отдельным блоком кратко объясни, что делает код.",
|
||
},
|
||
{
|
||
"lang": "ruby",
|
||
"question": "Сгенерируй только код Fission-функции на Ruby. Задача: принять context и вернуть greeting JSON с именем из context, если оно есть. Код должен быть синтаксически корректным. После кода отдельным блоком кратко объясни, что делает код.",
|
||
},
|
||
{
|
||
"lang": "go",
|
||
"question": "Сгенерируй только код Fission-функции на Go. Задача: принять запрос и вернуть 200 с приветствием, если имя передано, иначе использовать значение по умолчанию. Код должен быть синтаксически корректным. После кода отдельным блоком кратко объясни, что делает код.",
|
||
},
|
||
]
|
||
|
||
|
||
def post(url: str, payload: dict) -> dict:
|
||
body = json.dumps(payload).encode()
|
||
req = urllib.request.Request(url, data=body, headers=HEADERS)
|
||
with urllib.request.urlopen(req, timeout=90) as resp:
|
||
return json.loads(resp.read())
|
||
|
||
|
||
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 explain_block(answer: str) -> str:
|
||
parts = re.split(r"```\s*$", answer, maxsplit=1)
|
||
if len(parts) > 1:
|
||
return parts[1].strip()
|
||
return ""
|
||
|
||
|
||
for case in CASES:
|
||
ask_resp = post(ASK_API, {"question": case["question"]})
|
||
answer = ask_resp.get("answer", ask_resp.get("error", "???"))
|
||
code = extract_code(answer)
|
||
explanation = explain_block(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("PROMPT:")
|
||
print(case["question"])
|
||
print("\nANSWER:")
|
||
print(answer)
|
||
print("\nEXTRACTED CODE:")
|
||
print(code)
|
||
print("\nEXPLANATION FOUND:", bool(explanation))
|
||
if explanation:
|
||
print(explanation)
|
||
print("\nLINT:")
|
||
print(json.dumps(check_resp, ensure_ascii=False, indent=2)[:2000])
|
||
print("\n" + "=" * 72 + "\n")
|