import json import os import re import requests # Основные настройки OLLAMA_URL = "http://localhost:11434/api/generate" MODEL_NAME = "qwen3:30b-a3b" GIGA_URL = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions" GIGA_ODEL_NAME = "GigaChat-2-Max" pattern = re.compile(r".*?<\/think>", flags=re.DOTALL | re.IGNORECASE) def analyze_cat_breed(file_path): """Генерирует описание породы кошки с помощью Ollama""" if not os.path.exists(file_path): return None with open(file_path, encoding="utf-8") as file: text = file.read() prompt = f""" Проанализируй текст ниже и определи ТОЛЬКО указанные признаки породы кошки. Если признак не упомянут - дополни на основе своих знаний. Признаки для анализа (булевые значения, если не указано иное): - people_friendly (дружелюбность к людям) - child_friendly (подходит для семей с детьми) - animal_friendly (ладит с другими питомцами) - active (высокая активность/игривость) - vocal (склонность к мяуканью/разговорчивость) - smart (интеллект и обучаемость) - long_hair (длинношерстная порода) - hypoallergenic (низкий уровень аллергенов) - colors (массив возможных окрасов на английском языке) - need_attention (требует много внимания) - independent (способность проводить время в одиночестве) - indoor_only (рекомендуется только домашнее содержание) - shed (сильно линяет) Требования: 1. Анализируй текст и дополняй недостающее из своих знаний. 2. Строго соблюдай типы данных: boolean для всех параметров, кроме colors (массив строк). 3. Верни ответ ТОЛЬКО в виде валидного JSON без форматирования (markdown) и лишних слов. Текст для анализа: {text} """ response = requests.post(GIGA_URL, headers={ 'Content-Type': 'application/json', 'Accept': 'application/json', "Authorization": "Bearer "}, data=json.dumps({ "model": GIGA_ODEL_NAME, "messages":[{ "role": "user", "content": prompt, }], "temperature": 0, "top_p": 0, "stream": False, "max_tokens": 3000, "repetition_penalty": 1, "update_interval": 0 }), verify=False ) if response.status_code == 200: return response.json().get("choices")[0].get("message").get("content") #return response.json().get("response", "Не удалось получить описание") else: return None # try: # response = requests.post(OLLAMA_URL, json={"model": MODEL_NAME, "prompt": prompt, "stream": False}) # if response.status_code == 200: # return response.json().get("response", "{}") # return None # except Exception as e: # print(f"Ошибка соединения: {e}") # return None def save_description(breed, description): """Сохраняет описание в файл""" os.makedirs("cat_breed_signs", exist_ok=True) filename = f"cat_breed_signs/{breed}.txt" # Очистка от тегов рассуждения и лишних символов clean_desc = pattern.sub("", description).strip() # Убираем markdown-обертки ```json ... ``` если они есть clean_desc = clean_desc.replace("```json", "").replace("```", "").strip() with open(filename, "w", encoding="utf-8") as f: f.write(clean_desc) print(f"Сохранено: {filename}") def main(): # Предполагаем, что файл меток теперь для кошек labels_path = "../../labels_cats.json" if not os.path.exists(labels_path): print(f"Файл {labels_path} не найден!") return with open(labels_path, encoding="utf-8") as f: breeds = json.load(f) for key in breeds: name = breeds[key].replace("_", " ") file_key = breeds[key] print(f"Генерация признаков для кошки: {name}...") if os.path.isfile(f"cat_breed_signs/{file_key}.txt"): print(f"Описание уже существует: {file_key}.") continue # Путь к исходному описанию породы source_file = f"cat_descriptions/{file_key}.txt" description = analyze_cat_breed(source_file) if description: save_description(file_key, description) else: print(f"Не удалось обработать {name}") if __name__ == "__main__": main()