Crawler Summary

-Aurelius-Multi-Agent-AI-Platform answer-first brief

Production-grade Django REST Framework backend powering 8 specialized AI agents via a single intelligent orchestrator. Built with CrewAI, Google Gemini 2.0 Flash, and PostgreSQL. <div align="center"> πŸ€– Aurelius β€” Multi-Agent AI Platform Backend Engineering Deep-Dive $1 $1 $1 $1 $1 $1 A production-deployed Django REST API that routes user requests to a fleet of 8 specialized CrewAI agents via a central orchestrator. Built with a focus on clean architecture, security, and real-world deployment practices. </div> --- Table of Contents - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - Capability contract not published. No trust telemetry is available yet. 1 GitHub stars reported by the source. Last updated 10/9/2026.

Freshness

Last checked 10/9/2026

Best For

-Aurelius-Multi-Agent-AI-Platform is best for crewai, multi-agent workflows where OpenClaw compatibility matters.

Not Ideal For

Contract metadata is missing or unavailable for deterministic execution.

Evidence Sources Checked

editorial-content, GITHUB REPOS, runtime-metrics, public facts pack

Agent DossierGITHUB REPOSSafety: 66/100

-Aurelius-Multi-Agent-AI-Platform

Production-grade Django REST Framework backend powering 8 specialized AI agents via a single intelligent orchestrator. Built with CrewAI, Google Gemini 2.0 Flash, and PostgreSQL. <div align="center"> πŸ€– Aurelius β€” Multi-Agent AI Platform Backend Engineering Deep-Dive $1 $1 $1 $1 $1 $1 A production-deployed Django REST API that routes user requests to a fleet of 8 specialized CrewAI agents via a central orchestrator. Built with a focus on clean architecture, security, and real-world deployment practices. </div> --- Table of Contents - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 -

OpenClawself-declared

Public facts

5

Change events

1

Artifacts

0

Freshness

Oct 9, 2026

Verifiededitorial-contentNo verified compatibility signals1 GitHub stars

Capability contract not published. No trust telemetry is available yet. 1 GitHub stars reported by the source. Last updated 10/9/2026.

1 GitHub starsTrust evidence available

Trust score

Unknown

Compatibility

OpenClaw

Freshness

Oct 9, 2026

Vendor

Abdullahanwar26

Artifacts

0

Benchmarks

0

Last release

Unpublished

Executive Summary

Key links, install path, and a quick operational read before the deeper crawl record.

Verifiededitorial-content

Summary

Capability contract not published. No trust telemetry is available yet. 1 GitHub stars reported by the source. Last updated 10/9/2026.

Setup snapshot

  1. 1

    Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.

  2. 2

    Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.

Evidence Ledger

Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.

Verifiededitorial-content
Vendor (1)

Vendor

Abdullahanwar26

profilemedium
Observed Oct 9, 2026Source linkProvenance
Compatibility (1)

Protocol compatibility

OpenClaw

contractmedium
Observed Oct 9, 2026Source linkProvenance
Adoption (1)

Adoption signal

1 GitHub stars

profilemedium
Observed Oct 9, 2026Source linkProvenance
Security (1)

Handshake status

UNKNOWN

trustmedium
Observed unknownSource linkProvenance
Integration (1)

Crawlable docs

6 indexed pages on the official domain

search_documentmedium
Observed Apr 15, 2026Source linkProvenance

Release & Crawl Timeline

Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.

Self-declaredagent-index

Artifacts Archive

Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.

Self-declaredGITHUB REPOS

Extracted files

0

Examples

6

Snippets

0

Languages

python

Executable Examples

text

Request
  β”‚
  β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              URL Router  (myapp/urls.py)             β”‚
