Проект аудита отелей: основные скрипты и документация
- Краулеры: smart_crawler.py, regional_crawler.py - Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py - РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py - Отчёты: create_orel_horizontal_report.py - Обработка: process_all_hotels_embeddings.py - Документация: README.md, DB_SCHEMA_REFERENCE.md
This commit is contained in:
244
add_model.py
Normal file
244
add_model.py
Normal file
@@ -0,0 +1,244 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для добавления новых LLM моделей
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
from typing import Dict, List
|
||||
|
||||
# Конфигурация
|
||||
API_BASE = "http://localhost:8888"
|
||||
|
||||
def add_model_to_config(model_name: str, model_id: str, description: str = ""):
|
||||
"""
|
||||
Добавить модель в конфигурацию llm_config.py
|
||||
|
||||
Args:
|
||||
model_name: Человекочитаемое имя (например, 'fast', 'smart')
|
||||
model_id: ID модели в API (например, 'gpt-4o-mini')
|
||||
description: Описание модели
|
||||
"""
|
||||
|
||||
config_file = "/root/engine/public_oversight/hotels/llm_config.py"
|
||||
|
||||
# Читаем текущий конфиг
|
||||
with open(config_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Находим секцию models и добавляем новую модель
|
||||
if "'models': {" in content:
|
||||
# Ищем место для вставки
|
||||
models_start = content.find("'models': {")
|
||||
models_end = content.find("},", models_start) + 2
|
||||
|
||||
# Формируем новую строку
|
||||
new_model_line = f" '{model_name}': '{model_id}', # {description}\n"
|
||||
|
||||
# Вставляем перед закрывающей скобкой
|
||||
new_content = content[:models_end-2] + new_model_line + content[models_end-2:]
|
||||
|
||||
# Записываем обратно
|
||||
with open(config_file, 'w', encoding='utf-8') as f:
|
||||
f.write(new_content)
|
||||
|
||||
print(f"✅ Модель '{model_name}' добавлена в конфиг")
|
||||
return True
|
||||
else:
|
||||
print("❌ Не найдена секция models в конфиге")
|
||||
return False
|
||||
|
||||
|
||||
def test_model(model_id: str) -> Dict:
|
||||
"""
|
||||
Протестировать модель
|
||||
|
||||
Args:
|
||||
model_id: ID модели для тестирования
|
||||
|
||||
Returns:
|
||||
Результат теста
|
||||
"""
|
||||
|
||||
# Переключаемся на модель
|
||||
switch_response = requests.post(
|
||||
f"{API_BASE}/api/llm/switch",
|
||||
json={"model": model_id}
|
||||
)
|
||||
|
||||
if switch_response.status_code != 200:
|
||||
return {"error": f"Ошибка переключения: {switch_response.status_code}"}
|
||||
|
||||
# Тестируем модель
|
||||
test_prompt = "Сколько отелей в Чукотском автономном округе?"
|
||||
|
||||
start_time = requests.utils.time.time()
|
||||
chat_response = requests.post(
|
||||
f"{API_BASE}/api/chat",
|
||||
json={"message": test_prompt}
|
||||
)
|
||||
end_time = requests.utils.time.time()
|
||||
|
||||
if chat_response.status_code == 200:
|
||||
data = chat_response.json()
|
||||
return {
|
||||
"model": model_id,
|
||||
"response_time": round((end_time - start_time) * 1000, 2),
|
||||
"response_length": len(data['response']),
|
||||
"response_preview": data['response'][:200] + "...",
|
||||
"success": True
|
||||
}
|
||||
else:
|
||||
return {"error": f"Ошибка чата: {chat_response.status_code}"}
|
||||
|
||||
|
||||
def list_available_models() -> List[str]:
|
||||
"""Получить список доступных моделей"""
|
||||
|
||||
response = requests.get(f"{API_BASE}/api/llm/models")
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return list(data['models'].values())
|
||||
else:
|
||||
return []
|
||||
|
||||
|
||||
def add_custom_model():
|
||||
"""Интерактивное добавление модели"""
|
||||
|
||||
print("=" * 60)
|
||||
print("🤖 ДОБАВЛЕНИЕ НОВОЙ LLM МОДЕЛИ")
|
||||
print("=" * 60)
|
||||
|
||||
# Получаем информацию о модели
|
||||
model_name = input("Введите имя модели (например, 'custom'): ").strip()
|
||||
model_id = input("Введите ID модели (например, 'gpt-4o-mini'): ").strip()
|
||||
description = input("Введите описание (опционально): ").strip()
|
||||
|
||||
if not model_name or not model_id:
|
||||
print("❌ Имя и ID модели обязательны!")
|
||||
return
|
||||
|
||||
print(f"\n📋 Добавляем модель:")
|
||||
print(f" Имя: {model_name}")
|
||||
print(f" ID: {model_id}")
|
||||
print(f" Описание: {description}")
|
||||
|
||||
confirm = input("\nПродолжить? (y/N): ").strip().lower()
|
||||
if confirm != 'y':
|
||||
print("❌ Отменено")
|
||||
return
|
||||
|
||||
# Добавляем в конфиг
|
||||
if add_model_to_config(model_name, model_id, description):
|
||||
print(f"\n🧪 Тестируем модель {model_id}...")
|
||||
|
||||
# Тестируем
|
||||
result = test_model(model_id)
|
||||
|
||||
if result.get('success'):
|
||||
print(f"✅ Модель работает!")
|
||||
print(f" Время ответа: {result['response_time']}ms")
|
||||
print(f" Длина ответа: {result['response_length']} символов")
|
||||
print(f" Превью: {result['response_preview']}")
|
||||
else:
|
||||
print(f"❌ Ошибка тестирования: {result.get('error')}")
|
||||
|
||||
print(f"\n🔄 Перезапустите веб-интерфейс для применения изменений:")
|
||||
print(f" pkill -f web_interface.py")
|
||||
print(f" cd /root/engine/public_oversight/hotels")
|
||||
print(f" source venv/bin/activate")
|
||||
print(f" python web_interface.py &")
|
||||
|
||||
|
||||
def quick_add_popular_models():
|
||||
"""Быстрое добавление популярных моделей"""
|
||||
|
||||
popular_models = [
|
||||
("gpt35", "gpt-3.5-turbo", "GPT-3.5 Turbo (классика)"),
|
||||
("gpt4v", "gpt-4-vision-preview", "GPT-4 Vision (анализ изображений)"),
|
||||
("claude", "claude-3-haiku", "Claude 3 Haiku (через OpenRouter)"),
|
||||
("gemini", "gemini-pro", "Gemini Pro (через OpenRouter)"),
|
||||
]
|
||||
|
||||
print("🚀 Быстрое добавление популярных моделей:")
|
||||
|
||||
for i, (name, model_id, desc) in enumerate(popular_models, 1):
|
||||
print(f"{i}. {desc}")
|
||||
|
||||
choice = input("\nВыберите номер модели (1-4) или 0 для выхода: ").strip()
|
||||
|
||||
try:
|
||||
choice_idx = int(choice) - 1
|
||||
if 0 <= choice_idx < len(popular_models):
|
||||
name, model_id, desc = popular_models[choice_idx]
|
||||
add_model_to_config(name, model_id, desc)
|
||||
print(f"✅ Модель {desc} добавлена!")
|
||||
else:
|
||||
print("❌ Неверный выбор")
|
||||
except ValueError:
|
||||
print("❌ Введите число")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
command = sys.argv[1]
|
||||
|
||||
if command == "list":
|
||||
print("📋 Доступные модели:")
|
||||
models = list_available_models()
|
||||
for model in models:
|
||||
print(f" - {model}")
|
||||
|
||||
elif command == "test":
|
||||
if len(sys.argv) > 2:
|
||||
model_id = sys.argv[2]
|
||||
print(f"🧪 Тестируем модель: {model_id}")
|
||||
result = test_model(model_id)
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
print("❌ Укажите ID модели для тестирования")
|
||||
|
||||
elif command == "add":
|
||||
if len(sys.argv) > 3:
|
||||
name, model_id = sys.argv[2], sys.argv[3]
|
||||
description = sys.argv[4] if len(sys.argv) > 4 else ""
|
||||
add_model_to_config(name, model_id, description)
|
||||
else:
|
||||
print("❌ Использование: python add_model.py add <name> <model_id> [description]")
|
||||
|
||||
else:
|
||||
print("❌ Неизвестная команда")
|
||||
|
||||
else:
|
||||
# Интерактивный режим
|
||||
print("🤖 УПРАВЛЕНИЕ LLM МОДЕЛЯМИ")
|
||||
print("1. Добавить модель вручную")
|
||||
print("2. Быстрое добавление популярных моделей")
|
||||
print("3. Список доступных моделей")
|
||||
print("4. Тест модели")
|
||||
|
||||
choice = input("\nВыберите действие (1-4): ").strip()
|
||||
|
||||
if choice == "1":
|
||||
add_custom_model()
|
||||
elif choice == "2":
|
||||
quick_add_popular_models()
|
||||
elif choice == "3":
|
||||
models = list_available_models()
|
||||
print("📋 Доступные модели:")
|
||||
for model in models:
|
||||
print(f" - {model}")
|
||||
elif choice == "4":
|
||||
model_id = input("Введите ID модели для тестирования: ").strip()
|
||||
if model_id:
|
||||
result = test_model(model_id)
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
print("❌ Неверный выбор")
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user