#!/usr/bin/env python3 """ Ініціалізація NATS JetStream streams для Memory Module Використання: python3 init-streams.py """ import sys import json import requests from typing import Dict, Any NATS_URL = sys.argv[1] if len(sys.argv) > 1 else "nats://nats-client.nats:4222" NATS_HTTP = NATS_URL.replace("nats://", "http://").replace(":4222", ":8222") def create_stream(stream_config: Dict[str, Any]) -> bool: """Створює stream через NATS HTTP API""" url = f"{NATS_HTTP}/jsz?streams=1" # NATS HTTP API використовує інший формат # Спробуємо через JetStream API try: # Для створення stream потрібен NATS CLI або Go/Python клієнт # Тимчасово використовуємо curl через kubectl exec print(f"⚠️ Stream '{stream_config['name']}' потрібно створити через NATS CLI") print(f" Використайте: kubectl exec -n nats nats-0 -- nats stream add {stream_config['name']} ...") return False except Exception as e: print(f"❌ Помилка створення stream: {e}") return False def main(): print(f"🚀 Ініціалізація NATS JetStream streams...") print(f"NATS URL: {NATS_URL}") print(f"NATS HTTP: {NATS_HTTP}") streams = [ { "name": "MM_ONLINE", "subjects": ["mm.embed.online", "mm.retrieve.online", "mm.summarize.online"], "retention": "limits", "max_age": 1800000000000, # 30 хв "max_deliver": 3, "ack_policy": "explicit", "storage": "file", "replicas": 2, "discard": "old", "duplicate_window": 300000000000 }, { "name": "MM_OFFLINE", "subjects": ["mm.embed.offline", "mm.index.offline", "mm.backfill.offline"], "retention": "limits", "max_age": 604800000000000, # 7 днів "max_deliver": 10, "ack_policy": "explicit", "storage": "file", "replicas": 2, "discard": "old" }, { "name": "MM_WRITE", "subjects": ["mm.qdrant.upsert", "mm.pg.write", "mm.neo4j.write"], "retention": "limits", "max_age": 604800000000000, # 7 днів "max_deliver": 10, "ack_policy": "explicit", "storage": "file", "replicas": 2, "discard": "old" }, { "name": "MM_EVENTS", "subjects": ["mm.event.audit", "mm.event.status"], "retention": "limits", "max_age": 2592000000000000, # 30 днів "ack_policy": "explicit", "storage": "file", "replicas": 2, "discard": "old" } ] print("\n📋 Streams для створення:") for stream in streams: print(f" - {stream['name']}: {', '.join(stream['subjects'])}") print("\n⚠️ Для створення streams потрібен NATS CLI.") print(" Використайте init-streams.sh або встановіть NATS CLI в контейнер.") return 0 if __name__ == "__main__": sys.exit(main())