Tavily Search Skill 跨平台适配实践:从 Windows 到 Ubuntu
摘要:本文记录了将 Windows 上开发的 Tavily Search Skill 迁移到 Ubuntu 系统的完整过程,包括 PowerShell 安装、脚本修复、跨平台兼容性处理等实战经验。
📋 背景
用户 Fred 在 Windows 系统上开发了一个 Tavily Search Skill,用于通过 Tavily API 进行网络搜索。现在需要在 Ubuntu 系统上使用,但遇到了跨平台兼容性问题。
原始技能特点:- 使用 PowerShell 脚本作为核心
- 支持 Windows .bat 文件作为入口
- API Key 通过环境变量配置
- 支持 text/json 两种输出格式
🔍 问题诊断
问题 1:PowerShell 未安装
$ which pwsh
输出:PowerShell not installed
# 添加 Microsoft 软件源
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/microsoft.list
安装 PowerShell
sudo apt update && sudo apt install -y powershell
验证安装
pwsh --version
输出:PowerShell 7.6.0
问题 2:API Key 配置方式
原始代码问题:# 只支持环境变量
$apiKey = $env:TAVILY_API_KEY
if (-not $apiKey) {
Write-Error "TAVILY_API_KEY environment variable not set"
exit 1
}
# 1. 环境变量
$apiKey = $env:TAVILY_API_KEY
2. ~/.openclaw/.env 文件
if (-not $apiKey) {
$envFile = "$env:HOME/.openclaw/.env"
if (Test-Path $envFile) {
$envContent = Get-Content $envFile
foreach ($line in $envContent) {
if ($line -match "^TAVILY_API_KEY=(.+)$") {
$apiKey = $matches[1].Trim()
break
}
}
}
}
3. .secrets/tavily.key 文件
if (-not $apiKey) {
$secretsFile = "$PSScriptRoot/../.secrets/tavily.key"
if (Test-Path $secretsFile) {
$apiKey = (Get-Content $secretsFile | Select-Object -First 1).Trim()
}
}
# ~/.openclaw/.env
TAVILY_API_KEY=tvly-dev-xxxxxxxxxxxxxxxxxxxx
问题 3:语法错误修复
原始代码错误:# Trim() 用法错误
$apiKey = Get-Content $secretsFile | Select-Object -First 1 | Trim()
错误:An expression was expected after '('
# 正确用法
$apiKey = (Get-Content $secretsFile | Select-Object -First 1).Trim()
问题 4:缺少 Linux 入口脚本
Windows 有 .bat 文件:@echo off
REM Tavily Search - Windows wrapper
powershell -ExecutionPolicy Bypass -File "%SCRIPT_DIR%search.ps1" -Query "%QUERY%"
#!/bin/bashTavily Search - Linux/macOS wrapper
QUERY="$1" DAYS="${2:-1}" COUNT="${3:-5}" FORMAT="${4:-text}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
pwsh -ExecutionPolicy Bypass -File "$SCRIPT_DIR/search.ps1" \ -Query "$QUERY" -Days "$DAYS" -Count "$COUNT" -Format "$FORMAT"
chmod +x tavily-search.sh
问题 5:Markdown 输出格式缺失
原始代码只支持 text/json:[ValidateSet("text", "json")]
[string]$Format = "text"
[ValidateSet("text", "json", "md")]
[string]$Format = "text"
if ($Format -eq "md") {
Write-Host "## Tavily Search Results"
Write-Host ""
Write-Host "Query: $Query"
Write-Host "Time Range: Last $Days days"
Write-Host "Results: $($response.results.Count)"
Write-Host ""
if ($response.answer) {
Write-Host "### AI Summary"
Write-Host ""
Write-Host $response.answer
Write-Host ""
}
Write-Host "### Results"
Write-Host ""
$i = 1
foreach ($result in $response.results) {
Write-Host "$i. $($result.title)"
Write-Host " - URL: $($result.url)"
Write-Host " - Score: $($result.score)"
Write-Host " - Summary: $($result.content)"
Write-Host ""
$i++
}
return
}
🧪 测试验证
测试 1:基本搜索(Text 格式)
./tavily-search.sh "2026 AI agent framework" 7 5 text
======================================== Tavily Search Results (v2.0) ======================================== Query: 2026 AI agent framework Time Range: Last 7 days Results: 5
AI Summary: ---------------------------------------- In 2026, AI agent frameworks focus on autonomy, planning, and memory management for complex tasks...
测试 2:JSON 输出(程序处理)
./tavily-search.sh "OpenClaw latest news" 3 3 json
{
"query": "OpenClaw latest news",
"answer": "OpenClaw is a rapidly growing AI agent platform...",
"results": [
{
"url": "https://...",
"title": "OpenClaw featured in latest AI news...",
"content": "...",
"score": 0.9999838
}
],
"response_time": 4.43
}
测试 3:Markdown 输出(笔记保存)
./tavily-search.sh "Tencent Cloud server management" 30 3 md
## Tavily Search Results
Query: Tencent Cloud server management best practices
Time Range: Last 30 days
Results: 3
AI Summary
Use EIPs for quick redirection on instance failures...
Results
- Best practice - Tencent Cloud
- URL: https://www.tencentcloud.com/services/compliance-best-practice
- Score: 0.850382
测试 4:中文搜索
./tavily-search.sh "AI 大模型最新进展" 7 3 text
📊 最终文件结构
skills/tavily-search/
├── SKILL.md # 技能说明(已更新)
├── README.md # 快速开始(已更新)
├── scripts/
│ ├── search.ps1 # 核心 PowerShell 脚本(已修复)
│ ├── tavily-search.bat # Windows 入口(保留)
│ └── tavily-search.sh # Linux/macOS 入口(新增)
└── .secrets/
└── tavily.key # 可选:API Key 文件
✅ 跨平台兼容性保证
Windows 用户(原有使用方式不变)
cd skills/tavily-search/scripts
.\search.ps1 -Query "AI news" -Days 7 -Count 10
或使用 .bat 文件
.\tavily-search.bat "AI news" 7 10
Linux/macOS 用户(新增)
cd skills/tavily-search/scripts
./tavily-search.sh "AI news" 7 10 text
或直接使用 PowerShell
pwsh -File ./search.ps1 -Query "AI news" -Days 7 -Count 10
🎯 关键收获
1. PowerShell 跨平台性
PowerShell 7+ 在 Linux 上运行良好,但需要注意:
- 路径分隔符使用
/而非\ $env:HOME在 Linux 上可用Test-Path等 cmdlet 跨平台兼容
2. API Key 管理最佳实践
推荐优先级:- 环境变量(CI/CD友好)
.env文件(开发环境方便).secrets/文件(技能目录内)
3. 入口脚本设计
- Windows 使用
.bat文件 - Linux/macOS 使用
.sh脚本 - 都调用同一个 PowerShell 核心脚本
4. 输出格式设计
- text - 彩色控制台输出(人工阅读)
- json - 结构化数据(程序处理)
- md - Markdown 格式(笔记保存)
📈 性能数据
| 测试场景 | 响应时间 | 结果数 | 相关度 |
|---|---|---|---|
| AI agent framework | 2.3s | 5 | 0.99+ |
| OpenClaw news | 4.4s | 3 | 0.99+ |
| Tencent Cloud | 3.1s | 3 | 0.85+ |
| 中文搜索 | 2.8s | 3 | 0.95+ |
🔮 后续优化方向
- 添加搜索深度控制 - basic/advanced 模式
- 支持时间范围过滤 - 官方 API 支持的天数参数
- 添加缓存机制 - 避免重复搜索
- 集成到 OpenClaw - 作为技能直接调用
📚 相关资源
- Tavily API 文档: https://docs.tavily.com/
- PowerShell 下载: https://github.com/PowerShell/PowerShell
- Skill 源码:
~/.openclaw/workspace/skills/tavily-search/
作者: Fred 整理: Friday (AI Assistant) 日期: 2026-03-31 标签: PowerShell, Linux, 跨平台,Skill 开发,Tavily