2026-08-04 15:06:23 +02:00
""" GraphRAG plugin — entity relationship graph with BFS traversal and search provider. """
from __future__ import annotations
from app . plugins . base import BasePlugin
2026-09-15 08:25:21 +02:00
from app . plugins . manifest import (
FrontendMenuItem ,
FrontendPageRoute ,
MiniAppContribution ,
PluginManifest ,
PluginRouteDef ,
)
2026-08-04 15:06:23 +02:00
class GraphRAGPlugin ( BasePlugin ) :
""" GraphRAG plugin for entity relationship graph with BFS traversal. """
manifest = PluginManifest (
name = " graph_rag " ,
version = " 1.0.0 " ,
display_name = " GraphRAG " ,
description = " Entity relationship graph with BFS traversal and unified search integration. Stores typed relationships between entities for knowledge graph exploration. " ,
dependencies = [ " unified_search " ] ,
routes = [
PluginRouteDef (
path = " /api/v1/graph " ,
module = " app.plugins.builtins.graph_rag.routes " ,
router_attr = " router " ,
) ,
] ,
events = [ ] ,
migrations = [ " 0001_initial.sql " ] ,
2026-08-31 00:10:31 +02:00
miniapps = [
MiniAppContribution (
app_id = " graph_overview " ,
name = " Wissens-Graph " ,
icon = " Share2 " ,
description = " Beziehungsübersicht des Knowledge-Graphs. " ,
permission = " graph:read " ,
settings_schema = {
" fields " : [
{ " name " : " max_items " , " label " : " Max. Beziehungen " , " type " : " number " , " default " : 6 } ,
]
} ,
col_span = 2 ,
row_span = 1 ,
hosts = [ " chat " , " dashboard " , " window " ] ,
component = " @/components/dashboard/GraphOverviewWidget " ,
order = 90 ,
) ,
] ,
2026-09-15 08:25:21 +02:00
menu_items = [
FrontendMenuItem (
label_key = " nav.graphRag " ,
label = " Wissens-Graph " ,
path = " /graph-rag " ,
icon = " Share2 " ,
order = 87 ,
permission = " graph:read " ,
) ,
] ,
page_routes = [
FrontendPageRoute (
path = " /graph-rag " ,
component = " @/pages/GraphRag " ,
protected = True ,
permission = " graph:read " ,
) ,
] ,
2026-08-04 15:06:23 +02:00
permissions = [
" graph:read " ,
" graph:write " ,
] ,
is_core = True ,
author = " LeoCRM Team " ,
min_app_version = " 1.0.0 " ,
contract_version = " 1.0.0 " ,
)
2026-08-16 01:17:18 +02:00
def get_entity_models ( self ) - > dict [ str , type ] :
from app . plugins . builtins . graph_rag . models import EntityRelationship
return { " entity_relationship " : EntityRelationship }
2026-08-04 15:06:23 +02:00
async def on_activate ( self , db , service_container , event_bus ) - > None :
""" Activate plugin: register GraphRAG search provider. """
2026-08-23 19:24:12 +02:00
# Base class first (event subscriptions etc.), then own registrations
# so a failure in our code cannot leave the base half-initialized (ARCH-037).
await super ( ) . on_activate ( db , service_container , event_bus )
2026-08-04 15:06:23 +02:00
from app . plugins . builtins . graph_rag . provider import GraphRAGSearchProvider
2026-08-06 13:23:58 +02:00
from app . plugins . builtins . unified_search . contracts import get_search_registry
2026-08-04 15:06:23 +02:00
registry = get_search_registry ( )
try :
registry . register ( GraphRAGSearchProvider ( ) )
except Exception :
import logging
logging . getLogger ( __name__ ) . exception ( " Failed to register GraphRAGSearchProvider " )
async def on_deactivate ( self , db , service_container , event_bus ) - > None :
""" Deactivate plugin: unregister search provider and contract. """
2026-08-06 13:23:58 +02:00
from app . plugins . builtins . unified_search . contracts import get_search_registry
2026-08-04 15:06:23 +02:00
get_search_registry ( ) . unregister ( " graph_relationship " )
from app . plugins . builtins . contracts import get_contract_registry
get_contract_registry ( ) . unregister ( self . manifest . name )
await super ( ) . on_deactivate ( db , service_container , event_bus )