""" Job Creator — створення jobs з командами Matrix """ import uuid import hashlib from datetime import datetime from typing import Dict, Any, Optional from gateway.nats_publisher import NATSPublisher class JobCreator: def __init__(self, nats_publisher: NATSPublisher): self.nats_publisher = nats_publisher async def create_job(self, command: Dict[str, Any], tenant: Optional[Dict[str, Any]] = None, scope: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """Створення job з команди""" job_id = self._generate_ulid() idempotency_key = self._generate_idempotency_key(command) job = { "job_id": job_id, "idempotency_key": idempotency_key, "type": command.get("type", "unknown"), "priority": command.get("priority", "offline"), "tenant": tenant or { "org_id": "550e8400-e29b-41d4-a716-446655440000" # Default DAARION org }, "scope": scope or {}, "requirements": command.get("requirements", { "needs_gpu": command.get("type") == "embed", "min_vram_gb": 8 if command.get("type") == "embed" else 0, "max_latency_ms": 300 if command.get("priority") == "online" else 60000, "tier": "A" if command.get("priority") == "online" else "B" }), "input": command.get("input", {}), "refs": command.get("refs", {}), "trace": { "trace_id": str(uuid.uuid4()), "parent_span_id": None }, "timestamps": { "created_at": datetime.utcnow().isoformat() + "Z" } } return job def _generate_ulid(self) -> str: """Генерація ULID (спрощена версія)""" # TODO: Використати бібліотеку ulid-py для правильного ULID return str(uuid.uuid4()).replace("-", "")[:26] def _generate_idempotency_key(self, command: Dict[str, Any]) -> str: """Генерація idempotency key (SHA256 hash)""" import json key_data = json.dumps(command, sort_keys=True) hash_obj = hashlib.sha256(key_data.encode()) return f"sha256:{hash_obj.hexdigest()}"