SICRY™——用于AI代理的Tor/Onion网络访问层
 
雅各布·詹顿 ·
一个Python文件。将其放入任何项目中,您的AI代理都可以完全访问Tor/.onion暗网——与普通互联网上的干净工具界面代理相同,只是现在用于隐藏服务。
Robin的完整搜索引擎目录(18个引擎)和OSINT管道直接内置。无需安装Robin。没有额外的流程。除了a之外没有配置 .env 文件。
pip install requests[socks] beautifulsoup4 python-dotenv stem
apt install tor && tor &
cp .env.example .env # add one API key (or use Ollama — no key needed)
python sicry.py check # → CONNECTED via Tor | exit IP: 185.220.101.5______________________________________________________________________
目录
______________________________________________________________________
SICRY™做什么
SICRY™为人工智能代理提供了6个工具——这6个工具他们已经知道如何在clearnet上使用,刚刚在Tor上运行:
| SICRY™工具 | Clearnet等效工具 | 它的作用 |
|---|---|---|
sicry_check_tor | 健康检查 | 验证Tor是否处于活动状态,获取退出IP |
sicry_renew_identity | 重置会话 | 旋转电路,获取新的退出节点 |
sicry_fetch | fetch_url() / browser_read_page() | 读取任何URL或 .onion 通过Tor |
sicry_search | web_search() / brave_search() | 查询18个暗网搜索引擎 |
sicry_ask | analyze() / summarize() | LLM OSINT报告的原始内容 |
sicry_check_engines | ping/健康检查 | 所有18个引擎的延迟+状态 |
加上三个质量改进助手(Robin模式,直接调用):
| 助手 | 它做什么 |
|---|---|
refine_query(query) | LLM:自然语言→ ≤5-单词暗网查询 |
filter_results(query, results) | LLM:从所有原始结果中选出最相关的20个 |
scrape_all(urls) | 并发批量提取→ {url: "title - text"} 字典 |
______________________________________________________________________
安装
需求
- Python 3.10+
- Tor守护进程在本地运行
- pip包(如下)
1.安装Tor
Linux(Debian/Ubuntu):
apt install tor
tor &macOS:
brew install tor
tor &自定义数据目录(建议用于 renew_identity):
cat > /tmp/sicry_tor.conf **注:** `ask()`, `refine_query()`,以及 `filter_results()` 需要LLM密钥。所有其他工具(`search`, `fetch`, `check_tor`, `renew_identity`, `check_search_engines`, `scrape_all`)根本不用钥匙工作。
______________________________________________________________________
## 快速入门
Verify Tor is running
python sicry.py check
→ CONNECTED via Tor | exit IP: 185.220.101.5 | error: None
Search the dark web
python sicry.py search "ransomware data leak" --max 10
Fetch a .onion page
python sicry.py fetch http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion
Print tool schemas for your framework
python sicry.py tools # Anthropic format (default) python sicry.py tools --format openai # OpenAI format python sicry.py tools --format gemini # Gemini format
Rotate Tor identity
python sicry.py renew
Start MCP server (for Claude Desktop / Cursor / Zed)
python sicry.py serve
在Python中:
import sicry
Verify Tor
print(sicry.check_tor())
→ {"tor_active": True, "exit_ip": "185.220.101.5", "error": None}
Search
results = sicry.search("credential dump")
→ [{"title": "...", "url": "http://...onion/...", "engine": "Ahmia"}, ...]
Fetch
page = sicry.fetch("http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion")
→ {"url": "...", "is_onion": True, "status": 200, "title": "Ahmia", "text": "...", "links": [...]}
______________________________________________________________________
## 全部九个功能
### `check_tor() → dict`
验证Tor是否正在运行,以及计算机是否正在通过Tor出口节点进行路由。
r = sicry.check_tor()
{"tor_active": True, "exit_ip": "185.220.101.5", "error": None}
{"tor_active": False, "exit_ip": None, "error": "connection refused"}
**先叫这个。** 如果Tor关闭,所有其他网络功能都会无声地失败。
______________________________________________________________________
### `renew_identity() → dict`
旋转Tor电路——获得新的出口节点和新的标识。
r = sicry.renew_identity()
{"success": True, "error": None}
按以下顺序尝试验证:
1. `TOR_CONTROL_PASSWORD` env-var(如果您设置 `HashedControlPassword` 在torrc)
1. Cookie文件来自 `TOR_DATA_DIR` env 是
1. 来自公共系统路径的Cookie文件(`/tmp/tor_data`, `/var/lib/tor`, `~/.tor`, `/run/tor`)
1. 空字符串/空身份验证(完全没有密码的Tor)
**开箱即用** 使用SICRY™推荐的torrc(cookie认证)。看 [Tor设置](#tor-setup).
______________________________________________________________________
### `fetch(url) → dict`
通过Tor获取任何URL——适用于clearnet和 `.onion` 隐藏的服务。
r = sicry.fetch("http://somemarket.onion/listings")
{
"url": "http://somemarket.onion/listings",
"is_onion": True,
"status": 200,
"title": "Market Listings",
"text": "Plain text, HTML stripped, up to 8000 chars",
"links": [{"text": "Link label", "href": "http://..."}, ...], # up to 80 links
"error": None
}
- URL没有 `http://` / `https://` 得到 `http://` 自动预置。
- `text` HTML被剥离、空格被折叠、截断为 `MAX_CONTENT_CHARS` (默认值为8000)。
- 总是返回一条格言,从不提高。
______________________________________________________________________
### `search(query, engines=None, max_results=20, max_workers=8) → list[dict]`
同时在18个暗网搜索引擎中搜索。
All 18 engines in parallel
results = sicry.search("leaked database credentials")
[{"title": "...", "url": "http://...onion/...", "engine": "Ahmia"}, ...]
Specific engines only
results = sicry.search("ransomware", engines=["Ahmia", "Tor66", "Ahmia-clearnet"])
More results
results = sicry.search("bitcoin mixer", max_results=50)
- 所有引擎的结果都按URL进行重复数据消除。
- `engines` 不区分大小写。未知的引擎名称将被自动跳过。
- 总是返回一个列表,从不加薪。
______________________________________________________________________
### `scrape_all(urls, max_workers=5) → dict`
同时批量获取多个页面并返回 `{url: content}` 准备攻读法学硕士。
pages = sicry.scrape_all(search_results[:10])
{
"http://site1.onion/page": "Page Title - full page text...(truncated)",
"http://site2.onion/page": "Page Title - full page text",
...
}
combined = "\n\n".join(pages.values())
- 输入是原始输出 `search()` --列表 `{"title", "url"}` 字典。
- 每页内容上限为2000个字符 `...(truncated)` 标记。
- 使用Robin的模式: `"title - text"` format为LLM添加上下文。
- 失败的页面会被自动删除(只返回可访问的页面)。
______________________________________________________________________
### `refine_query(query, provider=None) → str`
LLM为暗网搜索引擎将自然语言查询细化为≤5个重点词。
q = sicry.refine_query("I want to find ransomware groups that targeted hospitals in 2026")
→ "hospital ransomware 2026 leak"
q = sicry.refine_query("has acme.com appeared in any data breaches")
→ "acme.com breach credentials"
- 如果没有设置LLM键,则返回到原始查询。 **从不加薪**.
- 这是一种Robin模式——暗网索引对短关键字的响应比自然语言好得多。
- 使用前 `search()` 以获得明显更好的结果。
______________________________________________________________________
### `filter_results(query, results, provider=None) → list[dict]`
LLM过滤搜索结果列表,只保留前20个最相关的结果。
best = sicry.filter_results("hospital ransomware 2026", raw_results)
Returns at most 20 results, selected by the LLM for relevance
- 回落到 `results[:20]` 如果没有设置LLM密钥。 **从不加薪**.
- 如果LLM速率限制了大型有效载荷,则自动重试截断的标题。
- 使用后 `search()` 在刮擦之前降低噪音。
______________________________________________________________________
### `ask(content, query="", mode="threat_intel", custom_instructions="", provider=None) → str`
使用LLM分析暗网内容,并返回结构化的OSINT报告。
report = sicry.ask( content="\n\n".join(pages.values()), query="hospital ransomware groups", mode="ransomware", ) print(report) # Structured report: indicators, TTPs, threat actor profile, next steps
**模式:**
|模式|别名|焦点|
|---|---|---|
| `threat_intel` | *(默认)* |OSINT概述——工件、见解、下一步行动|
| `ransomware` | `ransomware_malware` |恶意软件/C2/MITRE TTP、受害者组织、检测|
| `personal_identity` ||PII/泄露风险、严重程度、保护措施|
| `corporate` | `corporate_espionage` |泄露的凭据/代码/文档、IR步骤|
Add custom focus to any mode
report = sicry.ask( content, mode="threat_intel", custom_instructions="Focus on cryptocurrency wallets and mixer services", )
- 如果没有设置LLM密钥,则返回 `[SICRY™: ...]` 错误字符串-- **从不加薪**.
- 内容被截断为 `MAX_CONTENT_CHARS` (默认值8000),然后发送到LLM。
______________________________________________________________________
### `check_search_engines(max_workers=8) → list[dict]`
通过Tor Ping所有18个引擎,并返回每个引擎的状态和延迟。
results = sicry.check_search_engines()
[
{"name": "Ahmia", "status": "up", "latency_ms": 1240, "error": None},
{"name": "Kaizer", "status": "down", "latency_ms": None, "error": "timeout"},
...
]
live = [r for r in results if r["status"] == "up"] print(f"{len(live)}/18 engines alive") fastest = min(live, key=lambda x: x["latency_ms"]) print(f"Fastest: {fastest['name']} ({fastest['latency_ms']}ms)")
- 结果保持原始发动机顺序。
- 使用前 `search()` 以避免在熄火的发动机上浪费时间。
______________________________________________________________________
## 工具模式
SICRY™以本机格式为每个主要框架公开所有6个工具。所有三种格式始终保持同步。
import sicry
sicry.TOOLS # Anthropic / Claude format (input_schema) sicry.TOOLS_OPENAI # OpenAI function-calling format (type: "function") sicry.TOOLS_GEMINI # Google Gemini function declarations
打印其中任何一个:
python sicry.py tools # Anthropic (default) python sicry.py tools --format openai python sicry.py tools --format gemini
暴露的工具:
|工具名称|必需参数|可选参数|
|---|---|---|
| `sicry_check_tor` | *(无)* | |
| `sicry_renew_identity` | *(无)* | |
| `sicry_fetch` | `url` | |
| `sicry_search` | `query` | `max_results` (int), `engines` (列表)|
| `sicry_ask` | `content` | `query`, `mode`, `custom_instructions` |
| `sicry_check_engines` | *(无)* | `max_workers` (int)|
______________________________________________________________________
## 框架集成
### 调度员
所有框架共享一个调度器——用工具名称和输入字典调用它:
result = sicry.dispatch(tool_name, tool_input)
Returns: dict | list | str (matches the tool's documented return type)
Raises: ValueError if tool_name is unknown
______________________________________________________________________
### 人类学/克劳德
import anthropic, sicry, json
client = anthropic.Anthropic() messages = [{"role": "user", "content": "Search dark web for recent credential leaks from banks"}]
while True: resp = client.messages.create( model="claude-opus-4-6", max_tokens=4096, system="You are a dark-web OSINT analyst. Always verify Tor before searching.", tools=sicry.TOOLS, # [options]
|命令|选项|描述|
|---|---|---|
| `check` ||验证Tor是否正在运行,显示退出IP|
| `renew` ||旋转Tor电路|
| `search ` | `--max N` (默认值10), `--engine NAME` (可重复)|搜索暗网|
| `fetch ` ||通过Tor获取URL,打印文本|
| `tools` | `--format anthropic\|openai\|gemini` |以JSON格式打印工具模式|
| `serve` ||启动MCP服务器|
**示例:**
python sicry.py check python sicry.py renew python sicry.py search "ransomware healthcare" --max 15 python sicry.py search "bitcoin mixer" --engine Ahmia --engine Tor66 python sicry.py fetch http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion python sicry.py tools --format openai | python -m json.tool python sicry.py serve
______________________________________________________________________
## 完整的OSINT管道
这是推荐的工作流程。每一步都应用了一个Robin模式,在结果质量上产生了可衡量的差异:
import sicry
Step 1: Verify Tor
status = sicry.check_tor() if not status["tor_active"]: raise RuntimeError(f"Tor not active: {status['error']}") print(f"Tor active. Exit IP: {status['exit_ip']}")
Step 2: Health-check engines (skip dead ones)
engine_status = sicry.check_search_engines() live = [e for e in engine_status if e["status"] == "up"] live_names = [e["name"] for e in live] print(f"{len(live)}/18 engines alive: {', '.join(live_names[:5])}...")
Step 3: Refine query (Robin quality pattern)
raw_query = "ransomware groups targeting hospital systems 2026" query = sicry.refine_query(raw_query) print(f"Refined: '{raw_query}' -> '{query}'")
Step 4: Search (query only live engines in parallel)
raw_results = sicry.search( query, engines=live_names, # skip engines we know are down max_results=50, ) print(f"{len(raw_results)} raw results")
Step 5: Filter to best 20 (Robin quality pattern)
best = sicry.filter_results(query, raw_results) print(f"Filtered to {len(best)} most relevant")
Step 6: Batch scrape concurrently
pages = sicry.scrape_all(best[:10], max_workers=5) print(f"Scraped {len(pages)} pages")
Step 7: OSINT analysis
combined = "\n\n".join(f"[{url}]\n{text}" for url, text in pages.items()) report = sicry.ask( combined, query=query, mode="ransomware", custom_instructions="Focus on victim organisations and ransom demands.", ) print(report)
Step 8: Rotate identity when done
sicry.renew_identity()
______________________________________________________________________
## 分析模式
所有四种模式都会生成结构化的分段报告。直接通过 `.onion` 文本或 `scrape_all()` 输出。
### `threat_intel` (默认)
一般暗网OSINT。最适合初步调查。
输出部分:输入查询·源链接·调查工件·关键见解·下一步
report = sicry.ask(content, query="acme.com breach", mode="threat_intel")
### `ransomware`
别名: `ransomware_malware`
恶意软件情报。提取C2域、文件哈希、MITRE ATT&CK TTP、受害扇区。
输出部分:输入查询·源链接·恶意软件/勒索软件指标·威胁参与者简介·关键见解·下一步
report = sicry.ask(content, query="LockBit hospital", mode="ransomware")
### `personal_identity`
PII暴露分析。表面SSN、电子邮件、护照数据、漏洞来源、风险严重程度。
输出部分:输入查询·源链接·暴露的PII工件·泄露/市场来源·暴露风险评估·关键见解·下一步
report = sicry.ask(content, query="john.doe@email.com", mode="personal_identity")
### `corporate`
别名: `corporate_espionage`
企业威胁情报。检测泄露的凭据、源代码和内部文档。
输出部分:输入查询·源链接·泄露的公司文物·威胁行为者/经纪人活动·业务影响评估·关键见解·下一步
report = sicry.ask(content, query="acme.com corporate leak", mode="corporate")
______________________________________________________________________
## 18搜索引擎
Robin的完整目录加上两个经过验证的补充。全部由以下人员同时查询 `search()`.
|发动机|类型|注意事项|
|---|---|---|
| **艾哈迈德** | `.onion` index |最可靠、最大的指数|
| **洋葱地** | `.onion` 索引||
| **火炬** | `.onion` 索引||
| **失忆** | `.onion` 索引||
| **凯泽** | `.onion` 索引||
| **灵魂** | `.onion` 索引||
| **龙卷风** | `.onion` 索引||
| **TorNet 的** | `.onion` 索引||
| **托兰** | `.onion` 索引||
| **FindTor** | `.onion` 索引||
| **挖掘机** | `.onion` 索引||
| **洋葱道** | `.onion` 索引||
| **Tor66** | `.onion` index |论坛覆盖率高|
| **对象存储服务** | `.onion` 索引||
| **托尔戈尔** | `.onion` 索引||
| **深度搜索** | `.onion` 索引||
| **DuckDuckGo Tor** | `.onion` (DDG)|PGP验证地址|
| **阿赫米亚清洁网** |clearnet HTTPS | Ahmia的clearnet镜像——始终可访问|
使用 `check_search_engines()` 在大范围奔跑之前,看看哪些还活着。
使用 `engines=["Ahmia", "Ahmia-clearnet"]` 为了获得快速可靠的结果,或省略 `engines` 为了获得最大的覆盖范围。
______________________________________________________________________
## 环境变量
复制 `.env.example` 到 `.env`所有变量都是可选的——只配置你需要的。
|变量|默认值|描述|
|---|---|---|
| `TOR_SOCKS_HOST` | `127.0.0.1` |Tor SOCKS5代理主机|
| `TOR_SOCKS_PORT` | `9050` |Tor SOCKS5代理端口|
| `TOR_CONTROL_HOST` | `127.0.0.1` |Tor控制端口主机|
| `TOR_CONTROL_PORT` | `9051` |Tor控制端口|
| `TOR_CONTROL_PASSWORD` | *(未设置)* |HashedControlPassword的密码|
| `TOR_DATA_DIR` | *(未设置)* |Tor DataDirectory的路径--用于查找的cookie文件 `renew_identity` |
| `TOR_TIMEOUT` | `45` |每次请求超时(秒)|
| `LLM_PROVIDER` | *(未设置)* | `openai` / `anthropic` / `gemini` / `ollama` / `llamacpp` |
| `OPENAI_API_KEY` | *(未设置)* |OpenAI API密钥|
| `OPENAI_MODEL` | `gpt-4o` |OpenAI模型|
| `ANTHROPIC_API_KEY` | *(未设置)* |无烟煤API键|
| `ANTHROPIC_MODEL` | `claude-opus-4-6` |人类模型|
| `GEMINI_API_KEY` | *(未设置)* |Google Gemini API密钥|
| `GEMINI_MODEL` | `gemini-2.5-flash` |Gemini模型|
| `OLLAMA_BASE_URL` | `http://127.0.0.1:11434` |Ollama API基础URL|
| `OLLAMA_MODEL` | `llama3.2` |Olama型号名称|
| `LLAMACPP_BASE_URL` | `http://127.0.0.1:8080` |llama.cpp服务器基本URL|
| `SICRY_MAX_CHARS` | `8000` |传递给LLM的内容的最大字符数|
**`TOR_DATA_DIR` 是最重要的Tor变量。** 将其设置为Tor `DataDirectory` 路径如此 `renew_identity()` 可以找到cookie文件进行身份验证。
______________________________________________________________________
## Tor设置
### 默认系统Tor
如果你跑了 `apt install tor && tor &`、搜索、获取和检查以立即工作。默认情况下,控制端口可能未启用。
检查控制端口是否打开:
ss -tlnp | grep 9051
如果没有显示,请启用它:
echo "ControlPort 9051" >> /etc/tor/torrc echo "CookieAuthentication 1" >> /etc/tor/torrc systemctl restart tor
### SICRY™推荐的torrc
为了发展——一切 `/tmp`,无需系统更改:
SocksPort 9050 ControlPort 9051 CookieAuthentication 1 DataDirectory /tmp/tor_data
tor -f /tmp/sicry_tor.conf &
然后在 `.env`:
TOR_DATA_DIR=/tmp/tor_data
### 使用密码而不是cookie
Generate a hashed password
tor --hash-password "mypassword"
-> 16:...hash...
Add to torrc
HashedControlPassword 16:...hash...
In .env
TOR_CONTROL_PASSWORD=mypassword
### 如何 `renew_identity()` auth作品
SICRY™依次尝试4种身份验证策略,直到其中一种成功:
1. **`TOR_CONTROL_PASSWORD`** --使用env-var作为字符串密码
1. **Cookie文件来自 `TOR_DATA_DIR`** --阅读 `$TOR_DATA_DIR/control_auth_cookie` 作为原始字节
1. **来自公共系统路径的Cookie** --自动发现 `/tmp/tor_data`, `/var/lib/tor`, `~/.tor`, `/run/tor`
1. **空/空身份验证** --对于完全没有设置控制密码的Tor
如果所有四个都失败,则返回 `{"success": False, "error": "..."}` 一条有用的信息。 **从不加薪。**
______________________________________________________________________
## 建筑
这些部分是如何组合在一起的——从人工智能代理调用工具到 `.onion` 回应。
### 层次图
┌─────────────────────────────────────────────────────────────────────┐ │ AI Agent / Host │ │ Claude · GPT-4o · Gemini · Ollama · LangChain · CrewAI · MCP │ │ calls tool → reads JSON result │ └─────────────────────┬───────────────────────────────────────────────┘ │ tool_name + args (dict) ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ SICRY™ (sicry.py) │ │ │ │ dispatch() ──→ sicry_check_tor check_tor() │ │ ──→ sicry_renew_identity renew_identity() │ │ ──→ sicry_fetch fetch(url) │ │ ──→ sicry_search search(query, engines, ...) │ │ ──→ sicry_ask ask(content, mode, ...) │ │ ──→ sicry_check_engines check_search_engines() │ │ │ │ Quality helpers (call directly): │ │ refine_query() · filter_results() · scrape_all() │ │ │ │ State: SQLite DB (watch jobs · engine stats · result cache) │ └──────────┬──────────────────────────┬───────────────────────────────┘ │ SOCKS5 │ stem control socket │ 127.0.0.1:9050 │ 127.0.0.1:9051 ▼ ▼ ┌──────────────────────┐ ┌──────────────────────┐ │ Tor Daemon (tor) │ │ Tor Control Port │ │ (tor / TorPool) │◄──│ renew_identity() │ └──────────┬───────────┘ └──────────────────────┘ │ onion routing (3 hops) ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ Dark Web / Tor Network │ │ │ │ .onion hidden services Clearnet via Tor exit nodes │ │ ┌───────────────────┐ ┌──────────────────────────────┐ │ │ │ 18 Search Engines│ │ Any clearnet HTTPS/HTTP URL │ │ │ │ Ahmia · Tor66 │ │ (exit node proxied) │ │ │ │ DuckDuckGo-Tor │ └──────────────────────────────┘ │ │ │ + 15 more... │ │ │ └───────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘
### OSINT管道流量
推荐的7级管道(`pipeline.py` /完整的OSINT管段如下):
User query │ ▼ [1] check_tor() → verify Tor is active (abort if not) │ ▼ [2] check_search_engines() → ping all 18, collect live engine list │ ▼ [3] refine_query() → LLM: natural language → ≤5 search keywords │ ▼ [4] search() → query all live engines in parallel over Tor │ ┌── Ahmia ──→ results │ ├── Tor66 ──→ results │ └── ...16 more (concurrent ThreadPoolExecutor) │ ▼ [5] filter_results() → LLM: pick top 20 most relevant results │ ▼ [6] scrape_all() → concurrent batch-fetch top pages over Tor │ ▼ [7] ask() → LLM OSINT report (threat_intel / ransomware │ / personal_identity / corporate) ▼ Structured report
### TorPool模式(可选)
当 `SICRY_POOL_SIZE=N` (建议2-4),SICRY™生成N个独立的Tor进程,并在它们之间循环robins请求,以获得更高的吞吐量:
sicry_search ─→ TorPool ├── tor[0] :9050 ← SOCKS5 proxy 0 ├── tor[1] :9052 ← SOCKS5 proxy 1 └── tor[N-1]:... ← SOCKS5 proxy N-1
产生 `.env`:
SICRY_POOL_SIZE=3 # 2–4 recommended; each uses ~50 MB RAM
### 更新策略
`check_update()` 检查 **GitHub发布API** (`/releases/latest`)--只有发布的正式版本才会触发更新通知。纯git标签和预发布版本将被忽略。
______________________________________________________________________
## 故障排除
**`tor_active: False`**
Is Tor running?
pgrep tor || tor &
Is SOCKS port open?
ss -tlnp | grep 9050
**`renew_identity()` 回报 `success: False`**
Is control port open?
ss -tlnp | grep 9051
Does the cookie file exist?
ls /tmp/tor_data/control_auth_cookie # custom torrc ls /var/lib/tor/control_auth_cookie # system Tor
Set TOR_DATA_DIR=/path/to/DataDirectory in .env
**`.onion` 获取返回值 `status: 0`**
隐藏服务已关闭或Tor速度较慢。尝试其他URL `search()`,或致电 `check_search_engines()` 首先确认Tor是否可用。
**搜索返回0个结果**
暗网索引经常下降。跑 `check_search_engines()` 要查找实时引擎,请明确传递它们: `search(query, engines=["Ahmia", "Ahmia-clearnet"])`.
**`[SICRY™: OPENAI_API_KEY not set...]`**
集 `LLM_PROVIDER=ollama` 使用无密钥的本地推理,或将相关密钥添加到 `.env`. `search()`, `fetch()`, `check_tor()`, `renew_identity()`, `scrape_all()`,以及 `check_search_engines()` 所有工作都不需要任何LLM密钥。
**搜索速度慢**
Tor的延迟是可变的。使用 `check_search_engines()` 找到最快的发动机。 `engines=["Ahmia", "Ahmia-clearnet"]` 是最快可靠的配置。
**记录垃圾邮件/stem调试输出**
SICRY™抑制urllib3和所有茎子记录仪(`stem`, `stem.control`, `stem.response`, `stem.socket`, `stem.connection`, `stem.util`)完全在导入时,使用NullHandler设置为CRITICAL,然后 `propagate=False`。如果仍然看到调试输出,请确保导入 `sicry` 在配置任何根日志处理程序之前。
______________________________________________________________________
## 学分
- 额外验证 `.onion` 地址来自 [dark.mail](https://dark.fail) (PGP已验证)
- Tor: [torproject.org](https://www.torproject.org/)
______________________________________________________________________
## 许可证
麻省理工学院许可证--版权所有(c)2026 JacobJandon
看 [许可证](LICENSE) 全文。
负责任地合法使用。