Spaces:
Sleeping
Sleeping
| # 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 |