7.1 KiB
7.1 KiB
ASF Architecture Overview
Metafora "Ufficio Postale di ASF":
Ogni informazione che entra o esce da ASF è una busta (Artifact). Le Relazioni sono gli indirizzi che legano una busta all'altra. RabbitMQ è il carteggio (posta interna), MongoDB l'archivio, l'AI Gateway è l'ufficio analisti che legge le buste e risponde, il Context Engine è l'impiegato che raccoglie il fascicolo completo prima di passarlo a un analista.
Logical Diagram (ASCII)
┌─────────────────────────────────────────────┐
│ asf-web (Next.js) │
│ Shell · Overview · Context Explorer · │
│ Traceability (React Flow) · Ask ASF chat │
└────────────────────┬────────────────────────┘
│ HTTPS /api/v1
┌────────────────────▼────────────────────────┐
│ asf-core (FastAPI REST API) │
│ Orgs · Projects · Artifacts · Relations · │
│ Jobs CRUD · Audit · Auth boundary │
└──────┬───────────────┬───────────┬───────────┘
│ │ │
(writes/reads)│ (events) │ (queries)│
▼ ▼ ▼
┌─────────────┐ ┌────────────┐ ┌───────────────┐
│ MongoDB │ │ RabbitMQ │ │ asf-context │
│ (archivio) │ │ (carteggio)│ │ (fascicolatore)│
└─────────────┘ └──────┬─────┘ └───────┬───────┘
│ │
(jobs) │ │ assemble context
▼ │
┌───────────────────┐ │
│ asf-worker │ │
│ (addetti alle poste)│ │
│ consumers: │ │
│ ai.*, indexing, │ │
│ testing, devops │ │
└─────────┬─────────┘ │
│ │
(inference reqs) │
▼ │
┌───────────────────┐ │
│ asf-ai │◄──────┘
│ AI Gateway │
│ (ufficio analisti)│
│ ├─ MockProvider │
│ ├─ model routing │
│ └─ usage/cost │
└─────────┬─────────┘
│
▼
┌───────────────────────────────┐
│ Provider adapters (future): │
│ · NVIDIA DGX / OpenAI compat │
│ · External providers │
└───────────────────────────────┘
┌────────────────────────────────────────────────────────────────┐
│ Shared packages (imported by all services): │
│ · asf-domain → Pydantic models (Artifact, Job, Org, ...) │
│ · asf-events → Event schemas (RabbitMQ payload contracts) │
│ · asf-connectors → Integration interfaces (GitHub, Jira, ...) │
└────────────────────────────────────────────────────────────────┘
┌─────────────────────────────┐
│ Supporting infrastructure │
│ · Redis (cache / locks) │
│ · MinIO (large blobs) │
└─────────────────────────────┘
Data Flow — end-to-end (Example: "Crea un Requirement")
- User POST
/api/v1/projects/{p_id}/artifacts(type=requirement) via asf-web → asf-core. - asf-core validates tenant context, writes to MongoDB
artifacts, emitsartifact.createdevent to RabbitMQ, returns201. - asf-worker picks up
artifact.createdfrom the events exchange. - Worker optionally submits
ai.inference.requestedfor "enrich requirement" toasf.ai.backgroundqueue. - Another worker calls asf-ai gateway → provider → returns
enrichment. Updates
artifact.metadata.enriched = true, writes anartifact.updatedevent, records anAIExecutionin MongoDB. - UI polls / SSE receives update; Context Explorer now shows both the Artifact AND its enrichment trace.
Tenancy Boundary
Organization (tenant_id == organization_id in bootstrap)
│
├── Team[]
└── Project[]
└── Artifact[] + ArtifactRelationship[] + Job[]
Rule: Ogni query su dati tenant-owned è filtrata da tenant_id.
Il tenant_id non viene mai accettato dal client direttamente ma
deriva dal contesto di autenticazione validato.
Extensibility Points
| Concern | Where | Future Hook |
|---|---|---|
| Semantic search / RAG | asf-context | Vector DB (pgvector / Qdrant) |
| Graph traversal | asf-context (Mongo $lookup) | Graph DB projection |
| Auth / SSO | asf-core middleware | OIDC / SAML adapters |
| Billing / metering | asf-core + asf-ai usage | Subscription service |
| External providers | asf-connectors + AI Gateway | Per-system adapter |