Files
LearningCircuit 81e7a5707a feat!: remove the auto and parallel meta search engines (#4534)
* 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.
2026-06-13 10:00:33 +02:00
..

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:

  1. Create a user account through the web interface
  2. Authenticate before making API calls
  3. Pass settings_snapshot for programmatic access

Directory Structure

  • programmatic/ - Direct Python API usage (import from local_deep_research.api)

    • programmatic_access.ipynb - Jupyter notebook with comprehensive examples
    • retriever_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 use
    • simple_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

  1. Authentication Required: All endpoints now require login
  2. Settings Snapshot: Programmatic API needs settings_snapshot parameter
  3. New Endpoints: API routes moved (e.g., /api/v1/quick_summary/api/start_research)
  4. 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

  1. Install LDR: pip install local-deep-research
  2. Create a user account:
  3. 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?