跳到主要内容Ubuntu22.04 安装与配置 OpenClaw AI 助手教程 | 极客日志Shell / BashAI
Ubuntu22.04 安装与配置 OpenClaw AI 助手教程
介绍在 Ubuntu 22.04 系统上安装和配置 OpenClaw AI 助手的步骤。内容包括一键安装脚本、模型接入(DeepSeek、GLM、MiniMax 等)、通讯渠道配置(飞书、钉钉)以及 Web 搜索功能(Exa)的设置。通过配置多模型切换和工具调用,实现 AI 辅助编程与任务自动化。
魔尊37 浏览 Ubuntu22.04 安装 OpenClaw
本项目旨在通过安装 OpenClaw,利用 AI 辅助实现 Gnuradio 移植、FPGA 程序编写、射频及 ARM Linux 编程。
准备工作
请参考官网获取最新信息:https://clawd.org.cn/
一键安装
curl -fsSL https://clawd.org.cn/install.sh | sudo bash
设置通道 配置飞书
创建成功后记录 App ID 和 App Secret。在后续安装终端中填入 App ID 和 Secret。
openclaw-cn configure --section channels
如有问题,运行 openclaw-cn onboard --install-daemon 重新配置。
若 Gateway 未安装导致无法打开网页端,执行以下命令安装必备工具:
sudo apt install net-tools
让 ai 员工更好用
加入免费的模型
在控制台新建 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-cn gateway restart
配置钉钉
- 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 和豆包模型
之后配置 openclaw.json 即可接入多个大模型。
配置 web 搜索
将 API Key 告知 OpenClaw 进行配置:
export EXA_API_KEY="YOUR_API_KEY"
openclaw-cn gateway restart
.env File
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}}}
- 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")
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")
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.
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
- Try
type: "auto"
- Try
type: "deep"
- Refine query
- Check category matches your use case
Need structured data from search?
- Use
type: "deep" or type: "deep-reasoning" with outputSchema
- Use
type: "fast"
- Reduce
num_results
- Skip contents if you only need URLs
- Remove filters
- Simplify query
- Try
type: "auto"
Resources
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online