mirror of
https://github.com/LearningCircuit/local-deep-research.git
synced 2026-06-16 03:51:07 +03:00
* feat!: remove the auto and parallel meta search engines The langgraph-agent strategy (the default) selects search engines dynamically per tool call, making the LLM-based meta-pickers redundant: - 'auto' (MetaSearchEngine, alias 'meta') spent an extra LLM call picking 1-3 engines and returned the first success - 'parallel'/'parallel_scientific' (ParallelSearchEngine) fanned out blindly across engines and merged results Removal also deletes the entire meta-picker special-case surface in the egress policy: the factory skip-PEP tuple (every engine now goes through evaluate_engine), _META_PICKER_ENGINES, the strict_with_meta_picker / meta_picker_delegator reason codes, validate_strict_meta_combo, and the frontend STRICT-scope guard. Migration 0013 rewrites stored per-user data at DB open: search.tool settings -> searxng, orphaned search.engine.auto.* / search.engine.web.parallel.* rows deleted, news subscription engines NULLed (= use the user's default), queued research snapshots and saved benchmark configs rewritten. Also fixes /api/v1/quick_summary silently overriding the user's configured engine with 'auto' when search_tool was omitted, and the corrupted-settings repair paths re-introducing 'auto'. BREAKING CHANGE: search_tool='auto'/'parallel' now raises ValueError; pick a concrete engine. LDR_SEARCH_TOOL=auto env overrides must be updated. * test: exempt 0013's intentional no-op downgrade from the substantive-downgrade guard Restoring 'auto'/'parallel' references on downgrade would recreate broken state — those engines no longer exist. Same precedent as 0004. * fix: align merged main code with meta-engine removal The merge from main brought in _egress_audit_net (MCP) with the old search.tool 'auto' code default — switch it to 'searxng' like the other call sites. * test: fix LLM-provider tests denied by adaptive egress + private primary The fixture sweep changed search.tool from the removed 'auto' to the private 'library' engine — the only one the factory instantiates from these minimal snapshots. That passed while the missing-scope fallback was 'both', but merging main (#4465, fallback -> adaptive) made a private primary resolve to PRIVATE_ONLY, forcing local LLM and denying the remote OpenAI/OpenRouter providers these tests configure (provider_remote). Pin policy.egress_scope='both' in the affected fixtures so these stay LLM-provider-config tests, decoupled from egress-scope resolution.
Local Deep Research API Examples
This directory contains examples for using LDR through different interfaces.
Important: Authentication Required (v2.0+)
Since LDR v2.0, all API access requires authentication due to per-user encrypted databases. You must:
- Create a user account through the web interface
- Authenticate before making API calls
- Pass settings_snapshot for programmatic access
Directory Structure
-
programmatic/- Direct Python API usage (import fromlocal_deep_research.api)programmatic_access.ipynb- Jupyter notebook with comprehensive examplesretriever_usage_example.py- Using LangChain retrievers with LDR
-
http/- HTTP REST API usage (requires running server)simple_working_example.py- ✅ BEST WORKING EXAMPLE - Clean, tested, and ready to usesimple_http_example.py- Quick start example (needs updating for auth)http_api_examples.py- Comprehensive examples including batch processing
Quick Start
Programmatic API (Python Package)
from local_deep_research.api import quick_summary
from local_deep_research.settings import SettingsManager
from local_deep_research.database.session_context import get_user_db_session
# Authenticate and get settings
with get_user_db_session(username="your_username", password="your_password") as session:
settings_manager = SettingsManager(session)
settings_snapshot = settings_manager.get_all_settings()
# Use the API
result = quick_summary(
"What is quantum computing?",
settings_snapshot=settings_snapshot
)
print(result["summary"])
HTTP API (REST)
🎯 Quick Start - Works Completely Out of the Box!
Our tested working example requires zero manual setup:
# 1. Start the server
python -m local_deep_research.web.app
# 2. Run the working example (creates user automatically!)
python examples/api_usage/http/simple_working_example.py
# 3. Done! ✅ No other steps required
The example will:
- ✅ Create a unique test user automatically
- ✅ Test authentication with proper CSRF handling
- ✅ Execute a research query using the correct API endpoint
- ✅ Provide credentials for manual testing (if desired)
- ✅ Show results with direct links to view them
📋 Manual API Usage:
If you want to integrate the API into your own code:
import requests
from bs4 import BeautifulSoup
# Create session for cookie persistence
session = requests.Session()
# Login - get CSRF token first
login_page = session.get("http://localhost:5000/auth/login")
soup = BeautifulSoup(login_page.text, 'html.parser')
csrf_input = soup.find('input', {'name': 'csrf_token'})
login_csrf = csrf_input.get('value')
# Login with form data
session.post(
"http://localhost:5000/auth/login",
data={
"username": "your_username",
"password": "your_password",
"csrf_token": login_csrf
}
)
# Get CSRF token
csrf_token = session.get("http://localhost:5000/auth/csrf-token").json()["csrf_token"]
# Make API request
response = session.post(
"http://localhost:5000/api/start_research",
json={"query": "What is quantum computing?"},
headers={"X-CSRF-Token": csrf_token, "Content-Type": "application/json"}
)
print(response.json())
⚠️ Important Notes:
- Use the correct endpoint:
/api/start_research(not/research/api/start) - Login with form data (not JSON)
- Handle CSRF tokens properly
- User must be created through web interface first
Which API Should I Use?
-
Programmatic API: Use when integrating LDR into your Python application
- ✅ Direct access, no HTTP overhead
- ✅ Full access to all features and parameters
- ✅ Can pass Python objects (like LangChain retrievers)
- ❌ Requires LDR to be installed in your environment
- ❌ Requires database session and settings snapshot
-
HTTP API: Use when accessing LDR from other languages or remote systems
- ✅ Language agnostic - works with any HTTP client
- ✅ Can run LDR on a separate server
- ✅ Easy to scale and deploy
- ❌ Limited to JSON-serializable parameters
- ❌ Requires running the web server
- ❌ Requires authentication and CSRF tokens
API Changes in v2.0
Breaking Changes
- Authentication Required: All endpoints now require login
- Settings Snapshot: Programmatic API needs
settings_snapshotparameter - New Endpoints: API routes moved (e.g.,
/api/v1/quick_summary→/api/start_research) - CSRF Protection: POST/PUT/DELETE requests need CSRF token
Migration Guide
Old (v1.x):
# Programmatic
from local_deep_research.api import quick_summary
result = quick_summary("query")
# HTTP
curl -X POST http://localhost:5000/api/v1/quick_summary \
-d '{"query": "test"}'
New (v2.0+):
# Programmatic - with authentication and settings
with get_user_db_session(username, password) as session:
settings_manager = SettingsManager(session)
settings_snapshot = settings_manager.get_all_settings()
result = quick_summary("query", settings_snapshot=settings_snapshot)
# HTTP - with authentication and CSRF
# See examples above
Running the Examples
Prerequisites
- Install LDR:
pip install local-deep-research - Create a user account:
- Start server:
python -m local_deep_research.web.app - Open http://localhost:5000 and register
- Start server:
- Configure your LLM provider in settings
Programmatic Examples
# Update credentials in the example files first!
python examples/api_usage/programmatic/retriever_usage_example.py
# Or use the Jupyter notebook
jupyter notebook examples/api_usage/programmatic/programmatic_access.ipynb
HTTP Examples
# First, start the LDR server
python -m local_deep_research.web.app
# In another terminal, run the examples
# Note: These need to be updated for v2.0 authentication!
python examples/api_usage/http/simple_http_example.py
python examples/api_usage/http/http_api_examples.py
Need Help?
- See the API Quick Start Guide
- Check the FAQ
- Join our Discord for support