22import time
33from jupyter_events import EventLogger
44from jupyter_server .extension .application import ExtensionApp
5- from jupyter_server .serverapp import ServerApp
5+
6+ from jupyter_ai_router .handlers import RouteHandler
67
78from .router import MessageRouter
89
910# Check jupyter-collaboration version for compatibility
1011try :
1112 from jupyter_collaboration import __version__ as jupyter_collaboration_version
13+
1214 JCOLLAB_VERSION = int (jupyter_collaboration_version [0 ])
1315 if JCOLLAB_VERSION >= 3 :
1416 from jupyter_server_ydoc .utils import JUPYTER_COLLABORATION_EVENTS_URI
1517 else :
1618 from jupyter_collaboration .utils import JUPYTER_COLLABORATION_EVENTS_URI
1719except ImportError :
1820 # Fallback if jupyter-collaboration is not available
19- JUPYTER_COLLABORATION_EVENTS_URI = "https://events.jupyter.org/jupyter_collaboration"
21+ JUPYTER_COLLABORATION_EVENTS_URI = (
22+ "https://events.jupyter.org/jupyter_collaboration"
23+ )
2024
2125
2226class RouterExtension (ExtensionApp ):
2327 """
2428 Jupyter AI Router Extension
2529 """
26-
30+
2731 name = "jupyter_ai_router"
28- handlers = [] # No HTTP handlers needed
29-
32+ handlers = [
33+ (r"jupyter-ai-router/health/?" , RouteHandler ),
34+ ]
35+
3036 def initialize_settings (self ):
3137 """Initialize router settings and event listeners."""
3238 start = time .time ()
33-
39+
3440 # Create MessageRouter instance
3541 self .router = MessageRouter (parent = self )
36-
42+
3743 # Make router available to other extensions
38- if ' jupyter-ai' not in self .settings :
39- self .settings [' jupyter-ai' ] = {}
40- self .settings [' jupyter-ai' ][ ' router' ] = self .router
41-
44+ if " jupyter-ai" not in self .settings :
45+ self .settings [" jupyter-ai" ] = {}
46+ self .settings [" jupyter-ai" ][ " router" ] = self .router
47+
4248 # Listen for new chat room events
4349 if self .serverapp is not None :
4450 self .event_logger = self .serverapp .web_app .settings ["event_logger" ]
4551 self .event_logger .add_listener (
46- schema_id = JUPYTER_COLLABORATION_EVENTS_URI ,
47- listener = self ._on_chat_event
52+ schema_id = JUPYTER_COLLABORATION_EVENTS_URI , listener = self ._on_chat_event
4853 )
49-
54+
5055 elapsed = time .time () - start
5156 self .log .info (f"Initialized RouterExtension in { elapsed :.2f} s" )
52-
57+
5358 async def _on_chat_event (
5459 self , logger : EventLogger , schema_id : str , data : dict
5560 ) -> None :
@@ -61,24 +66,24 @@ async def _on_chat_event(
6166 and data ["msg" ] == "Room initialized"
6267 ):
6368 return
64-
69+
6570 room_id = data ["room" ]
6671 self .log .info (f"New chat room detected: { room_id } " )
67-
72+
6873 # Get YChat document for the room
6974 ychat = await self ._get_chat (room_id )
7075 if ychat is None :
7176 self .log .error (f"Failed to get YChat for room { room_id } " )
7277 return
73-
78+
7479 # Connect chat to router
7580 self .router .connect_chat (room_id , ychat )
76-
81+
7782 async def _get_chat (self , room_id : str ):
7883 """Get YChat instance for a room ID."""
7984 if not self .serverapp :
8085 return None
81-
86+
8287 try :
8388 if JCOLLAB_VERSION >= 3 :
8489 collaboration = self .serverapp .web_app .settings ["jupyter_server_ydoc" ]
@@ -88,16 +93,16 @@ async def _get_chat(self, room_id: str):
8893 server = collaboration .ywebsocket_server
8994 room = await server .get_room (room_id )
9095 document = room ._document
91-
96+
9297 return document
9398 except Exception as e :
9499 self .log .error (f"Error getting chat document for { room_id } : { e } " )
95100 return None
96-
101+
97102 def stop_extension (self ):
98103 """Clean up router when extension stops."""
99104 try :
100- if hasattr (self , ' router' ):
105+ if hasattr (self , " router" ):
101106 self .router .cleanup ()
102107 except Exception as e :
103- self .log .error (f"Error during router cleanup: { e } " )
108+ self .log .error (f"Error during router cleanup: { e } " )
0 commit comments