96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
"""Скрипт для экспорта диалогов."""
|
|
import argparse
|
|
import asyncio
|
|
import json
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from services.cache_service import CacheService
|
|
|
|
|
|
async def export_conversations(
|
|
redis_url: str,
|
|
output_file: str,
|
|
conversation_ids: list[str] = None,
|
|
):
|
|
"""Экспортировать диалоги из Redis."""
|
|
cache = CacheService(redis_url=redis_url)
|
|
|
|
try:
|
|
if conversation_ids:
|
|
# Экспортируем конкретные диалоги
|
|
conversations = {}
|
|
for conv_id in conversation_ids:
|
|
messages = await cache.get_context(conv_id, max_messages=1000)
|
|
if messages:
|
|
conversations[conv_id] = {
|
|
"id": conv_id,
|
|
"messages": messages,
|
|
"exported_at": datetime.now().isoformat(),
|
|
}
|
|
else:
|
|
# Экспортируем все диалоги (требует доступа к Redis keys)
|
|
print("Экспорт всех диалогов требует прямого доступа к Redis.")
|
|
print("Используйте --ids для экспорта конкретных диалогов.")
|
|
return
|
|
|
|
if not conversations:
|
|
print("Нет диалогов для экспорта")
|
|
return
|
|
|
|
# Сохраняем в файл
|
|
output_path = Path(output_file)
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
with open(output_file, "w", encoding="utf-8") as f:
|
|
json.dump(
|
|
{
|
|
"exported_at": datetime.now().isoformat(),
|
|
"conversations": conversations,
|
|
},
|
|
f,
|
|
ensure_ascii=False,
|
|
indent=2,
|
|
)
|
|
|
|
print(f"Экспортировано {len(conversations)} диалогов в {output_file}")
|
|
|
|
finally:
|
|
await cache.close()
|
|
|
|
|
|
async def main():
|
|
"""Главная функция."""
|
|
parser = argparse.ArgumentParser(description="Экспорт диалогов из Redis")
|
|
parser.add_argument(
|
|
"--redis-url",
|
|
type=str,
|
|
default="redis://localhost:6379/0",
|
|
help="URL Redis",
|
|
)
|
|
parser.add_argument(
|
|
"--output",
|
|
type=str,
|
|
default="conversations_export.json",
|
|
help="Файл для экспорта",
|
|
)
|
|
parser.add_argument(
|
|
"--ids",
|
|
type=str,
|
|
nargs="+",
|
|
help="ID диалогов для экспорта",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
await export_conversations(
|
|
redis_url=args.redis_url,
|
|
output_file=args.output,
|
|
conversation_ids=args.ids,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
|