diff --git a/CHANGELOG.md b/CHANGELOG.md index 54dfc4aa..712ab0c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,26 @@ # Changelog ## [Unreleased] +### Added + +- **RAG skill** (`haiku.rag.skills.rag`): haiku.skills integration with search, list_documents, get_document, ask, analyze, and research tools plus managed `RAGState` +- **`HaikuRAG.research()`**: Client method for multi-agent research +- **haiku.skills entry point**: `rag = "haiku.rag.skills.rag:create_skill"` + +### Changed + +- **Chat TUI**: Rebuilt on RAG skill + haiku.skills `SkillToolset` +- **Web app backend**: Rebuilt on RAG skill + `AGUIAdapter` +- **Toolsets simplified**: Removed `ToolContext`, `SessionState`, `AgentDeps`, `Toolkit`; kept core `FunctionToolset` factories +- **Research graph**: Removed `session_context` and conversational output mode + +### Removed + +- **`agents/chat/`**: Entire chat agent module (replaced by RAG skill) +- **`--deep` flag**: Removed from `ask` CLI (use `research` command instead) +- **`--context`/`--context-file`**: Removed from `ask` CLI +- **`tools/` state machinery**: `ToolContext`, `ToolContextCache`, `SessionState`, `AgentDeps`, `Toolkit`, etc. + ## [0.30.2] - 2026-02-19 ### Fixed diff --git a/README.md b/README.md index 8a63aeac..1f73b496 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,6 @@ haiku-rag search "attention mechanism" # Ask questions with citations haiku-rag ask "What datasets were used for evaluation?" --cite -# Deep QA — decomposes complex questions into sub-queries -haiku-rag ask "How does the proposed method compare to the baseline on MMLU?" --deep - # Research mode — iterative planning and search haiku-rag research "What are the limitations of the approach?" diff --git a/docs/agents/index.md b/docs/agents/index.md index cbc81edb..84f40134 100644 --- a/docs/agents/index.md +++ b/docs/agents/index.md @@ -64,8 +64,7 @@ stateDiagram-v2 synthesize --> [*] note right of plan_next - Receives session_context as background - and prior_answers from conversation history. + Uses prior_answers from previous iterations. Uses a different prompt when prior answers exist. end note ``` @@ -73,8 +72,7 @@ stateDiagram-v2 The graph receives a `ResearchContext` containing: - `original_question` — the user's question -- `session_context` — summary of conversation history (injected as `` XML) -- `qa_responses` — prior answers from semantic matching or previous iterations (injected as `` XML) +- `qa_responses` — prior answers from previous iterations (injected as `` XML) When prior answers are provided, the planner uses a context-aware prompt that evaluates whether existing evidence is sufficient. If it is, the planner marks `is_complete=True` and the graph skips directly to synthesis without any searches. @@ -88,7 +86,6 @@ When prior answers are provided, the planner uses a context-aware prompt that ev - Each iteration: planner evaluates context → proposes one question → search answers it → loop back - Planner can decompose complex questions (e.g., "benefits and drawbacks" → start with "benefits") -- Session context resolves ambiguous references and informs planning - Prior answers let the planner skip redundant searches - Loop terminates when planner marks `is_complete=True` or `max_iterations` is reached diff --git a/docs/architecture.md b/docs/architecture.md index aa3b1f1d..4c9ed1ff 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -24,7 +24,7 @@ flowchart TB subgraph Agents["Agent Layer"] QA[QA Agent] - Chat[Chat Agent] + Skill[RAG Skill] Research[Research Graph] RLM[RLM Agent] end @@ -98,7 +98,7 @@ flowchart LR ### Agent Layer -Four agent types for different use cases: +Three agent types and a RAG skill for different use cases: ```mermaid flowchart TB @@ -107,12 +107,12 @@ flowchart TB S1 --> A1[Answer] end - subgraph Chat["Chat Agent"] + subgraph Skill["RAG Skill"] Q2[Question] --> Tools[Tool Selection] - Tools --> S2[Search / Ask / Get] + Tools --> S2[Search / Ask / Analyze] S2 --> A2[Answer] - A2 --> History[Session History] - History -.-> Q2 + A2 --> State[RAG State] + State -.-> Q2 end subgraph Research["Research Graph"] @@ -138,17 +138,16 @@ flowchart TB - Expands context around results - Generates answer with optional citations -**Chat Agent** - Multi-turn conversational RAG: +**RAG Skill** - Multi-turn conversational RAG via [haiku.skills](https://github.com/ggozad/haiku.skills): -- Composed from reusable [toolsets](tools.md) (search, documents, QA, analysis) -- Maintains session history with prior answer recall -- Background summarization for context continuity -- Session-level document filtering +- Bundles search, list_documents, get_document, ask, analyze, and research tools +- Managed `RAGState` for session state (citations, QA history, document filters) +- Integrates with any pydantic-ai agent via `SkillToolset` +- Powers both the Chat TUI and web application **Research Graph** - Iterative research workflow: - Proposes one question at a time, evaluates the answer, then decides whether to continue -- Session context resolves ambiguous references - Prior answers let the planner skip redundant searches - Synthesizes structured report diff --git a/docs/benchmarks.md b/docs/benchmarks.md index b1175d03..59bc248e 100644 --- a/docs/benchmarks.md +++ b/docs/benchmarks.md @@ -60,27 +60,9 @@ evaluations run repliqa --config /path/to/haiku.rag.yaml --db /path/to/custom.la - `--skip-qa` - Skip QA benchmark - `--limit N` - Limit number of test cases - `--name NAME` - Override the evaluation name -- `--deep` - Use deep QA mode (multi-step reasoning with research graph) If no config file is specified, the script searches standard locations: `./haiku.rag.yaml`, user config directory, then falls back to defaults. -### Deep QA Mode - -The `--deep` flag enables multi-step reasoning using the research graph instead of the simple QA agent: - -```bash -evaluations run repliqa --skip-db --deep -``` - -In deep mode: - -- Questions are decomposed into sub-questions by a planning agent -- Each sub-question is answered by searching the knowledge base -- A synthesis agent combines findings into a comprehensive answer -- The graph runs for up to 2 iterations with no early exit (confidence threshold disabled) - -This matches the behavior of `haiku-rag ask --deep` in the CLI. Deep mode typically produces more thorough answers but requires more LLM calls per question. - ## Methodology ### Retrieval Metrics diff --git a/docs/cli.md b/docs/cli.md index 853ec828..1f09e93e 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -143,31 +143,17 @@ Ask questions with citations showing source documents: haiku-rag ask "Who is the author of haiku.rag?" --cite ``` -Use deep QA for complex questions (multi-agent decomposition): -```bash -haiku-rag ask "What are the main features and architecture of haiku.rag?" --deep --cite -``` - Filter to specific documents: ```bash haiku-rag ask "What are the main findings?" --filter "uri LIKE '%paper%'" ``` -Provide background context for the question: -```bash -haiku-rag ask "What are the protocols?" --context "Focus on security best practices" -haiku-rag ask "Summarize the findings" --context-file background.txt -``` - The QA agent searches your documents for relevant information and provides a comprehensive answer. When available, citations use the document title; otherwise they fall back to the URI. Flags: - `--cite`: Include citations showing which documents were used -- `--deep`: Decompose the question into sub-questions answered in parallel before synthesizing a final answer - `--filter` / `-f`: Restrict searches to documents matching the filter (see [Filtering Search Results](python.md#filtering-search-results)) -- `--context`: Background context for the question (passed to the agent as system context) -- `--context-file`: Path to a file containing background context ## Chat @@ -242,18 +228,9 @@ Filter to specific documents: haiku-rag research "What are the key findings?" --filter "uri LIKE '%paper%'" ``` -Provide background context for the research: - -```bash -haiku-rag research "What are the safety protocols?" --context "Industrial manufacturing context" -haiku-rag research "Analyze the methodology" --context-file research-background.txt -``` - Flags: - `--filter` / `-f`: SQL WHERE clause to filter documents (see [Filtering Search Results](python.md#filtering-search-results)) -- `--context`: Background context for the research -- `--context-file`: Path to a file containing background context Research parameters like `max_iterations` and `max_concurrency` are configured in your [configuration file](configuration/index.md) under the `research` section. diff --git a/docs/configuration/qa-research.md b/docs/configuration/qa-research.md index 0fee4bb3..0ebe931e 100644 --- a/docs/configuration/qa-research.md +++ b/docs/configuration/qa-research.md @@ -40,8 +40,6 @@ qa: - **max_iterations**: Maximum search iterations (default: 2) - **max_concurrency**: Number of concurrent search operations (default: 1) -Deep QA mode (`haiku-rag ask --deep`) uses the research graph with a single iteration for quick, focused answers. - ## Research Configuration Configure the multi-agent research workflow: diff --git a/haiku_rag_slim/haiku/rag/agents/research/dependencies.py b/haiku_rag_slim/haiku/rag/agents/research/dependencies.py index 8a112d2a..dd47ac21 100644 --- a/haiku_rag_slim/haiku/rag/agents/research/dependencies.py +++ b/haiku_rag_slim/haiku/rag/agents/research/dependencies.py @@ -16,10 +16,6 @@ class ResearchContext(BaseModel): qa_responses: list[Any] = Field( default_factory=list, description="Structured QA pairs used during research" ) - session_context: str | None = Field( - default=None, - description="Session context from previous Q&A summarization", - ) def add_qa_response(self, qa: "SearchAnswer") -> None: """Add a structured QA response.""" diff --git a/haiku_rag_slim/haiku/rag/agents/research/graph.py b/haiku_rag_slim/haiku/rag/agents/research/graph.py index 3734dfde..e445622e 100644 --- a/haiku_rag_slim/haiku/rag/agents/research/graph.py +++ b/haiku_rag_slim/haiku/rag/agents/research/graph.py @@ -27,9 +27,6 @@ def format_context_for_prompt(context: ResearchContext) -> str: """Format the research context as XML for prompts.""" context_data: dict[str, object] = {} - if context.session_context: - context_data["background"] = context.session_context - context_data["question"] = context.original_question if context.qa_responses: diff --git a/haiku_rag_slim/haiku/rag/agents/research/prompts.py b/haiku_rag_slim/haiku/rag/agents/research/prompts.py index fae407e2..8cfd0dac 100644 --- a/haiku_rag_slim/haiku/rag/agents/research/prompts.py +++ b/haiku_rag_slim/haiku/rag/agents/research/prompts.py @@ -1,7 +1,5 @@ ITERATIVE_PLAN_PROMPT = """You are the research orchestrator planning the investigation. -If a section is provided, use it to understand the conversation context. - Your task: 1. Analyze the original question 2. Propose the first question to investigate @@ -23,7 +21,6 @@ The question must be standalone and self-contained: ITERATIVE_PLAN_PROMPT_WITH_CONTEXT = """You are the research orchestrator evaluating gathered evidence. You have access to context that may include: -- : Domain context for the conversation - : Previous Q&A pairs with confidence scores Your task: diff --git a/tests/agents/research/test_research_graph.py b/tests/agents/research/test_research_graph.py index dc7750ba..9a989653 100644 --- a/tests/agents/research/test_research_graph.py +++ b/tests/agents/research/test_research_graph.py @@ -89,22 +89,6 @@ def test_format_context_for_prompt_basic(): assert "What is X?" in result -def test_format_context_for_prompt_with_session_context(): - """Test format_context_for_prompt includes session_context as background.""" - from haiku.rag.agents.research.dependencies import ResearchContext - from haiku.rag.agents.research.graph import format_context_for_prompt - - context = ResearchContext( - original_question="What is Y?", - session_context="Previous discussion about topic Z.", - ) - result = format_context_for_prompt(context) - - assert "" in result - assert "Previous discussion" in result - assert "What is Y?" in result - - def test_format_context_for_prompt_with_prior_answers(): """Test format_context_for_prompt includes prior_answers.""" from haiku.rag.agents.research.dependencies import ResearchContext