Files
microdao-daarion/infrastructure/matrix-gateway/gateway/job_creator.py
Apple a0c3c0cbb5 🚀 Matrix Gateway: базова реалізація v1
- Matrix Client (підключення та синхронізація)
- RBAC Checker (перевірка прав через Postgres)
- Job Creator (створення jobs з команд)
- NATS Publisher (публікація jobs у streams)
- K8s deployment
- README з документацією

Команди: !embed, !retrieve, !summarize

TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
2026-01-10 10:40:18 -08:00

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()}"