baveshraam's picture
FIX: SurrealDB 2.0 migration syntax and Frontend/CORS link
f871fed
# ContextBuilder
A flexible and generic ContextBuilder class for the Open Notebook project that can handle any parameters and build context from sources, notebooks, insights, and notes.
## Features
- **Flexible Parameters**: Accepts any parameters via `**kwargs` for future extensibility
- **Priority-based Management**: Automatic prioritization and sorting of context items
- **Token Counting**: Built-in token counting and truncation to fit limits
- **Deduplication**: Automatic removal of duplicate items based on ID
- **Type-based Grouping**: Separates sources, notes, and insights in output
- **Async Support**: Fully async for database operations
## Basic Usage
```python
from open_notebook.utils.context_builder import ContextBuilder, ContextConfig
# Simple notebook context
builder = ContextBuilder(notebook_id="notebook:123")
context = await builder.build()
# Single source with insights
builder = ContextBuilder(
source_id="source:456",
include_insights=True,
max_tokens=2000
)
context = await builder.build()
```
## Convenience Functions
```python
from open_notebook.utils.context_builder import (
build_notebook_context,
build_source_context,
build_mixed_context
)
# Build notebook context
context = await build_notebook_context(
notebook_id="notebook:123",
max_tokens=5000
)
# Build single source context
context = await build_source_context(
source_id="source:456",
include_insights=True
)
# Build mixed context
context = await build_mixed_context(
source_ids=["source:1", "source:2"],
note_ids=["note:1", "note:2"],
max_tokens=3000
)
```
## Advanced Configuration
```python
from open_notebook.utils.context_builder import ContextConfig
# Custom configuration
config = ContextConfig(
sources={
"source:doc1": "insights",
"source:doc2": "full content",
"source:doc3": "not in" # Exclude
},
notes={
"note:summary": "full content",
"note:draft": "not in" # Exclude
},
include_insights=True,
max_tokens=3000,
priority_weights={
"source": 120, # Higher priority
"note": 80, # Medium priority
"insight": 100 # High priority
}
)
builder = ContextBuilder(
notebook_id="notebook:project",
context_config=config
)
context = await builder.build()
```
## Programmatic Item Management
```python
from open_notebook.utils.context_builder import ContextItem
builder = ContextBuilder()
# Add custom items
item = ContextItem(
id="source:important",
type="source",
content={"title": "Key Document", "summary": "..."},
priority=150 # Very high priority
)
builder.add_item(item)
# Apply management operations
builder.remove_duplicates()
builder.prioritize()
builder.truncate_to_fit(1000)
context = builder._format_response()
```
## Flexible Parameters
The ContextBuilder accepts any parameters via `**kwargs`, making it extensible for future features:
```python
builder = ContextBuilder(
notebook_id="notebook:123",
include_insights=True,
max_tokens=2000,
# Custom parameters for future extensions
user_id="user:456",
custom_filter="advanced",
experimental_feature=True
)
# Access custom parameters
user_id = builder.params.get('user_id')
```
## Output Format
The ContextBuilder returns a structured response:
```python
{
"sources": [...], # List of source contexts
"notes": [...], # List of note contexts
"insights": [...], # List of insight contexts
"total_tokens": 1234, # Total token count
"total_items": 10, # Total number of items
"notebook_id": "notebook:123", # If provided
"metadata": {
"source_count": 5,
"note_count": 3,
"insight_count": 2,
"config": {
"include_insights": true,
"include_notes": true,
"max_tokens": 2000
}
}
}
```
## Architecture
The ContextBuilder follows these design principles:
1. **Separation of Concerns**: Context building, item management, and formatting are separate
2. **Extensibility**: Uses `**kwargs` and flexible configuration for future features
3. **Performance**: Token-aware truncation and efficient deduplication
4. **Type Safety**: Proper type hints and data classes for structure
5. **Error Handling**: Graceful handling of missing items and database errors
## Integration
The ContextBuilder integrates seamlessly with the existing Open Notebook architecture:
- Uses existing domain models (`Source`, `Notebook`, `Note`)
- Leverages the repository pattern for database access
- Follows the same async patterns as other services
- Integrates with the token counting utilities
## Error Handling
The ContextBuilder handles errors gracefully:
- Missing notebooks/sources/notes are logged but don't stop execution
- Database errors are wrapped in `DatabaseOperationError`
- Invalid parameters raise `InvalidInputError`
- All errors include detailed context information