Merge pull request #217 from ggozad/chore/dependencies

Update dependencies
This commit is contained in:
Yiorgis Gozadinos 2026-01-05 12:12:43 +02:00 committed by GitHub
commit dc9a99e8f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 5639 additions and 704 deletions

View file

@ -9,8 +9,8 @@ requires-python = ">=3.12"
dependencies = [ dependencies = [
"haiku.rag-slim", "haiku.rag-slim",
"pydantic-ai-slim[evals,logfire]>=1.27.0", "pydantic-ai-slim[evals,logfire]>=1.39.0",
"datasets>=4.4.1", "datasets>=4.4.2",
"typer>=0.19.2,<0.20.0", "typer>=0.19.2,<0.20.0",
"python-dotenv>=1.2.1", "python-dotenv>=1.2.1",
] ]

View file

@ -41,9 +41,9 @@ uv run haiku-rag-a2a serve --host 0.0.0.0 --port 8080
``` ```
By default, the server uses the same database location as `haiku-rag`: By default, the server uses the same database location as `haiku-rag`:
- Linux: `~/.local/share/haiku.rag` - Linux: `~/.local/share/haiku.rag/haiku.rag.lancedb`
- macOS: `~/Library/Application Support/haiku.rag` - macOS: `~/Library/Application Support/haiku.rag/haiku.rag.lancedb`
- Windows: `C:/Users/<USER>/AppData/Roaming/haiku.rag` - Windows: `C:/Users/<USER>/AppData/Roaming/haiku.rag/haiku.rag.lancedb`
### Interactive Client ### Interactive Client

View file

@ -129,7 +129,7 @@ All operations create artifacts for traceability:
- **search_results**: Created for each `search_documents` tool call - **search_results**: Created for each `search_documents` tool call
- Contains query and array of SearchResult objects (content, score, document_title, document_uri) - Contains query and formatted search results string
- **document**: Created for each `get_full_document` tool call - **document**: Created for each `get_full_document` tool call

View file

@ -9,7 +9,7 @@ from haiku.rag.config import AppConfig, Config
from haiku.rag.utils import get_model from haiku.rag.utils import get_model
from .context import load_message_history, save_message_history from .context import load_message_history, save_message_history
from .models import A2AConfig, AgentDependencies, SearchResult from .models import A2AConfig, AgentDependencies
from .prompts import A2A_SYSTEM_PROMPT from .prompts import A2A_SYSTEM_PROMPT
from .skills import extract_question_from_task, get_agent_skills from .skills import extract_question_from_task, get_agent_skills
from .storage import LRUMemoryStorage from .storage import LRUMemoryStorage
@ -78,24 +78,16 @@ def create_a2a_app(
ctx: RunContext[AgentDependencies], ctx: RunContext[AgentDependencies],
query: str, query: str,
limit: int = 3, limit: int = 3,
) -> list[SearchResult]: ) -> str:
"""Search the knowledge base for relevant documents. """Search the knowledge base for relevant documents.
Returns chunks of text with their relevance scores and document URIs. Returns chunks of text with their relevance scores and document URIs.
Use get_full_document if you need to see the complete document content. Use get_full_document if you need to see the complete document content.
""" """
search_results = await ctx.deps.client.search(query, limit=limit) search_results = await ctx.deps.client.search(query, limit=limit)
expanded_results = await ctx.deps.client.expand_context(search_results) results = await ctx.deps.client.expand_context(search_results)
parts = [r.format_for_agent() for r in results]
return [ return "\n\n".join(parts) if parts else "No results found."
SearchResult(
content=result.content,
score=result.score,
document_title=result.document_title,
document_uri=(result.document_uri or ""),
)
for result in expanded_results
]
@agent.tool @agent.tool
async def get_full_document( async def get_full_document(

View file

@ -11,17 +11,6 @@ class A2AConfig(BaseModel):
) )
class SearchResult(BaseModel):
"""Search result with both title and URI for A2A agent."""
content: str = Field(description="The document text content")
score: float = Field(description="Relevance score (higher is more relevant)")
document_title: str | None = Field(
description="Human-readable document title", default=None
)
document_uri: str = Field(description="Document URI/path for get_full_document")
class AgentDependencies(BaseModel): class AgentDependencies(BaseModel):
"""Dependencies for the A2A conversational agent.""" """Dependencies for the A2A conversational agent."""

