Install
openclaw skills install local-deep-researchPerforms multi-cycle, iterative deep research on complex topics using a local LDR service, providing detailed reports with citations and source tracking.
openclaw skills install local-deep-researchThis skill interfaces with a locally-hosted LDR (Local Deep Research) service to perform multi-cycle, iterative research with full citations and source tracking.
LDR_BASE_URL (default http://127.0.0.1:5000). Only point it at an LDR instance you control. Do not set it to an unknown or untrusted remote host.curl and jq are installed on the host where the skill runs.LDR_SERVICE_USER and LDR_SERVICE_PASSWORD (or LDR_USERNAME/LDR_PASSWORD) via environment variables or a local .env file only. Use a dedicated, low-privilege LDR account (e.g. openclaw_service). Do not store secrets in committed config or in the skill directory.~/.config/local_deep_research/config/.env if that file exists. That file may expose any variables it contains to the script. Verify the contents of that path before use; do not place unrelated secrets there.scripts/ldr-research.sh before use. For higher assurance, run it in an isolated environment (e.g. container or VM) with network restricted to your LDR host.LDR uses session-cookie auth with CSRF protection (not HTTP Basic Auth). The skill script performs a proper login flow: GET login page → obtain session cookie and CSRF token → POST credentials + CSRF → reuse session cookie (and CSRF for POSTs) for all API calls. Username and password are used only to create a session with your local LDR instance; they are never sent to ClawHub, GitHub, or any other server.
Do not put credentials in skill config or committed files. Use environment variables or a local .env file only (e.g. LDR_SERVICE_USER, LDR_SERVICE_PASSWORD, or LDR_USERNAME/LDR_PASSWORD). Optional: LDR’s ~/.config/local_deep_research/config/.env is sourced by the script if present. Use a dedicated LDR user (e.g. openclaw_service) for this skill.
LDR_BASE_URL — LDR service URL (default: http://127.0.0.1:5000)LDR_LOGIN_URL — Login page URL for session + CSRF (default: $LDR_BASE_URL/auth/login)LDR_SERVICE_USER or LDR_USERNAME — LDR account username (local auth only)LDR_SERVICE_PASSWORD or LDR_PASSWORD — LDR account password (local auth only)LDR_DEFAULT_MODE — Default research mode: quick (Quick Summary) or detailed (Detailed Report) (default: detailed)LDR_DEFAULT_LANGUAGE — Default output language code for report/summary (e.g. en, es, fr, de, zh, ja); empty = LDR defaultLDR_DEFAULT_SEARCH_TOOL — Default search tool: searxng, auto, local_all (default: auto)quick — Quick Summary: fewer cycles, shorter output, faster. Use when the user wants a concise summary or a quick overview.detailed — Detailed Report: full multi-cycle research, full markdown report, full citations and sources. Use when the user wants comprehensive analysis, literature review, or in-depth coverage.Fire-and-forget: submit a query to LDR and return a research ID immediately.
Inputs:
query (required) — The research question or topicmode (optional) — quick (Quick Summary) or detailed (Detailed Report) (default from config)language (optional) — Output language for the report/summary, e.g. en, es, fr, de, zh, ja (default from config or LDR default)search_tool (optional) — searxng, auto, local_all (default from config)iterations (optional) — Number of research cycles (default: LDR's default)questions_per_iteration (optional) — Questions to generate per cycleReturns:
{
"research_id": "uuid-string",
"mode": "detailed",
"search_tool": "auto",
"submitted_at": "2026-03-10T08:00:00Z",
"status": "queued"
}
Usage:
# Quick Summary (faster, shorter)
scripts/ldr-research.sh start_research --query "Solid-state battery advances" --mode quick
# Detailed Report with output in Spanish
scripts/ldr-research.sh start_research \
--query "What are the latest developments in solid-state batteries?" \
--mode detailed \
--language es \
--search_tool searxng
Check the status of a research job.
Inputs:
research_id (required) — The research job ID from start_researchReturns:
{
"research_id": "uuid-string",
"state": "pending|running|completed|failed|timeout",
"progress": 45,
"message": "Synthesizing sources from iteration 2...",
"last_milestone": "Generated 12 questions from 8 sources"
}
Usage:
scripts/ldr-research.sh get_status --research_id <uuid>
Fetch the complete research report once finished.
Inputs:
research_id (required) — The research job IDReturns:
{
"research_id": "uuid-string",
"query": "original query",
"mode": "detailed",
"summary": "executive summary text",
"report_markdown": "full markdown report",
"sources": [
{
"id": 1,
"title": "Source Title",
"url": "https://example.com",
"snippet": "relevant excerpt",
"type": "web|local_doc"
}
],
"iterations": 3,
"created_at": "2026-03-10T08:00:00Z",
"completed_at": "2026-03-10T08:15:00Z"
}
Usage:
scripts/ldr-research.sh get_result --research_id <uuid>
For interactive sessions where the user can wait:
start_researchget_status every 10-30 secondsstate == "completed", call get_resultFor background processing:
start_research, return the research_id to the userget_status --research_id <id>get_result to fetch the complete reportAfter research completes:
get_result to get sourcesmarkdown-converter, summarize)User: "Research the latest developments in quantum computing"
Assistant: Starting deep research with LDR...
→ start_research(query="latest developments in quantum computing", mode="detailed")
→ Returns: research_id="abc-123", status="queued"
Assistant: Research started (ID: abc-123). This will take ~5-10 minutes.
I'll check the progress and let you know when it's complete.
[After polling...]
Assistant: Research complete! Here's what I found:
## Summary
[summary from get_result]
## Full Report
[report_markdown from get_result]
## Sources (12 found)
1. [Source 1 title](url)
2. [Source 2 title](url)
...
LDR_BASE_URL is correctcurl http://127.0.0.1:5000/healthLDR_SERVICE_USER, LDR_SERVICE_PASSWORD), not in committed config.LDR_LOGIN_URL or see the script’s login section.LDR_LOGIN_URL in a browser and sign in there to verify LDR is up.