- Matrix Client (підключення та синхронізація) - RBAC Checker (перевірка прав через Postgres) - Job Creator (створення jobs з команд) - NATS Publisher (публікація jobs у streams) - K8s deployment - README з документацією Команди: !embed, !retrieve, !summarize TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
62 lines
2.4 KiB
Python
62 lines
2.4 KiB
Python
"""
|
|
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()}"
|