Technical architecture for the Generative AI Factory domain.
Isis is the generative AI content factory at the heart of the Oshun platform. Its job is to accept generation requests from any part of the platform — images, video, audio, 3D models, textures, Blender renders — and manage those requests from initial queuing through GPU execution to final output storage and provenance recording. Importantly, Isis knows nothing about why a given piece of content is being generated or how it will be used. It is a pure capability service: submit a job, get an output back, with a complete record of exactly how that output was produced.
The system is organized as three cooperating REST API services (job submission, workflow management, and output tracking), a GPU worker process, a CLI, and a web front-end. A shared Redis queue connects the API to the workers, and Redis Streams carry lifecycle events to the rest of the platform. A single PostgreSQL database (via Prisma ORM) stores all persistent state.
System Overview#
Isis provides:
- Job submission via REST API (Hono, default port 3000)
- GPU worker processing with ComfyUI, Blender, and custom executors
- Workflow management with versioning and templates (port 3001)
- Output tracking with full provenance and lineage graph (port 3002)
- Model registry for checkpoint and LoRA management
- Client SDK (
@isis/client) and CLI for programmatic access
Isis acts as the creative engine of the platform — other domains submit generation requests, and Isis manages the complete lifecycle from job queuing through GPU execution to output storage and provenance recording.
High-Level Topology#
The following diagram shows how the five major runtime components relate to one another. The CLI and other domain clients talk to the three REST services; the generation API enqueues work to the GPU worker via Redis; and all services share a single PostgreSQL database and a MinIO/S3 object store.
+------------------+
| isis CLI |
| (Commander) |
+--------+---------+
|
+----------------+----------------+
| | |
+--------v--------+ +----v----------+ +----v-----------+
| generation-api | | workflow- | | output- |
| Port 3000 | | registry | | registry |
| (Hono) | | Port 3001 | | Port 3002 |
| /api/v1/jobs | | (Hono) | | (Hono) |
| /api/v1/models | | /api/v1/ | | /api/v1/ |
+--------+--------+ | workflows | | outputs |
| | /api/v1/ | | /api/v1/ |
| | templates | | policies |
| +---------------+ +----------------+
|
+--------v--------+
| gpu-worker |
| Redis queue |
| GPU executors |
| - texture |
| - blender |
| - gaussian |
| - mesh |
+-----------------+
|
+--------v--------+
| PostgreSQL | (ISIS_DATABASE_URL)
| (Prisma ORM) |
+-----------------+
|
+--------v--------+
| MinIO / S3 | (generated outputs)
+-----------------+
|
+--------v--------+
| Redis | (job queue + @oshun/event-bus)
+-----------------+
Service Topology#
Applications (6)#
Isis deploys as six distinct applications. Three are REST APIs that accept
external requests; one is a background worker that processes GPU jobs; one is a
CLI for scripted workflows; and one is a Next.js web front-end. REST services
read their listen port from process.env.PORT, defaulting as shown below
(apps/isis/*/src/index.ts).
| Application | Type | Default port | Framework | Description |
|---|---|---|---|---|
generation-api |
REST API | 3000 | Hono | Primary job submission and management API |
workflow-registry |
REST API | 3001 | Hono | Workflow CRUD, versioning, templates |
output-registry |
REST API | 3002 | Hono | Output manifests and retention policies |
gpu-worker |
Worker | — | Node.js | GPU job processor with Redis poll |
cli |
CLI Tool | — | Commander.js | Command-line interface for all services |
web |
Web front-end | — | Next.js | @isis/web operator/creator front-end |
Application Layer#
generation-api (default Port 3000)#
The generation API is the single entry point for all job submission. It
authenticates requests, validates inputs with Zod, writes a GenerationJob
record to the database, and enqueues the job for a GPU worker to pick up. It
also exposes model management, workflow execution triggers, webhook
subscriptions, and provider callbacks.
Middleware stack (Hono):
- CORS with configurable origins
- Secure headers (CSP, HSTS, X-Frame-Options, etc.)
- Pretty JSON for development
- Rate limiting: 100 requests per 60 seconds on
/api/* - JWT authentication middleware (fail-fast: requires
JWT_SECRETin production) - Zod request/response validation via
@hono/zod-validator
Core services:
JobService— submit, list, cancel, get stats, queue healthModelService— register, list, get, update, generate upload URLsComfyUIService— workflow execution via ComfyUI WebSocket protocol
The app mounts five route groups: jobs, models, workflows,
webhook-subscriptions, plus /webhooks (provider callbacks). The workflow
routes validate a typed contract for each of 32 asset-pack workflow recipes.
Health endpoints:
GET /health— Simple liveness probe (always 200 if process alive)GET /ready— Readiness probe: runs job-service, model-service, and ComfyUI-service health checks in parallel and returns200/503with a per-dependency breakdown (jobs DB, models DB, queue, storage, provider)
gpu-worker#
The GPU worker is a long-running Node.js process — it does not expose any HTTP
port. Instead it polls a Redis queue continuously, deserializes incoming
JobEnvelope messages, and routes each job to the appropriate executor. When a
job finishes, the worker uploads the output to S3, writes GeneratedOutput and
Provenance database records, and publishes a completion event on the event
bus.
The flow through the worker on every job is:
Poll Redis queue (ISIS_QUEUE_NAME)
│
▼
Deserialize JobEnvelope
│
Route by GenerationType:
├── TEXTURE_UPSCALE → texture-upscale-executor
├── BLENDER_RENDER → blender-render-executor
├── GAUSSIAN_SPLATTING → gaussian-splatting-executor
├── MESH_PROCESSING → mesh-processing-executor
└── All other types → generic executor (provider-routed)
│
▼
Execute (may call AI provider API)
│
▼
Upload output to S3
│
▼
Create GeneratedOutput + Provenance records
│
▼
Update GenerationJob status → COMPLETED | FAILED
│
▼
Publish isis.job.completed event
Configuration:
GPU_DEVICES— comma-separated CUDA device indicesWORKER_TYPE— one of seven worker types (texture-upscale,mesh-processing,blender-render,gaussian-splatting,video-generation,neural-bake,general)QUEUE_NAME— Redis queue to pollWORKER_ID— unique worker identifier registered inGpuWorkertable
Lifecycle events emitted (internal): worker:started, worker:stopped,
job:started, job:progress, job:completed, job:failed
Graceful shutdown: On SIGINT/SIGTERM, the worker finishes the current
job before exiting.
workflow-registry (Port 3001)#
The workflow registry stores and versions ComfyUI workflow definitions. It is
separate from the generation API so that workflow authoring tools and
administrative interfaces can talk directly to it without going through the job
submission path. It has two storage backends — postgres (production) and
in-memory (test/dev override) — and exposes full-text search via PostgreSQL
tsvector when database-backed.
Key capabilities:
- Full CRUD with semver versioning, changelog tracking, and star/favorite system
- Visibility controls:
PRIVATE,TEAM,ORGANIZATION,PUBLIC - Staging-recipe routes for promotion workflows
output-registry (Port 3002)#
The output registry is the long-term home for every file that Isis generates. Rather than baking lifecycle management into the generation API, it is separated here so that storage policy decisions — tiering, retention, expiry — can evolve independently of job submission.
- Tracks every output file with hash, dimensions, storage tier, and access statistics
- Storage tiering — Automatic lifecycle management: HOT → WARM → COLD →
GLACIER based on
RetentionPolicyrules and access patterns - Lineage graph — Directed graph of
LineageEdgerecords tracking derivation between outputs (e.g., upscaled-from, converted-from) - Provenance — Immutable
Provenancerecords capturing full generation context for reproducibility - File deduplication — Content hash uniqueness prevents duplicate storage
cli#
Commander.js CLI (isis) for scripted generation workflows and CI/CD
integration. Authenticates via JWT token or API key stored in
~/.isis/config.yaml. The CLI covers seven command groups: generate, jobs,
workflows, outputs, config, health, and auth.
Library Architecture#
The 55 libraries in libs/isis/ are organized by concern. Understanding which
group a library belongs to tells you what kind of dependency it is: core
platform libraries are stable and depended on widely; provider adapters change
when AI vendor APIs change; 3D generation libraries form a largely
self-contained sub-system. What follows groups the 55 directories (54 TypeScript
@isis/* packages plus one Python package) by that concern.
Core platform (6)#
These six libraries form the foundation that every other Isis library or application may depend on.
| Library | Purpose |
|---|---|
@isis/client |
TypeScript SDK: IsisClient, HttpTransport, RequestBuilder, typed errors |
@isis/database |
Prisma ORM schema (1141 lines, 24 models, 14 enums) and generated client |
@isis/job-envelope |
Job-envelope Zod schema, generation-type manifest, control vocabulary, composer dispatch payloads |
@isis/workflows |
Workflow-registry domain library: definition storage, versioning, templates |
@isis/outputs |
Output manifest management: file tracking, storage tiering, retention enforcement |
@isis/event-publisher |
Typed event publishing for generation lifecycle events to @oshun/event-bus |
AI providers, LLM, and orchestration (10)#
These libraries abstract every external AI vendor behind a common interface, and provide higher-level orchestration (batching, consensus, ReAct agents) on top.
| Library | Purpose |
|---|---|
@isis/ai-providers |
Unified provider adapters (LLM, image, video, video-processing, TTS, 3D, ComfyUI, Civitai, model-registry) |
@isis/llm-providers |
Additional LLM provider adapters |
@isis/llm-orchestrator |
LLM orchestration layer for multi-step workflows |
@isis/batch-llm-processing |
Batch LLM inference for high-volume text tasks |
@isis/token-budget |
LLM token-budget allocation, prediction, and enforcement |
@isis/agent-consensus |
Multi-agent debate, reasoning, and consensus |
@isis/react-framework |
ReAct-pattern (Reasoning + Acting) tool-using agent execution framework |
@isis/prompt-engineering |
Prompt templates, builder, analyzer, optimizer |
@isis/operation-orchestrator |
Multi-step operation orchestration: retry, dead-letter, pipeline/chain/phase model |
@isis/managed-models |
Managed-model browser surface |
ComfyUI and workflow authoring (5)#
ComfyUI is the primary visual workflow engine. These libraries cover everything from low-level WebSocket communication with a running ComfyUI instance up to higher-level workflow-class catalogs and custom Python nodes.
| Library | Purpose |
|---|---|
@isis/comfyui-sdk |
WebSocket-based ComfyUI SDK: server connection, workflow execution |
@isis/comfyui-factory |
Workflow-class authoring, template diff, portability check, rehearsal harness |
comfyui-nodes |
Python ComfyUI custom-node package (sacred-geometry, spiritual-styles, vfx-post, consciousness, lilith node sets) |
@isis/3d-comfyui-nodes |
3D-specific ComfyUI node definitions |
@isis/workflow-classes |
Living-scene workflow-class catalogs (tara, nyx, veritas, …) |
Image, video, and audio (11)#
This group covers the full media-generation surface area beyond simple text-to-image: AI video generation and enhancement, geometry extraction from video, all audio and voice synthesis capabilities, and AI texturing for 3D assets.
| Library | Purpose |
|---|---|
@isis/ai-video |
Video generation (providers, advanced, self-hosted) |
@isis/video-enhancement |
AI video enhancement/restoration (super-resolution, interpolation) |
@isis/video-to-mesh |
3D-geometry extraction from video footage |
@isis/audio-generation |
Audio, TTS, and voice generation with QA |
@isis/music-generation |
Music generation: provider, guardrails, stems, provenance |
@isis/voice-cloning |
Voice-cloning and synthesis orchestration |
@isis/visual-dubbing |
Visual dubbing and dialogue-editing orchestration |
@isis/face-synthesis |
Face synthesis, de-aging, and identity-transfer orchestration |
@isis/seedance-provider |
Seedance video-generation provider integration |
@isis/post-production-ai |
Per-production post-production intelligence for cinematic dailies |
@isis/ai-texturing |
AI texture upscaling, seamless tiling, material-ID extraction |
3D generation (16)#
The 3D generation sub-system is the most complex part of Isis, covering multi-provider cloud generation, quality gating, rigging, post-processing, scene assembly, and governance. These 16 libraries form a largely self-contained 3D pipeline.
| Library | Purpose |
|---|---|
@isis/3d-generation |
Multi-provider 3D generation (Rodin, Meshy, Tripo, Trellis, Hunyuan, ThreeDFY, Marble) |
@isis/3d-generation-benchmarks |
Cross-provider 3D quality and throughput benchmarking |
@isis/3d-inference-local |
Self-hosted 3D model serving |
@isis/3d-post-pipeline |
Mesh optimization, UV unwrapping, LOD generation, texture baking |
@isis/3d-quality-gates |
Topology, UV-coverage, rig, and LOD-chain validation |
@isis/3d-semantic-editing |
Text-guided semantic editing of generated 3D models |
@isis/3d-asset-library |
3D-asset browsing and management |
@isis/3d-browser |
In-browser 3D model preview and interaction |
@isis/3d-scene-assembly |
3D scene-assembly modules |
@isis/3d-marketplace-ops |
3D-marketplace operations modules |
@isis/3d-product-parity |
3D product-parity modules |
@isis/three-d-pipelines |
3D pipeline-class, provider, topology, and provenance contracts |
@isis/universal-rigging |
Automated skeletal rigging, skin weights, animation retargeting |
@isis/gaussian-splatting |
NeRF/Gaussian-splatting reconstruction, mesh extraction |
@isis/scene-from-image-composer |
End-to-end scene composition from a single image |
@isis/model-governance-3d |
3D model license tracking and compliance |
Models, quality, and operations (7)#
The final group covers everything that happens around the edges of generation: fine-tuning models to produce new capabilities, detecting misuse, gating access by entitlement, surfacing outputs in a gallery, and managing the RunPod serverless GPU endpoint.
| Library | Purpose |
|---|---|
@isis/model-fine-tuning |
LoRA training and fine-tuning utilities |
@isis/lora-training-surface |
LoRA training-run, model-merging, quality-view, lineage-tree surface |
@isis/anomaly-detection |
Suspicious-activity detection, chargeback prediction, account protection |
@isis/curated-cards |
Curated-card types, validators, preflight, entitlement gate |
@isis/entitlements |
Generation-tier and studio-boundary entitlements |
@isis/output-gallery |
Output-record gallery: lineage, branch-replay, bulk actions |
@isis/runpod-surface |
RunPod endpoint registry, cost-quota, queue inspector, secret rotation |
(The apps/isis/web front-end is packaged as @isis/web.)
Data Flow#
Understanding how data moves through Isis is key to debugging and extending it. The three flows below cover the common case (single generation job), the workflow-driven case, and the output lineage tracking that links derived assets back to their origins.
Generation Pipeline#
This is the most common path: a client submits a job, the API queues it, a GPU worker executes it, and the resulting file lands in object storage with its provenance recorded.
Client / CLI / Other Domain Isis Services Storage
───────────────────────── ────────────────────── ─────────────────
POST /api/v1/jobs generation-api
{ │
type: TEXT_TO_IMAGE, │ validate JWT
prompt: "...", │ validate Zod schema
model: "sdxl-1.0" │ create GenerationJob (PENDING)
} │ enqueue to Redis
│
← 202 Accepted │
{ id: "job_xxx", status: PENDING }│
gpu-worker
│ poll queue
│
├─ resolve ModelRegistry
│ by modelId
│
├─ execute via
│ ComfyUI / Executor
│ (or AI provider API)
│
├─ emit job:progress events
│ (progress 0→100%)
│
├─ upload output to S3 ──────────→ MinIO
│
├─ create GeneratedOutput
│ {hash, dimensions, tier: HOT}
│
├─ create Provenance
│ {model, params, seed, gpu, cost}
│
├─ update job → COMPLETED
│
└─ publish isis.asset.generated ──→ event bus
output-registry
│ store manifest
│ evaluate retention policy
│ queue tier transitions
Workflow Execution Flow#
When a job is submitted with a workflowId, the generation API loads the
workflow definition from the workflow registry, validates the job parameters
against the workflow's schema, and enqueues the job with the full workflow
context attached. The GPU worker then drives ComfyUI over WebSocket to execute
the graph.
User workflow-registry generation-api
──── ───────────────── ──────────────
Create workflow
with nodes/edges ──→ Store definition
+ version (1.0.0)
│
Submit job with │
workflowId ─────────────────────────────────→ Load workflow
definition from DB
│
Validate params
against schema
│
Enqueue with
workflow context
│
gpu-worker
│
Execute via
ComfyUI WebSocket
│
Store output
+ provenance
Output Lineage Flow#
Every derived output — an upscaled image, a converted mesh, an engine-native
asset — is linked back to its origin via LineageEdge records. This makes it
possible to trace any asset backwards to its original generation job and
parameters, and to reconstruct the full derivation chain for compliance or
reproducibility purposes.
Original Image Upscaled Engine Asset
───────────── ──────── ────────────
GeneratedOutput ─UPSCALED_FROM─→ GeneratedOutput
(job: t2i) (job: upscale)
(512×512) (2048×2048)
│
CONVERTED_FROM
│
▼
GeneratedOutput
(.uasset format)
bellonaAssetId set
in Yemaya Asset record
Cross-Domain Integration#
Isis is a pure capability domain — it provides generation services to other
domains and does not depend on any other domain. This boundary is deliberate: if
Isis depended on Yemaya or Bellona, a change to those domains could break
generation for everyone. Instead, Isis speaks only in opaque IDs (projectId,
userId) that originating domains provide and receive back.
Event Bus Architecture#
Isis uses @isis/event-publisher (wrapping @oshun/event-bus) to publish
lifecycle events on Redis Streams under the oshun:events key prefix. Any
domain interested in generation outcomes subscribes to these events rather than
polling the Isis API:
Isis generation-api / gpu-worker
│
└── @isis/event-publisher
│
└── @oshun/event-bus (Redis Streams, keyPrefix "oshun:events")
│
├── isis.job.* events → job lifecycle (queued/started/
│ progress/completed/failed/cancelled)
├── isis.asset.generated → new asset available
├── isis.workflow.* → workflow registered/updated
└── isis.model.loaded → model loaded onto a GPU worker
Event types and payload schemas are defined canonically in @oshun/contracts
(IsisEventTypes). Event publishing is best-effort: a publish failure is logged
and swallowed so it never breaks the generation flow.
Inbound Integration#
Other domains (Yemaya, Hathor, Bellona, Lilith) submit generation jobs directly
to the Isis REST API or via the @isis/client SDK. Jobs carry a projectId
cross-reference that is stored verbatim on the GenerationJob record. Isis
never resolves what that project represents — that is always the caller's
responsibility. The echoed projectId in completion events is how the
originating domain correlates results back to its own records:
Yemaya publish yemaya.generation.requested
→ Isis handler creates GenerationJob{projectId: "prj_xyz"}
→ Job executes, output stored
→ Isis publishes isis.job.completed{projectId: "prj_xyz"}
→ Yemaya handler resolves Project by projectId, creates Asset
Canary Rollout and Operational Tooling#
Isis includes production-grade operational tooling for safe rollouts and
incident management, documented in docs/domains/isis/remediation/ and
docs/domains/isis/remediation-v2/.
Canary Queue Rollout#
Rather than doing a hard cutover when the queue producer changes, Isis supports a gradual canary rollout controlled by environment variables. Traffic is split between the old and new queue at a configured percentage, and SLO gates determine whether to promote or roll back:
ISIS_QUEUE_PRODUCER_ENABLED=true # Master switch
ISIS_QUEUE_PRODUCER_CANARY_ENABLED=false # Canary mode
ISIS_QUEUE_PRODUCER_CANARY_PERCENTAGE=10 # 10% of traffic to new queue
ISIS_QUEUE_PRODUCER_CANARY_PROJECT_IDS= # Allowlist for canary routing
Canary advancement is automated via
scripts/isis/advance_queue_canary_rollout.sh with SLO-gated promotion/rollback
decisions.
Operational Scripts#
A set of shell scripts in scripts/isis/ supports the full release and
validation lifecycle:
| Script | Purpose |
|---|---|
validate_compose_app_paths.sh |
Validate Docker Compose path wiring |
smoke_compose_health.sh |
Run /health + /ready smoke checks |
verify_canary_slo_cost.sh |
Verify SLO/cost release gate from job history |
advance_queue_canary_rollout.sh |
Advance canary with promote/rollback decision |
run_release_gameday.sh |
Pre-cutover game-day harness, emits structured report |
run_post_cutover_validation.sh |
Post-cutover validation with sign-off evidence |
SLO Definitions#
The following SLOs are defined in
docs/domains/isis/remediation/ISIS_SLO_DEFINITIONS.json and gate canary
promotion decisions:
- Job submission success rate: >99.5%
- Job completion latency (p99): type-dependent (image < 30s, 3D < 300s)
- Output storage durability: >99.999%
- API availability: >99.9%
Deployment Architecture#
Container Strategy#
Each Isis service deploys as its own container image. The API services are stateless and scale horizontally behind a load balancer; the GPU worker scales by queue depth and is tied to GPU node pools.
| Service | Image | Scaling |
|---|---|---|
generation-api |
isis-api |
Horizontal, stateless, load balanced |
gpu-worker |
isis-worker |
GPU node pools, scale by queue depth |
workflow-registry |
isis-workflow |
Horizontal, stateless |
output-registry |
isis-output |
Horizontal, stateless |
GPU Infrastructure#
GPU workers are deployed on GPU-enabled nodes. The GPU_DEVICES environment
variable specifies which CUDA devices the worker can use. Multiple worker
instances can run on the same node (one per GPU) or across multiple nodes.
RunPod serverless is used for on-demand GPU capacity spikes without maintaining persistent GPU instances (per ADR-0003).
Development Stack#
To bring up Isis locally with GPU support:
# Start Isis local stack with GPU profile
docker compose -f docker/docker-compose.yml --profile gpu up -d \
postgres redis qdrant isis-api isis-generator
Technology Stack#
The following table records the technology choice for each layer and the rationale behind it. Cross-referencing this with the ADR list (in the specifications doc) gives the full decision history.
| Layer | Technology | Rationale |
|---|---|---|
| API Framework | Hono | Lightweight TypeScript-native REST framework |
| ORM | Prisma | Type-safe queries, migrations, 24-model schema |
| Database | PostgreSQL | Relational data with JSONB for parameters |
| Job Queue | Redis (poll model) | Reliable delivery; poll chosen over push (ADR-0001) |
| Event Bus | Redis Streams (@oshun/event-bus) |
Cross-domain typed event publishing |
| Object Storage | MinIO (dev) / S3 (prod) | S3-compatible output storage |
| AI Image | Stability AI, Black Forest Labs (FLUX) | Stable Diffusion / SD3.5 and FLUX models |
| AI Video | Hunyuan, LTX, Wan, Seedance | Text-to-video and image-to-video providers |
| AI 3D | Rodin, Meshy, Tripo, Trellis, Hunyuan, ThreeDFY, Marble | Multi-provider 3D generation |
| AI Audio | ElevenLabs | High-quality voice synthesis |
| AI Text | Anthropic, OpenAI, Google AI, xAI, Ollama | Claude, GPT, Gemini, Grok, and local LLM models |
| Video Processing | NVIDIA RTX, RIFE, Topaz | Super-resolution, frame interpolation, enhancement |
| Workflow Engine | ComfyUI | Visual workflow design with WebSocket execution |
| Validation | Zod + @hono/zod-validator |
Runtime validation + type inference |
| Build | Nx (@nx/js:tsc) |
Monorepo-integrated TypeScript build |
| Testing | Vitest | Fast unit and integration testing |
| Logging | Pino (@oshun/logging) |
Structured JSON logging |
Design Principles#
The following principles explain why the architecture is shaped the way it is, not just what it does. Each one reflects a deliberate trade-off made during the system's design.
-
Generation-as-a-service — Isis is a pure capability service with no domain knowledge about what the content will be used for. Job context (projectId, userId) flows through as opaque references. This isolation means changes to Yemaya or Bellona's data models never require changes to Isis.
-
Full provenance for every output — Every generated file has an immutable
Provenancerecord capturing model, parameters, seed, and cost. This enables reproducibility, cost attribution, and compliance auditing. You can always answer "exactly how was this file produced?" -
Lineage over mutation — Outputs are never modified in place. Transformations (upscaling, conversion) create new
GeneratedOutputrecords linked byLineageEdgerecords. The lineage graph is append-only, which means the history of every asset is complete and unambiguous. -
Provider abstraction —
@isis/ai-providersabstracts all AI provider differences behind a uniform interface. Generation type determines which providers are eligible; the system routes to the best available provider. Adding a new provider requires only a new adapter, not changes to job submission logic. -
Poll-based queue for reliability — The Redis poll model (ADR-0001) was chosen over pub/sub push because it provides better at-least-once delivery guarantees and makes worker restarts safe without job loss.
-
Canary-first deployments — All queue and API changes go through canary rollout with SLO-gated promotion. Rollback criteria are pre-defined and automated.