View file

@ -3,9 +3,29 @@ A2A_SYSTEM_PROMPT = """You are Haiku.rag, an AI assistant that helps users find
IMPORTANT: You are NOT any person mentioned in the documents. You retrieve and present information about them. IMPORTANT: You are NOT any person mentioned in the documents. You retrieve and present information about them.
Tools available: Tools available:
- search_documents: Query for relevant text chunks (returns SearchResult objects with content, score, document_title, document_uri) - search_documents: Query for relevant text chunks
- get_full_document: Get complete document content by document_uri - get_full_document: Get complete document content by document_uri
The search tool returns results like:
[chunk_abc123] (score: 0.85)
Source: "Document Title" > Section > Subsection
Type: paragraph
Content:
The actual text content here...
[chunk_def456] (score: 0.72)
Source: "Another Document"
Type: table
Content:
| Column 1 | Column 2 |
...
Each result includes:
- chunk_id in brackets and relevance score
- Source: document title and section hierarchy (when available)
- Type: content type like paragraph, table, code, list_item (when available)
- Content: the actual text
Your behavior depends on the operation: Your behavior depends on the operation:
## For direct search requests: ## For direct search requests:

View file

@ -50,10 +50,10 @@ def serve(
config = AppConfig.model_validate(yaml_data) config = AppConfig.model_validate(yaml_data)
if db is None: if db is None:
db = get_default_data_dir() db = get_default_data_dir() / "haiku.rag.lancedb"
if not db.exists(): if not db.exists():
typer.echo(f"Error: Database directory {db} does not exist") typer.echo(f"Error: Database {db} does not exist")
raise typer.Exit(1) raise typer.Exit(1)
logger.info(f"Starting A2A server on {host}:{port}") logger.info(f"Starting A2A server on {host}:{port}")

View file

@ -9,9 +9,9 @@ requires-python = ">=3.12"
keywords = ["RAG", "a2a", "agent", "conversational-ai"] keywords = ["RAG", "a2a", "agent", "conversational-ai"]
dependencies = [ dependencies = [
"haiku.rag>=0.15.0", "haiku.rag>=0.23.1",
"fasta2a>=0.1.0", "fasta2a>=0.6.0",
"pydantic-ai-slim[a2a]>=1.17.0", "pydantic-ai-slim[a2a]>=1.39.0",
"rich>=14.2.0", "rich>=14.2.0",
"httpx>=0.28.1", "httpx>=0.28.1",
] ]

4750
examples/a2a-server/uv.lock Normal file

File diff suppressed because it is too large Load diff

View file

@ -61,12 +61,17 @@ Research assistant powered by [haiku.rag](https://ggozad.github.io/haiku.rag/),
DB_PATH=/path/to/your/existing/haiku_rag.lancedb # If using an existing db. DB_PATH=/path/to/your/existing/haiku_rag.lancedb # If using an existing db.
``` ```
4. **Start the application** 4. **Pull the base image**
```bash
docker pull ghcr.io/ggozad/haiku.rag-slim:latest
```
5. **Start the application**
```bash ```bash
docker compose up --build docker compose up --build
``` ```
5. **Access the interface** 6. **Access the interface**
- Frontend: http://localhost:3000 - Frontend: http://localhost:3000
- Backend health: http://localhost:8000/health - Backend health: http://localhost:8000/health

View file

@ -7,11 +7,10 @@ COPY main.py agent.py ./
# Install additional dependencies for the example # Install additional dependencies for the example
RUN pip install --no-cache-dir \ RUN pip install --no-cache-dir \
starlette>=0.45.2 \ starlette>=0.50.0 \
uvicorn[standard]>=0.34.2 \ uvicorn[standard]>=0.40.0 \
python-dotenv>=1.0.1 python-dotenv>=1.2.1
EXPOSE 8000 EXPOSE 8000
# Run with uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

View file

@ -5,15 +5,15 @@ description = "Haiku.rag research assistant with AG-UI protocol support"
readme = "README.md" readme = "README.md"
requires-python = ">=3.13" requires-python = ">=3.13"
dependencies = [ dependencies = [
"starlette>=0.45.2", "starlette>=0.50.0",
"uvicorn[standard]>=0.34.2", "uvicorn[standard]>=0.40.0",
"pydantic-ai-slim[ag-ui,openai]>=1.17.0", "pydantic-ai-slim[ag-ui,openai]>=1.39.0",
"python-dotenv>=1.0.1", "python-dotenv>=1.2.1",
"haiku.rag-slim[agui]>=0.20.0", "haiku.rag-slim[agui]>=0.23.1",
] ]
[dependency-groups] [dependency-groups]
dev = ["pyright>=1.1.406", "ruff>=0.13.0"] dev = ["pyright>=1.1.407", "ruff>=0.14.10"]
[tool.hatch.metadata] [tool.hatch.metadata]
allow-direct-references = true allow-direct-references = true

View file

@ -37,15 +37,15 @@ dependencies = [
[project.optional-dependencies] [project.optional-dependencies]
# Document processing # Document processing
docling = ["docling==2.65.0", "opencv-python-headless>=4.11.0.86"] docling = ["docling==2.65.0", "opencv-python-headless>=4.12.0.88"]
# Embedding providers # Embedding providers
voyageai = ["voyageai>=0.3.5"] voyageai = ["voyageai>=0.3.7"]
# Rerankers # Rerankers
mxbai = ["mxbai-rerank>=0.1.6"] mxbai = ["mxbai-rerank>=0.1.6"]
cohere = ["cohere>=5.20.0"] cohere = ["cohere>=5.20.1"]
zeroentropy = ["zeroentropy>=0.1.0a7"] zeroentropy = ["zeroentropy>=0.1.0a7"]
# Inspector TUI # Inspector TUI
inspector = ["textual>=6.0.0", "textual-image>=0.8.4"] inspector = ["textual>=7.0.0", "textual-image>=0.8.5"]
# Model providers (delegated to pydantic-ai-slim) # Model providers (delegated to pydantic-ai-slim)
anthropic = ["pydantic-ai-slim[anthropic]"] anthropic = ["pydantic-ai-slim[anthropic]"]
groq = ["pydantic-ai-slim[groq]"] groq = ["pydantic-ai-slim[groq]"]

View file

@ -67,10 +67,10 @@ members = ["haiku_rag_slim", "evaluations"]
[dependency-groups] [dependency-groups]
dev = [ dev = [
"haiku.rag-evals", "haiku.rag-evals",
"datasets>=4.4.1", "datasets>=4.4.2",
"mkdocs>=1.6.1", "mkdocs>=1.6.1",
"mkdocs-material>=9.7.0", "mkdocs-material>=9.7.1",
"pre-commit>=4.5.0", "pre-commit>=4.5.1",
"pydantic-ai-slim[anthropic]", "pydantic-ai-slim[anthropic]",
"pydantic-ai-slim[bedrock]", "pydantic-ai-slim[bedrock]",
"pydantic-ai-slim[google]", "pydantic-ai-slim[google]",
@ -79,8 +79,8 @@ dev = [
"pytest>=9.0.2", "pytest>=9.0.2",
"pytest-asyncio>=1.3.0", "pytest-asyncio>=1.3.0",
"pytest-cov>=7.0.0", "pytest-cov>=7.0.0",
"pytest-recording>=0.13.2", "pytest-recording>=0.13.4",
"ruff>=0.14.8", "ruff>=0.14.10",
] ]
[tool.ruff] [tool.ruff]

1474
uv.lock

File diff suppressed because it is too large Load diff