newton-micro / run.py
Kolyadual's picture
Upload folder using huggingface_hub
7bb6436 verified
#!/usr/bin/env python3
# Newton Mini — сверхлёгкий ИИ. Теперь умнее!
import json
import random
import re
import sys
from difflib import get_close_matches
def robust_input(prompt):
try:
return input(prompt).strip()
except UnicodeDecodeError:
pass
sys.stdout.flush()
print(prompt, end='', flush=True)
try:
raw = sys.stdin.buffer.readline()
if not raw:
return ""
raw = raw.rstrip(b'\r\n')
for encoding in ['utf-8', 'cp1251', 'koi8-r', 'iso8859-5']:
try:
return raw.decode(encoding).strip()
except UnicodeDecodeError:
continue
return raw.decode('utf-8', errors='replace').strip()
except Exception:
return ""
try:
with open("patterns.json", "r", encoding="utf-8") as f:
PATTERNS = json.load(f)
except FileNotFoundError:
print("❌ Ошибка: файл patterns.json не найден!")
print("Создайте его или скачайте с Hugging Face.")
sys.exit(1)
except json.JSONDecodeError:
print("❌ Ошибка: повреждён файл patterns.json")
sys.exit(1)
KEYWORDS = {
"привет": ["привет", "здравствуй", "хай", "прив", "здарова"],
"как дела": ["дела", "как ты", "ты как", "настроение"],
"имя": ["имя", "кто ты", "зовут", "тебя зовут"],
"школа": ["школа", "урок", "задача", "домашка", "математика", "геометрия"],
"пока": ["пока", "выход", "quit", "до свидания", "закончить", "стоп"],
"knowledge": ["что такое", "как приготовить", "что значит", "расскажи про", "как сделать"]
}
def preprocess(text):
return re.sub(r'[^а-яё\s]', ' ', text.lower()).strip()
def find_response(user_input):
clean = preprocess(user_input)
if not clean:
return random.choice(PATTERNS["default"])
if any(word in clean for word in ["пока", "выход", "quit", "стоп", "закончить", "exit"]):
return random.choice(PATTERNS["пока"])
knowledge = PATTERNS.get("knowledge", {})
if clean in knowledge:
return knowledge[clean]
if knowledge:
matches = get_close_matches(clean, knowledge.keys(), n=1, cutoff=0.6)
if matches:
return knowledge[matches[0]]
all_keywords = []
keyword_to_intent = {}
for intent, words in KEYWORDS.items():
if intent == "knowledge":
continue
for word in words:
all_keywords.append(word)
keyword_to_intent[word] = intent
for token in clean.split():
matches = get_close_matches(token, all_keywords, n=1, cutoff=0.6)
if matches:
intent = keyword_to_intent[matches[0]]
return random.choice(PATTERNS[intent])
return random.choice(PATTERNS["default"])
def main():
print("Newton Micro — сверхлёгкий ИИ")
print("Поддерживает: опечатки, рецепты, определения, выход по 'пока'")
while True:
try:
user_input = robust_input("Ты: ")
if not user_input:
continue
response = find_response(user_input)
print(f"Newton Micro: {response}\n")
if any(w in user_input.lower() for w in ["пока", "выход", "quit", "стоп"]):
break
except KeyboardInterrupt:
print("\nNewton Micro: Пока! Береги себя! ✨")
break
except EOFError:
print("\nNewton Micro: До свидания!")
break
if __name__ == "__main__":
main()