7.3 KiB
Technical Design — MiroFish
Graph Backend
MiroFish suporta dos backends de knowledge graph, seleccionable via GRAPH_BACKEND al .env:
| Valor | Backend | Requisits |
|---|---|---|
zep (per defecte) |
Zep Cloud (gestionat) | ZEP_API_KEY |
graphiti |
Graphiti + Neo4j (self-hosted) | NEO4J_PASSWORD + variables LLM |
La selecció es fa via la factoria backend/app/graph/factory.py — un singleton que instancia ZepBackend o GraphitiBackend en funció de GRAPH_BACKEND. La validació de configuració és condicionada: si GRAPH_BACKEND=graphiti, ZEP_API_KEY no és necessari i viceversa.
Commutació entre backends
Només cal canviar al .env:
# Per usar Zep Cloud:
GRAPH_BACKEND=zep
ZEP_API_KEY=z_...
# Per usar Graphiti + Neo4j:
GRAPH_BACKEND=graphiti
NEO4J_URI=bolt://<host>:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=<contrasenya>
Models LLM
El projecte usa fins a quatre grups de variables LLM, cadascun per a un ús diferent. Totes les variables LLM_SMALL_* i LLM_EMBED_* fan fallback als valors LLM_* si no s'estableixen.
Variables de configuració
# ── Model principal (generatiu, potent) ──────────────────────────────────────
LLM_API_KEY=...
LLM_BASE_URL=https://<recurs>.cognitiveservices.azure.com/openai/deployments/<model>/chat/completions?api-version=2024-05-01-preview
LLM_MODEL_NAME=gpt-5.4
# ── Model petit/ràpid (lightweight, econòmic) ────────────────────────────────
# Fallback a LLM_* si no definit
LLM_SMALL_API_KEY=...
LLM_SMALL_BASE_URL=https://<recurs>.cognitiveservices.azure.com/openai/deployments/<small-model>/chat/completions?api-version=2024-05-01-preview
LLM_SMALL_MODEL_NAME=gpt-5-mini
# ── Model d'embedding (vectorització) ────────────────────────────────────────
# Fallback a LLM_* si no definit. Requerit per Graphiti.
LLM_EMBED_API_KEY=...
LLM_EMBED_BASE_URL=https://<recurs>.services.ai.azure.com/openai/deployments/<embed-model>/embeddings?api-version=2024-05-01-preview
LLM_EMBED_MODEL_NAME=text-embedding-3-large
# ── Model boost (simulació OASIS, opcional) ──────────────────────────────────
# Fallback a LLM_* si no definit
LLM_BOOST_API_KEY=...
LLM_BOOST_BASE_URL=...
LLM_BOOST_MODEL_NAME=gpt-5.4
Mapa d'usos per operació
| Grup de variables | Component | Operació |
|---|---|---|
LLM_* |
OntologyGenerator |
Pas 1 — Anàlisi del document i generació d'ontologia (tipus d'entitat i relació) |
LLM_* |
GraphBuilderService (mode Zep) |
Pas 2 — Extracció d'entitats i relacions del text via Zep SDK |
LLM_* |
Graphiti OpenAIClient (mode graphiti) |
Pas 2 — Extracció d'entitats i relacions del text via graphiti-core |
LLM_* |
OasisProfileGenerator |
Pas 2 — Generació de perfils d'agents OASIS a partir del graf |
LLM_* |
ReportAgent |
Pas 4 — Generació de l'informe analític final (multi-turn, tool use) |
LLM_SMALL_* |
Graphiti OpenAIRerankerClient |
Pas 2 — Reranking de resultats de cerca al graf (mode graphiti) |
LLM_SMALL_* |
Graphiti ModelSize.small |
Pas 2 — Tasques lleugeres internes de graphiti (extracció simplificada) |
LLM_EMBED_* |
Graphiti OpenAIEmbedder |
Pas 2 — Generació de vectors d'embedding per a indexació i cerca semàntica a Neo4j (mode graphiti) |
LLM_BOOST_* |
SimulationRunner / run_parallel_simulation.py |
Pas 3 — Decisions d'acció de cada agent durant la simulació OASIS |
API endpoint usada per cada component
Tots els components del projecte usen chat.completions o embeddings — mai responses (beta).
| Component | API endpoint | Nota |
|---|---|---|
LLMClient (wrapper projecte) |
chat.completions.create |
Síncrona (OpenAI) |
OntologyGenerator |
chat.completions.create |
Via LLMClient |
OasisProfileGenerator |
chat.completions.create |
Client intern |
SimulationConfigGenerator |
chat.completions.create |
Client intern |
ReportAgent |
chat.completions.create |
Via LLMClient |
Graphiti OpenAIGenericClient |
chat.completions.create |
AsyncOpenAI, injectable |
Graphiti OpenAIRerankerClient |
chat.completions.create |
Amb logprobs=True per scoring |
Graphiti OpenAIEmbedder |
embeddings.create |
AsyncOpenAI, injectable |
| OASIS/CAMEL-AI | chat.completions.create |
Via ModelFactory (CAMEL abstraction) |
Nota: graphiti-core inclou també un
OpenAIClientque usaresponses.parse(API beta d'OpenAI). MiroFish no l'usa — configuraOpenAIGenericClientque sempre usachat.completions, compatible amb Azure i qualsevol API OpenAI-compatible.
Notes sobre Azure OpenAI
LLM_BASE_URLaccepta la URL completa d'Azure (/chat/completions?api-version=...). El codi la processa automàticament: extreu elapi-versioncom adefault_queryi retalla el sufix per al SDK.- El mateix tractament s'aplica a
LLM_EMBED_BASE_URL(sufix/embeddings?api-version=...). LLM_SMALL_BASE_URLaccepta directament la URL base d'Azure AI Foundry (services.ai.azure.com/api/projects/<proj>/openai/v1/) sense sufix niapi-version.LLM_EMBED_BASE_URLpot usar el dominiservices.ai.azure.comocognitiveservices.azure.com.
Recomanació de models (Azure OpenAI)
| Grup | Model recomanat | Motiu |
|---|---|---|
LLM_* |
gpt-5.4 |
Raonament complex: ontologia, extracció de graf, informes |
LLM_SMALL_* |
gpt-5-mini |
Tasques lleugeres i econòmiques: reranking, classificació |
LLM_EMBED_* |
text-embedding-3-large |
Màxima qualitat d'embedding semàntic |
LLM_BOOST_* |
gpt-5.4 o gpt-5-mini |
Simulació: moltes crides curtes, prioritzar velocitat/cost |
Pipeline de 5 passos
Pas 1 — Graph Build (ontologia)
└─ OntologyGenerator → LLM_*
Pas 2 — Graph Build (construcció)
├─ mode zep: GraphBuilderService + Zep SDK → LLM_*
└─ mode graphiti: GraphitiBackend
├─ extracció: OpenAIGenericClient → LLM_* (chat.completions)
├─ reranking: OpenAIRerankerClient → LLM_SMALL_*
└─ embedding: OpenAIEmbedder → LLM_EMBED_*
Pas 3 — Simulació OASIS
└─ SimulationRunner / run_parallel_simulation.py → LLM_BOOST_* (o LLM_*)
Pas 4 — Informe
└─ ReportAgent (multi-turn + tool use) → LLM_*
Pas 5 — Interacció live
└─ Chat amb agents simulats → LLM_*
Internacionalització (i18n)
- Fitxers de traducció:
/locales/{ca,en,es,zh}.json— compartits per frontend i backend. - Instruccions de llengua per al LLM:
/locales/languages.json(claullmInstruction). - El frontend injecta el locale actual via header
Accept-Languagea cada petició API. - El backend detecta el locale a
backend/app/utils/locale.py:get_locale()i l'usa per:- Traduccions de missatges d'error (
t()) - Instruccions d'idioma als prompts LLM (
get_language_instruction())
- Traduccions de missatges d'error (
- L'ontologia generada (descripcions, exemples,
analysis_summary) sortirà en l'idioma de la UI. Els noms de tipus d'entitat i relació seguiran PascalCase/UPPER_SNAKE_CASE en l'idioma de la UI (p.ex.AgenciaGovern,TREBALLA_PERen català).