β”‚   DRF DefaultRouter (ModelViewSets) +               β”‚
β”‚   Manual path() declarations (custom views)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Authentication Middleware Layer              β”‚
β”‚                                                      β”‚
β”‚  1. JWTAuthentication  (SimpleJWT)                  β”‚
β”‚     └─ Validates Bearer token β†’ sets request.user   β”‚
β”‚                                                      β”‚
β”‚  2. APIKeyAuthentication  (custom backend)          β”‚
β”‚     └─ Validates sk_* token β†’ sets request.user     β”‚
β”‚        AND attaches request.api_key for ACL checks  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              View Layer  (myapp/views.py)            β”‚
β”‚                                                      β”‚
β”‚  APIView subclasses   β†’  custom business logic      β”‚
β”‚  ModelViewSet         β†’  standard CRUD endpoints    β”‚
β”‚  generics.*           β†’  list/retrieve shortcuts    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           AI Gateway Service Layer                   β”‚
β”‚         (myapp/services/ai_gateway.py)               β”‚
β”‚                                                      β”‚
β”‚   call_ai_agent(agent_type, query, file_path)       β”‚
β”‚   └─ Lazy-imports and dispatches to the right crew  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               CrewAI Agent Fleet                     β”‚
β”‚  (myapp/ai/agents/*)

python

# myapp/urls.py
router = DefaultRouter()
router.register(r'users',            UserViewSet)
router.register(r'agents',           AgentViewSet)
router.register(r'conversations',    ConversationViewSet)
router.register(r'chat-messages',    ChatMessageViewSet)
router.register(r'api-keys',         APIKeyViewSet, basename="api-keys")
router.register(r'agent-feedbacks',  AgentFeedbackViewSet)
# ... more

python

class ConversationViewSet(ModelViewSet):
    def get_queryset(self):
        return Conversation.objects.filter(user=self.request.user)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

python

class AgentAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser, JSONParser]

python

# settings.py
SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME":  timedelta(days=30),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=30),
    "AUTH_HEADER_TYPES": ("Bearer",),
}

python

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)
        data.update({
            'user_id':  self.user.id,
            'username': self.user.username,
            'email':    self.user.email,
        })
        return data

Docs & README

Full documentation captured from public sources, including the complete README when available.

Self-declaredGITHUB REPOS

Docs source

GITHUB REPOS

Editorial quality

ready

Production-grade Django REST Framework backend powering 8 specialized AI agents via a single intelligent orchestrator. Built with CrewAI, Google Gemini 2.0 Flash, and PostgreSQL. <div align="center"> πŸ€– Aurelius β€” Multi-Agent AI Platform Backend Engineering Deep-Dive $1 $1 $1 $1 $1 $1 A production-deployed Django REST API that routes user requests to a fleet of 8 specialized CrewAI agents via a central orchestrator. Built with a focus on clean architecture, security, and real-world deployment practices. </div> --- Table of Contents - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 - $1 -

Full README
<div align="center">

πŸ€– Aurelius β€” Multi-Agent AI Platform

Backend Engineering Deep-Dive

Python Django DRF CrewAI PostgreSQL Render

A production-deployed Django REST API that routes user requests to a fleet of 8 specialized CrewAI agents via a central orchestrator. Built with a focus on clean architecture, security, and real-world deployment practices.

</div>

Table of Contents


πŸ“Œ Project Overview

Aurelius is a Django REST Framework backend that exposes a clean, authenticated REST API on top of a multi-agent AI system. The core challenge this project solves is providing a single, stable API surface that can route a request to any of 8 completely different AI agent pipelines β€” each with its own tools, LLMs, and file-handling logic β€” without exposing that complexity to the client.

Core backend responsibilities this project demonstrates:

  • Designing and implementing a layered REST API with DRF
  • Custom authentication backends (JWT + API Key in parallel)
  • Fine-grained, attribute-based access control on API keys
  • Normalized JSON response envelope across all endpoints
  • Custom exception handling with consistent error shapes
  • File upload handling and safe temp file lifecycle management
  • Persistent conversation and message storage with relational models
  • Production deployment with Gunicorn, Whitenoise, and PostgreSQL on Render

πŸ—οΈ Backend Architecture

The backend is organized into clear, separated layers. Each layer has one job.

Request
  β”‚
  β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              URL Router  (myapp/urls.py)             β”‚
β”‚   DRF DefaultRouter (ModelViewSets) +               β”‚
β”‚   Manual path() declarations (custom views)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Authentication Middleware Layer              β”‚
β”‚                                                      β”‚
β”‚  1. JWTAuthentication  (SimpleJWT)                  β”‚
β”‚     └─ Validates Bearer token β†’ sets request.user   β”‚
β”‚                                                      β”‚
β”‚  2. APIKeyAuthentication  (custom backend)          β”‚
β”‚     └─ Validates sk_* token β†’ sets request.user     β”‚
β”‚        AND attaches request.api_key for ACL checks  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              View Layer  (myapp/views.py)            β”‚
β”‚                                                      β”‚
β”‚  APIView subclasses   β†’  custom business logic      β”‚
β”‚  ModelViewSet         β†’  standard CRUD endpoints    β”‚
β”‚  generics.*           β†’  list/retrieve shortcuts    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           AI Gateway Service Layer                   β”‚
β”‚         (myapp/services/ai_gateway.py)               β”‚
β”‚                                                      β”‚
β”‚   call_ai_agent(agent_type, query, file_path)       β”‚
β”‚   └─ Lazy-imports and dispatches to the right crew  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               CrewAI Agent Fleet                     β”‚
β”‚  (myapp/ai/agents/*)                                 β”‚
β”‚                                                      β”‚
β”‚  Root Orchestrator β†’ routes to one or many:         β”‚
β”‚  QnA Β· Data Analysis Β· Automation Β· Stock           β”‚
β”‚  Resume Optimizer Β· Sentiment Β· Talent Β· RAG        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Response Renderer  (CustomJSONRenderer)      β”‚
β”‚   Wraps ALL responses in standard envelope:         β”‚
β”‚   { "meta": {}, "message": "...", "error": bool }   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🌐 API Design

Design Principles

1. Resource-based routing via DRF Router

All CRUD-able models are registered with DefaultRouter. This auto-generates the full suite of GET /resource/, POST /resource/, GET /resource/{id}/, PUT, PATCH, DELETE endpoints with zero boilerplate.

# myapp/urls.py
router = DefaultRouter()
router.register(r'users',            UserViewSet)
router.register(r'agents',           AgentViewSet)
router.register(r'conversations',    ConversationViewSet)
router.register(r'chat-messages',    ChatMessageViewSet)
router.register(r'api-keys',         APIKeyViewSet, basename="api-keys")
router.register(r'agent-feedbacks',  AgentFeedbackViewSet)
# ... more

2. Action-based endpoints for complex operations

Operations that don't map cleanly to a resource (calling an AI agent, starting a new chat, deleting a conversation) are implemented as explicit APIView subclasses with path() declarations. This keeps the router clean and the custom logic readable.

3. Scoped querysets β€” users only ever see their own data

Every ModelViewSet that handles user-owned data overrides get_queryset():

class ConversationViewSet(ModelViewSet):
    def get_queryset(self):
        return Conversation.objects.filter(user=self.request.user)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

This pattern is consistent across ChatMessageViewSet, TokenLogViewSet, SubscriptionViewSet, RootAgentMemoryViewSet, APIKeyViewSet, and AgentFeedbackViewSet. No view ever returns another user's data.

4. Parser flexibility

AI agent endpoints accept JSON, form data, and file uploads in one view class:

class AgentAPIView(APIView):
    parser_classes = [MultiPartParser, FormParser, JSONParser]

πŸ” Authentication & Authorization

This project implements two completely parallel authentication backends, both active simultaneously via DRF's DEFAULT_AUTHENTICATION_CLASSES.

Backend 1: JWT Authentication (SimpleJWT)

Standard stateless JWT flow. Users log in to receive an access token (30-day lifetime) and a refresh token (30-day lifetime). Logout blacklists the refresh token using SimpleJWT's token blacklist app, making it truly invalidate.

# settings.py
SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME":  timedelta(days=30),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=30),
    "AUTH_HEADER_TYPES": ("Bearer",),
}

The login view uses a custom serializer that injects extra user metadata into the JWT response without modifying the token payload itself:

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)
        data.update({
            'user_id':  self.user.id,
            'username': self.user.username,
            'email':    self.user.email,
        })
        return data

Backend 2: API Key Authentication (Custom)

A fully custom BaseAuthentication subclass that supports scoped, per-agent API keys for external integrations. This lets third-party apps embed API access without giving out a user's full JWT.

# myapp/authentication.py
class APIKeyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        auth_header = request.headers.get("Authorization")
        if not auth_header or not auth_header.startswith("Bearer "):
            return None  # fall through to next auth backend

        key = auth_header.split("Bearer ")[1].strip()
        api_key = APIKey.objects.get(key=key, is_active=True)

        # Attach the key object to request for downstream ACL checks
        request.api_key = api_key
        return (api_key.user, None)

Key design decisions:

  • Returns None (not an exception) when no sk_* key is detected, allowing DRF to fall through to JWT auth β€” both backends coexist without conflict
  • Attaches the api_key object to the request so views can check granular permissions downstream without another DB query
  • API keys are generated with secrets.token_hex(16) prefixed with sk_ β€” never stored in plaintext in logs

Per-Agent Access Control

Each APIKey model instance has 8 boolean permission flags β€” one per agent:

allow_qna | allow_data | allow_talent | allow_stock |
allow_resume | allow_sentiment | allow_auto | allow_rag

A static helper method on the auth class checks these:

@staticmethod
def check_agent_permission(request, agent_name: str):
    api_key = getattr(request, "api_key", None)
    agent_map = {
        "qna":       api_key.allow_qna,
        "data":      api_key.allow_data,
        "stock":     api_key.allow_stock,
        # ...
    }
    if not agent_map.get(agent_name):
        raise AuthenticationFailed(f"API Key not authorized for {agent_name} agent.")

A separate api_key_helpers.py service module handles lookups cleanly:

AGENT_FLAG_MAP = {
    "qna": "allow_qna", "data": "allow_data", ...
}

def api_key_allows_agent(api_key_obj: APIKey, agent_name: str) -> bool:
    flag = AGENT_FLAG_MAP.get(agent_name.lower())
    return bool(getattr(api_key_obj, flag, False))

πŸ—ƒοΈ Data Models

All models live in myapp/models.py. The schema is designed around a user β†’ conversation β†’ message hierarchy with supporting lookup tables.

Entity Relationship Overview

User
 β”œβ”€β”€ Conversation  (one user β†’ many conversations)
 β”‚    └── ChatMessage  (one conversation β†’ many messages)
 β”‚         └── TokenLog  (one message β†’ one token log entry)
 β”œβ”€β”€ Subscription  (token limit / billing plan)
 β”œβ”€β”€ APIKey        (external access keys with per-agent flags)
 β”œβ”€β”€ AgentFeedback (rating + comment per agent)
 └── RootAgentMemory  (routing decisions log)

Agent
 β”œβ”€β”€ Conversation  (FK β€” which agent was used)
 β”œβ”€β”€ ChatMessage   (FK β€” which agent sent/received)
 β”œβ”€β”€ AgentIntegration  (API endpoint config for snippet gen)
 └── AgentFeedback (FK)

Custom User Model

Uses AbstractUser with email as the login identifier. This is set up from the very first migration β€” changing USERNAME_FIELD after the fact would require a full migration rewrite.

class User(AbstractUser):
    email   = models.EmailField(unique=True)
    phone   = models.CharField(max_length=12, blank=True)
    USERNAME_FIELD  = 'email'
    REQUIRED_FIELDS = ['username']

AUTH_USER_MODEL = "myapp.User" is set in settings.py before any auth-related migrations run.

Notable Model Patterns

Soft FK with SET_NULL β€” conversations survive agent deletion:

agent = models.ForeignKey(Agent, on_delete=models.SET_NULL, null=True, blank=True)

Auto-title on save β€” conversations without a title default cleanly:

def save(self, *args, **kwargs):
    if not self.title:
        self.title = "New Chat"
    super().save(*args, **kwargs)

JSONField for flexible storage β€” routing decisions and API request bodies stored without schema lock-in:

used_agents = models.JSONField()      # on RootAgentMemory
body        = models.JSONField()      # on AgentIntegration

Secure key generation on serializer create β€” keys are never accepted from client input:

class APIKeySerializer(serializers.ModelSerializer):
    class Meta:
        read_only_fields = ["id", "key", "user", "created_at"]

    def create(self, validated_data):
        validated_data["key"] = "sk_" + secrets.token_hex(16)
        return super().create(validated_data)

Migrations

3 migrations cover the full schema evolution:

| Migration | Change | |---|---| | 0001_initial | Full schema: User, Agent, Conversation, ChatMessage, TokenLog, Subscription, RootAgentMemory, APIKey, AgentFeedback | | 0002_apikey_is_active | Adds is_active flag to APIKey | | 0003_alter_user_name_alter_user_phone | Adjusts field constraints on User |


⚑ The AI Gateway Layer

myapp/services/ai_gateway.py is the single integration point between the Django view layer and the CrewAI agent system. This decoupling is intentional β€” views never import agent code directly.

def call_ai_agent(agent_type: str, query, file_path=None, csv_file=None):
    if agent_type == "qna":
        from myapp.ai.agents.qna_agent.qna_user_agent import run_qna
        return run_qna(query)

    elif agent_type == "data":
        from myapp.ai.agents.data_analysis... import run_data_analysis
        return run_data_analysis(query, file_path)

    elif agent_type == "root":
        from myapp.ai import main
        return main.manager_agent_function(query=query, file=file_path)
    # ... etc

Why lazy imports (inside the function, not at top of file)?

All agent imports are deferred until the function is actually called. This means:

  • Django startup time is not affected by heavy CrewAI/LangChain import chains
  • A missing dependency in one agent doesn't crash the entire server
  • Each agent is only loaded into memory when it's actually needed

Why a service layer instead of calling agents directly from views?

  • Views stay clean and focused on HTTP concerns (parsing, auth, response shaping)
  • Swapping an agent's implementation requires zero view changes
  • The gateway is the single place to add cross-cutting concerns (logging, rate limiting, caching) for all agent calls

🧰 Custom Middleware & Response Standardization

Standardized Response Envelope

Every single response from every endpoint is automatically wrapped in the same JSON shape via a custom DRF renderer β€” no decorator, no mixin, just one class registered globally:

# settings.py
REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": ("myapp.utils.custom_response.CustomJSONRenderer",),
}
# myapp/utils/custom_response.py
class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        response = renderer_context.get("response")
        success  = response is not None and response.status_code < 400

        envelope = {
            "meta":    data if success else {},
            "message": data.pop("message", "Success") if success else str(data.get("detail", "An error occurred")),
            "error":   not success
        }
        return super().render(envelope, accepted_media_type, renderer_context)

Result: Every response, including DRF validation errors and 404s, returns:

{
  "meta":    { "conversation_id": 42, "ai_reply": "..." },
  "message": "Success",
  "error":   false
}

Custom Exception Handler

DRF's default exception handler is replaced with one that ensures error responses match the same envelope:

# myapp/utils/custom_exception_handler.py
def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        response.data = {
            "meta":    {},
            "message": str(exc),
            "error":   True
        }
    return response

Registered globally:

REST_FRAMEWORK = {
    "EXCEPTION_HANDLER": "myapp.utils.custom_exception_handler.custom_exception_handler",
}

Code Snippet Generator Service

myapp/services/code_snippet_generator.py generates working integration code for any agent in 4 languages (Python, JavaScript, Java, C++) based on the AgentIntegration model config. This powers the /api/integration-snippet/{agent_name}/{language}/ endpoint β€” useful for a developer portal or documentation site.


πŸ”’ Security Implementation

1. Code Injection Prevention in Data Analysis Agent

The Data Analysis agent dynamically generates and executes Python code to analyze datasets. A static pattern blocklist is applied to every piece of generated code before execution:

DANGEROUS_PATTERNS = [
    'import os', 'import sys', 'import subprocess', 'import socket',
    'eval(', 'exec(', '__import__', 'open(', 'file(', 'input(',
    'raw_input(', 'compile(', 'globals()', 'locals()', 'vars(',
    'getattr(', 'setattr(', 'delattr('
]

Code containing any of these patterns is rejected before execution.

2. JWT Refresh Token Blacklisting

Logout genuinely invalidates tokens β€” the refresh token is added to SimpleJWT's blacklist table, preventing reuse even if the token hasn't expired:

class LogoutView(APIView):
    def post(self, request):
        token = RefreshToken(request.data["refresh"])
        token.blacklist()

3. User Data Isolation

No view returns data belonging to another user. Every queryset is scoped to request.user. There is no is_admin bypass path in any view β€” admin access goes through Django's built-in /admin/ panel.

4. SMTP Credential Handling

Email sender credentials (for the Automation agent) are loaded from environment variables, never hardcoded. The EmailConfig dataclass abstracts SMTP server selection by domain, supporting Gmail, Outlook, Yahoo, Zoho, and iCloud out of the box.

5. CORS & CSRF

CORS_ALLOW_ALL_ORIGINS  = True   # ← restrict to specific origins in production
CORS_ALLOW_CREDENTIALS  = True
CSRF_TRUSTED_ORIGINS    = os.getenv("CSRF_TRUSTED_ORIGINS", "").split(",")
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

SECURE_PROXY_SSL_HEADER is required on Render (and most PaaS platforms) because the SSL termination happens at the load balancer, not at Gunicorn.


πŸš€ Deployment & Production Setup

Platform: Render

Configured via render.yaml for one-command deployment.

services:
  - type: web
    name: aurelius-backend
    env: python
    buildCommand: "pip install -r requirements.txt"
    startCommand: "gunicorn myproject.wsgi --bind 0.0.0.0:$PORT --timeout 120"
    envVars:
      - key: SECRET_KEY
        generateValue: true
      - key: DATABASE_URL
        fromDatabase:
          name: neon-db
          property: connectionString

--timeout 120 on Gunicorn is critical β€” AI agent calls can take 30–90 seconds. The default timeout of 30 seconds would kill in-flight requests.

Static Files: Whitenoise

Whitenoise serves compressed static files directly from Gunicorn β€” no S3, no separate CDN needed for this scale:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",  # ← must be second
    ...
]
STORAGES = {
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage"
    }
}

CompressedManifestStaticFilesStorage adds content-hash fingerprints to filenames (e.g. base.a3f9c2.css) so browsers cache aggressively and bust cache on deploy.

Database: PostgreSQL via DATABASE_URL

Settings parse the DATABASE_URL env var manually to support Neon's channel_binding requirements without depending on dj-database-url:

url   = urlparse(DATABASE_URL)
query = parse_qs(url.query)

DATABASES = {
    "default": {
        "ENGINE":       "django.db.backends.postgresql",
        "NAME":         url.path.lstrip("/"),
        "USER":         url.username,
        "PASSWORD":     url.password,
        "HOST":         url.hostname,
        "PORT":         url.port or 5432,
        "CONN_MAX_AGE": 600,
        "OPTIONS":      {"sslmode": query.get("sslmode", ["require"])[0]},
    }
}

CONN_MAX_AGE: 600 enables persistent database connections β€” each Gunicorn worker reuses its DB connection for up to 10 minutes instead of reconnecting on every request.

Python Version

Pinned in runtime.txt:

python-3.12.7

πŸ› οΈ Local Development Setup

# 1. Clone
git clone https://github.com/YOUR_USERNAME/aurelius-backend.git
cd aurelius-backend

# 2. Virtual environment
python -m venv venv && source venv/bin/activate   # or venv\Scripts\activate on Windows

# 3. Install dependencies
pip install -r requirements.txt

# 4. Environment variables
cp .env.example .env
# Edit .env β€” at minimum set DATABASE_URL and GOOGLE_API_KEY

# 5. Database
python manage.py migrate

# 6. (Optional) Create superuser for /admin/
python manage.py createsuperuser

# 7. Run
python manage.py runserver

Minimum required .env for local development:

DEBUG=True
SECRET_KEY=any-local-secret-key
DATABASE_URL=postgres://postgres:password@localhost:5432/aurelius_dev
GOOGLE_API_KEY=your-key     # required for any agent call
TAVILY_API_KEY=your-key     # required for QnA agent

🀝 Collaboration Guide

This section is for contributors and teammates.

Branch Strategy

main          ← production-ready, deployed to Render on merge
dev           ← integration branch, all PRs target this
feature/*     ← individual feature branches (e.g. feature/stock-agent-cache)
fix/*         ← bug fix branches

Adding a New Agent

The system is designed to make adding agents straightforward without touching existing code:

Step 1 β€” Build the CrewAI crew under myapp/ai/agents/your_agent/:

your_agent/
  β”œβ”€β”€ crew.py              ← @CrewBase class with @agent, @task, @crew
  β”œβ”€β”€ your_agent_main.py   ← plain callable function for gateway
  β”œβ”€β”€ your_agent_root.py   ← @tool version for root orchestrator
  └── config/
       β”œβ”€β”€ agents.yaml
       └── tasks.yaml

Step 2 β€” Register in the gateway (myapp/services/ai_gateway.py):

elif agent_type == "your_agent":
    from myapp.ai.agents.your_agent.your_agent_main import run_your_agent
    return run_your_agent(query, file_path)

Step 3 β€” Add permission flag to the APIKey model (myapp/models.py):

allow_your_agent = models.BooleanField(default=False)

Step 4 β€” Register in api_key_helpers.py:

AGENT_FLAG_MAP = {
    ...
    "your_agent": "allow_your_agent",
}

Step 5 β€” Run python manage.py makemigrations && python manage.py migrate

Step 6 β€” Add the root orchestrator tool import in myapp/ai/main.py

That's it. No view changes needed.

Code Style Conventions

  • Views contain only HTTP logic β€” parsing, auth checks, calling the service layer, returning a response
  • Business logic lives in myapp/services/ or inside the agent modules
  • All querysets in ViewSets are filtered to request.user β€” never return unscoped data
  • Use lazy imports inside call_ai_agent() for all new agent integrations
  • Model __str__ methods always return something meaningful (used in admin)

Running Tests

python manage.py test myapp

Test coverage targets (for contributors):

  • All auth flows (signup, login, logout, token refresh)
  • Queryset scoping (user A cannot read user B's conversations)
  • API key permission enforcement
  • Gateway routing (each agent_type routes correctly)

πŸ“‘ API Reference

Base URL: https://aurelius-backend.onrender.com (or http://localhost:8000 locally)

All authenticated endpoints require:

Authorization: Bearer <jwt_access_token_or_api_key>

All responses follow the envelope:

{ "meta": {}, "message": "string", "error": false }

Auth Endpoints

| Method | Path | Auth | Description | |--------|------|------|-------------| | POST | /api/signup/ | None | Register new user | | POST | /api/login/ | None | Login, returns JWT pair | | POST | /api/logout/ | JWT | Blacklists refresh token | | POST | /api/token/refresh/ | None | Exchange refresh β†’ new access token |

Agent Endpoints

| Method | Path | Auth | Description | |--------|------|------|-------------| | POST | /api/root-agent/ | JWT/Key | Auto-route query to best agent | | POST | /api/agent/{name}/ | JWT/Key | Call specific agent directly |

Agent names: qna Β· data Β· auto Β· stock Β· resume Β· sentiment Β· talent Β· rag

Conversation Endpoints

| Method | Path | Auth | Description | |--------|------|------|-------------| | GET | /api/conversation-history/ | JWT | List all user conversations | | GET | /api/conversation/{id}/messages/ | JWT | All messages in a conversation | | POST | /api/new-chat/ | JWT | Start a fresh conversation | | DELETE | /api/conversation/{id}/delete/ | JWT | Delete conversation + messages | | POST | /api/save-chat/ | JWT | Manually save a message |

API Key Endpoints

| Method | Path | Auth | Description | |--------|------|------|-------------| | GET | /api/api-keys/ | JWT | List user's API keys | | POST | /api/api-keys/ | JWT | Generate new scoped API key | | PATCH | /api/api-keys/{id}/ | JWT | Update key permissions | | DELETE | /api/api-keys/{id}/ | JWT | Revoke a key |

Public Endpoints

| Method | Path | Auth | Description | |--------|------|------|-------------| | GET | /api/public-agents/ | None | List featured agents | | GET | /api/public-agents/{id}/ | None | Single agent detail | | GET | /api/integration-snippet/{agent}/{lang}/ | JWT | Get code snippet (python/javascript/java/c++) |


πŸ”‘ Environment Variables

| Variable | Required | Description | |---|---|---| | SECRET_KEY | βœ… | Django secret key | | DATABASE_URL | βœ… | PostgreSQL connection string | | DEBUG | βœ… | True for dev, False for prod | | ALLOWED_HOSTS | βœ… | Comma-separated hostnames | | CSRF_TRUSTED_ORIGINS | βœ… | Comma-separated trusted origins | | GOOGLE_API_KEY | βœ… | Gemini LLM access (all agents) | | TAVILY_API_KEY | βœ… | Web search (QnA agent) | | GITHUB_TOKEN | ⚠️ | GitHub API (Talent agent only) | | ALPHA_VANTAGE_API_KEY | ⚠️ | Stock data (Stock agent only) | | GEMINI_API_KEY | ⚠️ | Alias for GOOGLE_API_KEY in some agents |


πŸ“„ License

MIT License β€” see LICENSE for details.


<div align="center"> Built with Django Β· DRF Β· CrewAI Β· PostgreSQL Β· Deployed on Render </div>

Contract & API

Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.

MissingGITHUB REPOS

Contract coverage

Status

missing

Auth

None

Streaming

No

Data region

Unspecified

Protocol support

OpenClaw: self-declared

Requires: none

Forbidden: none

Guardrails

Operational confidence: low

No positive guardrails captured.
Invocation examples
curl -s "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/snapshot"
curl -s "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/contract"
curl -s "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/trust"

Reliability & Benchmarks

Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.

Missingruntime-metrics

Trust signals

Handshake

UNKNOWN

Confidence

unknown

Attempts 30d

unknown

Fallback rate

unknown

Runtime metrics

Observed P50

unknown

Observed P95

unknown

Rate limit

unknown

Estimated cost

unknown

Do not use if

Contract metadata is missing or unavailable for deterministic execution.
No benchmark suites or observed failure patterns are available.

Media & Demo

Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.

Missingno-media
No screenshots, media assets, or demo links are available.

Related Agents

Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.

Self-declaredprotocol-neighbors
Github ReposUpdated 7h agoRank 70

AionUi

Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

activepieces

AI Agents & MCPs & AI Workflow Automation β€’ (~400 MCP servers for AI agents) β€’ AI Automation / AI Agent with MCPs β€’ AI Workflows & AI Agents β€’ MCPs for AI Agents

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW
Machine Appendix

Contract JSON

{
  "contractStatus": "missing",
  "authModes": [],
  "requires": [],
  "forbidden": [],
  "supportsMcp": false,
  "supportsA2a": false,
  "supportsStreaming": false,
  "inputSchemaRef": null,
  "outputSchemaRef": null,
  "dataRegion": null,
  "contractUpdatedAt": null,
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Invocation Guide

{
  "preferredApi": {
    "snapshotUrl": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/snapshot",
    "contractUrl": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/contract",
    "trustUrl": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/trust"
  },
  "curlExamples": [
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/snapshot\"",
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/contract\"",
    "curl -s \"https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/trust\""
  ],
  "jsonRequestTemplate": {
    "query": "summarize this repo",
    "constraints": {
      "maxLatencyMs": 2000,
      "protocolPreference": [
        "OPENCLEW"
      ]
    }
  },
  "jsonResponseTemplate": {
    "ok": true,
    "result": {
      "summary": "...",
      "confidence": 0.9
    },
    "meta": {
      "source": "GITHUB_REPOS",
      "generatedAt": "2026-10-10T01:53:06.190Z"
    }
  },
  "retryPolicy": {
    "maxAttempts": 3,
    "backoffMs": [
      500,
      1500,
      3500
    ],
    "retryableConditions": [
      "HTTP_429",
      "HTTP_503",
      "NETWORK_TIMEOUT"
    ]
  }
}

Trust JSON

{
  "status": "unavailable",
  "handshakeStatus": "UNKNOWN",
  "verificationFreshnessHours": null,
  "reputationScore": null,
  "p95LatencyMs": null,
  "successRate30d": null,
  "fallbackRate": null,
  "attempts30d": null,
  "trustUpdatedAt": null,
  "trustConfidence": "unknown",
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Capability Matrix

{
  "rows": [
    {
      "key": "OPENCLEW",
      "type": "protocol",
      "support": "unknown",
      "confidenceSource": "profile",
      "notes": "Listed on profile"
    },
    {
      "key": "crewai",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    },
    {
      "key": "multi-agent",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    }
  ],
  "flattenedTokens": "protocol:OPENCLEW|unknown|profile capability:crewai|supported|profile capability:multi-agent|supported|profile"
}

Facts JSON

[
  {
    "factKey": "vendor",
    "category": "vendor",
    "label": "Vendor",
    "value": "Abdullahanwar26",
    "href": "https://github.com/AbdullahAnwar26/-Aurelius-Multi-Agent-AI-Platform",
    "sourceUrl": "https://github.com/AbdullahAnwar26/-Aurelius-Multi-Agent-AI-Platform",
    "sourceType": "profile",
    "confidence": "medium",
    "observedAt": "2026-10-09T21:09:26.402Z",
    "isPublic": true
  },
  {
    "factKey": "protocols",
    "category": "compatibility",
    "label": "Protocol compatibility",
    "value": "OpenClaw",
    "href": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/contract",
    "sourceUrl": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/contract",
    "sourceType": "contract",
    "confidence": "medium",
    "observedAt": "2026-10-09T21:09:26.402Z",
    "isPublic": true
  },
  {
    "factKey": "traction",
    "category": "adoption",
    "label": "Adoption signal",
    "value": "1 GitHub stars",
    "href": "https://github.com/AbdullahAnwar26/-Aurelius-Multi-Agent-AI-Platform",
    "sourceUrl": "https://github.com/AbdullahAnwar26/-Aurelius-Multi-Agent-AI-Platform",
    "sourceType": "profile",
    "confidence": "medium",
    "observedAt": "2026-10-09T21:09:26.402Z",
    "isPublic": true
  },
  {
    "factKey": "docs_crawl",
    "category": "integration",
    "label": "Crawlable docs",
    "value": "6 indexed pages on the official domain",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  },
  {
    "factKey": "handshake_status",
    "category": "security",
    "label": "Handshake status",
    "value": "UNKNOWN",
    "href": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/trust",
    "sourceUrl": "https://www.xpersona.co/api/v1/agents/crewai-abdullahanwar26-aurelius-multi-agent-ai-platform/trust",
    "sourceType": "trust",
    "confidence": "medium",
    "observedAt": null,
    "isPublic": true
  }
]

Change Events JSON

[
  {
    "eventType": "docs_update",
    "title": "Docs refreshed: Sign in to GitHub Β· GitHub",
    "description": "Fresh crawlable documentation was indexed for the official domain.",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  }
]

Sponsored

Ads related to -Aurelius-Multi-Agent-AI-Platform and adjacent AI workflows.