Ubuntu22.04 安装 OpenClaw
- 准备工作
- 让 ai 员工更好用
- 加入免费的模型
- 配置钉钉
- 在 GLM-4.7-Flash 基础上加入 deepseek
- 加入 minimax 和豆包模型
- 配置 web 搜索
- Exa MCP Server for OpenAI Codex
- Quick Start
- Function Calling / Tool Use
- Search Type Reference
- Content Configuration
- Domain Filtering (Optional)
- Web Search Tool
- Category Examples
- Content Freshness (maxAgeHours)
- Other Endpoints
- Troubleshooting
- Resources
本项目旨在通过安装 OpenClaw,利用 AI 辅助实现 Gnuradio 移植、FPGA 程序编写、射频及 ARM Linux 编程。
准备工作
请参考官网获取最新信息:https://clawd.org.cn/
一键安装
curl -fsSL https://clawd.org.cn/install.sh | sudo bash
输入 Y 确认安装。
需要配置 DeepSeek API Key。访问 https://platform.deepseek.com/sign_in 注册并获取 API Key,在安装终端中输入。
设置通道 配置飞书
需创建飞书机器人。访问 https://open.feishu.cn 进入开发者后台,注册用户并创建 AI 机器人。
创建成功后记录 App ID 和 App Secret。在后续安装终端中填入 App ID 和 Secret。
也可使用命令单独配置:
openclaw-cn configure --section channels
如有问题,运行 openclaw-cn onboard --install-daemon 重新配置。
若 Gateway 未安装导致无法打开网页端,执行以下命令安装必备工具:
sudo apt install net-tools
让 ai 员工更好用
加入免费的模型
配置 GLM-4.7-Flash 官方免费 API。访问 https://bigmodel.cn/ 注册开发者并获取 API Key。
在控制台新建 API Key 后复制,写入 openclaw.json 文件:
{
"models": {
"providers": {
"glm": {
"baseUrl": "https://open.bigmodel.cn/api/paas/v4",
"apiKey": "你的 apiKey",
"api": "openai-completions",
"models": [
{
"id": "glm-4.7-flash",
"name": "GLM-4.7 Flash",
"contextWindow": 128000,
"maxTokens": 4096,
"reasoning": false,
"input": ["text"],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
}
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "glm/glm-4.7-flash"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
}
}
重启 OpenClaw:
openclaw-cn gateway restart
配置钉钉
访问 https://open-dev.dingtalk.com 在钉钉开发者平台获取 Client ID (AppKey) 和 Client Secret (AppSecret)。
在'权限管理'中添加权限:
- Card.Instance.Write(卡片实例写权限)
- Card.Streaming.Write(卡片流式写权限)
- im:message(消息相关权限)
安装钉钉插件(默认未内置):
openclaw-cn plugins install https://github.com/soimy/clawdbot-channel-dingtalk.git
在 GLM-4.7-Flash 基础上加入 deepseek
修改 openclaw.json 配置文件加入 DeepSeek API Key,当 GLM 免费 Token 不足时自动切换。
重启服务:
openclaw-cn gateway restart
加入 minimax 和豆包模型
- MiniMax M2.5:访问 https://api.minimax.chat/ 注册登录获取 API Key。
- Seedance2.0:访问 https://console.volcengine.com/ark/ 开通火山方舟服务,在'API Key 管理'页面创建 Key。
之后配置 openclaw.json 即可接入多个大模型。
配置 web 搜索
访问 https://exa.ai/ 免费注册并获取 API Key。
将 API Key 告知 OpenClaw 进行配置:
export EXA_API_KEY="YOUR_API_KEY"
或在 .env 文件中添加:
EXA_API_KEY=YOUR_API_KEY
重启服务:
openclaw-cn gateway restart
.env File
EXA_API_KEY=YOUR_API_KEY
Exa MCP Server for OpenAI Codex
为 OpenAI Codex 提供实时 Web 搜索、代码上下文和公司研究功能。
运行命令:
codex mcp add exa --url https://mcp.exa.ai/mcp?exaApiKey=YOUR_API_KEY
启用特定工具:
https://mcp.exa.ai/mcp?exaApiKey=YOUR_API_KEY&tools=web_search_exa,get_code_context_exa,people_search_exa
启用所有工具:
https://mcp.exa.ai/mcp?exaApiKey=YOUR_API_KEY&tools=web_search_exa,web_search_advanced_exa,get_code_context_exa,crawling_exa,company_research_exa,people_search_exa,deep_researcher_start,deep_researcher_check
故障排除: 如果工具未显示,更新配置后重启 MCP 客户端。
Quick Start
cURL
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "latest developments in AI safety research", "type": "auto", "num_results": 10, "contents": { "text": { "max_characters": 20000 } } }'
Function Calling / Tool Use
函数调用允许 AI 代理根据对话上下文动态决定何时搜索网络。
OpenAI Function Calling
import json
from openai import OpenAI
from exa_py import Exa
openai = OpenAI()
exa = Exa()
tools = [{"type":"function","function":{"name":"exa_search","description":"Search the web for current information.","parameters":{"type":"object","properties":{"query":{"type":"string","description":"Search query"}},"required":["query"]}}}]
def exa_search(query:str)->str:
results = exa.search_and_contents(query,type="auto", num_results=10, text={"max_characters":20000})
return "\n".join([f"{r.title}: {r.url}" for r in results.results])
messages = [{"role":"user","content":"What's the latest in AI safety?"}]
response = openai.chat.completions.create(model="gpt-4o", messages=messages, tools=tools)
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
search_results = exa_search(json.loads(tool_call.function.arguments)["query"])
messages.append(response.choices[0].message)
messages.append({"role":"tool","tool_call_id": tool_call.id,"content": search_results})
final = openai.chat.completions.create(model="gpt-4o", messages=messages)
print(final.choices[0].message.content)
Anthropic Tool Use
import anthropic
from exa_py import Exa
client = anthropic.Anthropic()
exa = Exa()
tools = [{"name":"exa_search","description":"Search the web for current information.","input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Search query"}},"required":["query"]}}]
def exa_search(query:str)->str:
results = exa.search_and_contents(query,type="auto", num_results=10, text={"max_characters":20000})
return "\n".join([f"{r.title}: {r.url}" for r in results.results])
messages = [{"role":"user","content":"Latest quantum computing developments?"}]
response = client.messages.create(model="claude-sonnet-4-20250514", max_tokens=4096, tools=tools, messages=messages)
if response.stop_reason == "tool_use":
tool_use = next(b for b in response.content if b.type=="tool_use")
tool_result = exa_search(tool_use.input["query"])
messages.append({"role":"assistant","content": response.content})
messages.append({"role":"user","content":[{"type":"tool_result","tool_use_id": tool_use.id,"content": tool_result}]})
final = client.messages.create(model="claude-sonnet-4-20250514", max_tokens=4096, tools=tools, messages=messages)
print(final.content[0].text)
Search Type Reference
| Type | Best For | Speed | Depth |
|---|---|---|---|
fast | Real-time apps, autocomplete, quick lookups | Fastest | Basic |
auto | Most queries - balanced relevance & speed | Medium | Smart |
deep | Research, enrichment, thorough results | Slow | Deep |
deep-reasoning | Complex research, multi-step reasoning | Slowest | Deepest |
Tip: type="auto" works well for most queries. Use type="deep" when you need thorough research results.
Content Configuration
Choose ONE content type per request:
| Type | Config | Best For |
|---|---|---|
| Text | "text": {"max_characters": 20000} | Full content extraction, RAG |
| Highlights | "highlights": {"max_characters": 4000} | Snippets, summaries, lower cost |
Warning: Using text: true can significantly increase token count. Add max_characters limit or use highlights.
Domain Filtering (Optional)
Usually not needed. Example:
{"includeDomains":["arxiv.org","github.com"],"excludeDomains":["pinterest.com"]}
Web Search Tool
{"query":"latest developments in AI safety research","num_results":10,"contents":{"text":{"max_characters":20000}}}
Tips:
- Use
type: "auto"for most queries - Great for building search-powered chatbots or agents
- Combine with contents for RAG workflows
Category Examples
Use category filters to search dedicated indexes.
People Search (category: "people")
Find people by role, expertise, or what they work on.
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "software engineer distributed systems", "category": "people", "type": "auto", "num_results": 10 }'
Tips: Use SINGULAR form. Describe what they work on.
Company Search (category: "company")
Find companies by industry, criteria, or attributes.
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "AI startup healthcare", "category": "company", "type": "auto", "num_results": 10 }'
Tips: Use SINGULAR form. Simple entity queries.
News Search (category: "news")
News articles.
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "OpenAI announcements", "category": "news", "type": "auto", "num_results": 10, "contents": { "text": { "max_characters": 20000 } } }'
Tips: Use livecrawl: "preferred" for breaking news.
Research Papers (category: "research paper")
Academic papers.
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "transformer architecture improvements", "category": "research paper", "type": "auto", "num_results": 10, "contents": { "text": { "max_characters": 20000 } } }'
Tips: Includes arxiv.org, paperswithcode.com.
Tweet Search (category: "tweet")
Twitter/X posts.
curl -X POST 'https://api.exa.ai/search' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "query": "AI safety discussion", "category": "tweet", "type": "auto", "num_results": 10, "contents": { "text": { "max_characters": 20000 } } }'
Tips: Good for real-time discussions.
Content Freshness (maxAgeHours)
maxAgeHours sets the maximum acceptable age for cached content.
| Value | Behavior | Best For |
|---|---|---|
| 24 | Use cache if less than 24 hours old, otherwise livecrawl | Daily-fresh content |
| 1 | Use cache if less than 1 hour old, otherwise livecrawl | Near real-time data |
| 0 | Always livecrawl (ignore cache entirely) | Real-time data where cached content is unusable |
| -1 | Never livecrawl (cache only) | Maximum speed, historical/static content |
| (omit) | Default behavior | Recommended — balanced speed and freshness |
Other Endpoints
Beyond /search, Exa offers these endpoints:
| Endpoint | Description | Docs |
|---|---|---|
/contents | Get contents for known URLs | Docs |
/answer | Q&A with citations from web search | Docs |
Example - Get contents for URLs:
POST /contents
{"urls":["https://example.com/article"],"text":{"max_characters":20000}}
Troubleshooting
Results not relevant?
- Try
type: "auto" - Try
type: "deep" - Refine query
- Check category matches your use case
Need structured data from search?
- Use
type: "deep"ortype: "deep-reasoning"withoutputSchema
Results too slow?
- Use
type: "fast" - Reduce
num_results - Skip contents if you only need URLs
No results?
- Remove filters
- Simplify query
- Try
type: "auto"
Resources
- Docs: https://exa.ai/docs
- Dashboard: https://dashboard.exa.ai
- API Status: https://status.exa.ai


