Passa al contenuto principale

Architettura

Perché il motore non importa mai direttamente un provider di modelli, uno store o qualunque altra integrazione.

afe segue l'architettura esagonale (porte e adattatori). Il motore sta al centro. Definisce le porte di cui ha bisogno, e ogni integrazione è un adattatore collegato a una porta.

I tre anelli​

AnelloPacchettoContiene
Porteafe-sdkProtocol e messaggi Pydantic. Niente LangChain, niente LangGraph.
Motoreafe-coreManifest, validazione, compilatore, nodi, motore, budget, limiti anti-loop. Usa LangGraph al suo interno. Include adattatori in memoria, così gira da solo.
Adattatoriplugins/*Tutto il resto. Nome di import afe_plugins.<nome>.

Gli adattatori driven sono chiamati dal motore. Gli adattatori driving chiamano il motore.

  • Driven: i provider di modelli, lo store (Postgres) e il suo checkpointer, il broker e il lock (Redis), la memoria e l'embedder, e la sandbox (Docker) e la sua egress.
  • Anche driven: gli harness (basic, deep, acp), la forge (GitHub), il tracer (Langfuse, OTLP), e i tool (MCP, HTTP).
  • Driving: la CLI, e la UI web.

Il motore non importa mai un adattatore. La CI lo verifica con import-linter.

Come gli stessi anelli girano su Kubernetes, senza storage condiviso e con un operator, è nella pagina Kubernetes.

Contratto dei plugin​

Ogni porta è un Protocol con messaggi Pydantic. Un plugin la implementa con uno di due trasporti, con lo stesso contratto:

  • Nel processo: un pacchetto Python registrato con un entry point.
  • Fuori processo: JSON-RPC 2.0, così un plugin si può scrivere in qualsiasi linguaggio. Due trasporti: stdio, in cui il motore avvia il plugin come processo figlio, e HTTP, in cui il plugin gira come servizio a sé.

I plugin dichiarano la versione dell'API per cui sono scritti. Il motore rifiuta una major diversa.

API del motore​

CLI e UI web sono client dell'API del motore, JSON-RPC 2.0 su WebSocket. La stessa connessione avvia, riprende, annulla e mette in pausa i ticket, ne legge lo stato e riceve gli eventi. Non c'è un'API REST separata.

Manifest​

La configurazione è un insieme di manifest in stile Kubernetes, anche più di uno per file.

apiVersion: afe.dev/v1alpha1
kind: Agent
metadata:
name: reviewer
annotations:
afe.dev/description: Checks the text against the request
labels:
team: editorial
spec:
harness: basic
model: cheap
reads:
- text-request
- text
writes: review

Kind: Flow, Agent, Schema, Project, Lane, Script, Model, McpServer, AcpAgent, Plugin.

I modelli Pydantic sono la fonte. Da loro si genera un JSON Schema per la validazione nell'editor, pubblicato nel repository (schemas/) e su questo sito.

Vedi anche​