diff --git a/docs/server.md b/docs/server.md index 68e837be..33109877 100644 --- a/docs/server.md +++ b/docs/server.md @@ -119,7 +119,7 @@ URLs are also supported - the content is fetched and converted to markdown. ## AG-UI Server -The AG-UI server provides HTTP streaming of both research and deep ask graph execution using Server-Sent Events (SSE). +The AG-UI server provides HTTP streaming of research graph execution using Server-Sent Events (SSE). ### Starting the AG-UI Server @@ -131,7 +131,6 @@ This starts an HTTP server (default: http://0.0.0.0:8000) that exposes: - `GET /health` - Health check endpoint - `POST /v1/research/stream` - Research graph streaming endpoint -- `POST /v1/deep-ask/stream` - Deep ask graph streaming endpoint ### Configuration @@ -154,9 +153,9 @@ agui: - **cors_methods**: Allowed HTTP methods (default: `["GET", "POST", "OPTIONS"]`) - **cors_headers**: Allowed headers (default: `["*"]`) -### Using the Streaming Endpoints +### Using the Streaming Endpoint -Both endpoints accept POST requests with the same AG-UI RunAgentInput format and stream AG-UI events. +The endpoint accepts POST requests with AG-UI RunAgentInput format and streams AG-UI events. **Request format:** ```json @@ -171,7 +170,7 @@ Both endpoints accept POST requests with the same AG-UI RunAgentInput format and } ``` -**Research endpoint example:** +**Example:** ```bash curl -X POST http://localhost:8000/v1/research/stream \ -H "Content-Type: application/json" \ @@ -183,24 +182,12 @@ curl -X POST http://localhost:8000/v1/research/stream \ --no-buffer ``` -**Deep ask endpoint example:** -```bash -curl -X POST http://localhost:8000/v1/deep-ask/stream \ - -H "Content-Type: application/json" \ - -d '{ - "state": { - "question": "How does haiku.rag handle document chunking?", - "use_citations": true - } - }' \ - --no-buffer -``` - The `--no-buffer` flag ensures curl displays events as they arrive instead of buffering them. **Note:** The `state` object can include: - `question`: The question to answer (required) -- `use_citations`: Enable citations in deep ask responses (optional, deep ask only) +- `max_iterations`: Maximum research iterations (optional, defaults to config) +- `confidence_threshold`: Confidence threshold for early termination (optional, defaults to config) **Response:** Server-Sent Events stream with AG-UI protocol events: - `RUN_STARTED` - Graph execution started diff --git a/haiku_rag_slim/haiku/rag/graph/agui/server.py b/haiku_rag_slim/haiku/rag/graph/agui/server.py index 1c91ff5d..1ccba823 100644 --- a/haiku_rag_slim/haiku/rag/graph/agui/server.py +++ b/haiku_rag_slim/haiku/rag/graph/agui/server.py @@ -154,14 +154,14 @@ def format_sse_event(event: AGUIEvent) -> str: def create_agui_server( # pragma: no cover config: "AppConfig", db_path: Path | None = None ) -> Starlette: - """Create AG-UI server with both research and deep ask endpoints. + """Create AG-UI server with research endpoint. Args: - config: Application config with research and qa settings + config: Application config with research settings db_path: Optional database path override Returns: - Starlette app with research and deep ask endpoints + Starlette app with research endpoint """ from haiku.rag.client import HaikuRAG from haiku.rag.graph.research.dependencies import ResearchContext @@ -189,7 +189,14 @@ def create_agui_server( # pragma: no cover if messages: question = messages[0].get("content", "") context = ResearchContext(original_question=question) - return ResearchState.from_config(context=context, config=config) + max_iterations = input_state.get("max_iterations") + confidence_threshold = input_state.get("confidence_threshold") + return ResearchState.from_config( + context=context, + config=config, + max_iterations=max_iterations, + confidence_threshold=confidence_threshold, + ) def research_deps_factory(input_config: dict[str, Any]) -> ResearchDeps: effective_db_path = ( @@ -199,33 +206,7 @@ def create_agui_server( # pragma: no cover ) return ResearchDeps(client=get_client(effective_db_path)) - # Deep ask graph factories (uses research graph with quick settings) - def deep_ask_graph_factory() -> Graph: - return build_research_graph(config) - - def deep_ask_state_factory(input_state: dict[str, Any]) -> ResearchState: - question = input_state.get("question", "") - if not question: - messages = input_state.get("messages", []) - if messages: - question = messages[0].get("content", "") - context = ResearchContext(original_question=question) - return ResearchState.from_config( - context=context, - config=config, - max_iterations=2, - confidence_threshold=0.0, - ) - - def deep_ask_deps_factory(input_config: dict[str, Any]) -> ResearchDeps: - effective_db_path = ( - db_path - or input_config.get("db_path") - or config.storage.data_dir / "haiku.rag.lancedb" - ) - return ResearchDeps(client=get_client(effective_db_path)) - - # Create event stream functions for each graph type + # Create event stream function async def research_event_stream( input_data: RunAgentInput, ) -> AsyncIterator[str]: @@ -238,18 +219,6 @@ def create_agui_server( # pragma: no cover event_data = format_sse_event(event) yield event_data - async def deep_ask_event_stream( - input_data: RunAgentInput, - ) -> AsyncIterator[str]: - """Generate SSE event stream from deep ask graph execution.""" - graph = deep_ask_graph_factory() - initial_state = deep_ask_state_factory(input_data.state) - deps = deep_ask_deps_factory(input_data.config) - - async for event in stream_graph(graph, initial_state, deps): - event_data = format_sse_event(event) - yield event_data - # Endpoint handlers async def stream_research(request: Request) -> StreamingResponse: """Research graph streaming endpoint.""" @@ -266,21 +235,6 @@ def create_agui_server( # pragma: no cover }, ) - async def stream_deep_ask(request: Request) -> StreamingResponse: - """Deep ask graph streaming endpoint.""" - body = await request.json() - input_data = RunAgentInput(**body) - - return StreamingResponse( - deep_ask_event_stream(input_data), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", - }, - ) - async def health_check(_: Request) -> JSONResponse: """Health check endpoint.""" return JSONResponse({"status": "healthy"}) @@ -288,7 +242,6 @@ def create_agui_server( # pragma: no cover # Define routes routes = [ Route("/v1/research/stream", stream_research, methods=["POST"]), - Route("/v1/deep-ask/stream", stream_deep_ask, methods=["POST"]), Route("/health", health_check, methods=["GET"]), ]