refactor: skill 脚本输出改为结构化 JSON
- query_weather: {location, now: {temp,text}, forecast: [{date,day,night,tempMin,tempMax}]}
- search_web: {query, answer, results: [{title,url,content}]}
- get_current_datetime: {datetime}
- list_scheduled_tasks: {tasks: [{name,description,enabled,command,...}]}
- manage_scheduled_task: {ok, action, name} / {error}
LLM 直接看到结构化数据,不再依赖脚本拼接的中文自然语言
This commit is contained in:
@@ -1,54 +1,29 @@
|
||||
#!/bin/bash
|
||||
# Tavily 搜索
|
||||
|
||||
# Tavily 搜索 → JSON 输出
|
||||
read -r input
|
||||
QUERY=$(echo "$input" | python3 -c "
|
||||
import sys, json
|
||||
d = json.load(sys.stdin)
|
||||
print(d.get('query', ''))
|
||||
" 2>/dev/null)
|
||||
QUERY=$(echo "$input" | python3 -c "import sys,json; print(json.load(sys.stdin).get('query',''))" 2>/dev/null)
|
||||
COUNT=$(echo "$input" | python3 -c "import sys,json; print(json.load(sys.stdin).get('count',5))" 2>/dev/null)
|
||||
|
||||
COUNT=$(echo "$input" | python3 -c "
|
||||
import sys, json
|
||||
d = json.load(sys.stdin)
|
||||
print(d.get('count', 5))
|
||||
" 2>/dev/null)
|
||||
|
||||
if [ -z "$QUERY" ]; then
|
||||
echo "请提供 query 参数"
|
||||
exit 1
|
||||
fi
|
||||
[ -z "$QUERY" ] && echo '{"error":"请提供 query 参数"}' && exit 0
|
||||
|
||||
API_KEY="${TAVILY_API_KEY}"
|
||||
if [ -z "$API_KEY" ]; then
|
||||
echo "请设置 TAVILY_API_KEY 环境变量"
|
||||
exit 1
|
||||
fi
|
||||
[ -z "$API_KEY" ] && echo '{"error":"请设置 TAVILY_API_KEY"}' && exit 0
|
||||
|
||||
RESP=$(curl -s -X POST "https://api.tavily.com/search" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"api_key\":\"$API_KEY\",\"query\":\"$QUERY\",\"max_results\":$COUNT,\"include_answer\":true}")
|
||||
|
||||
# 解析并输出
|
||||
ANSWER=$(echo "$RESP" | python3 -c "
|
||||
import sys, json
|
||||
d = json.load(sys.stdin)
|
||||
answer = d.get('answer', '')
|
||||
results = d.get('results', [])
|
||||
lines = []
|
||||
if answer:
|
||||
lines.append(f'总结: {answer}')
|
||||
lines.append('')
|
||||
for i, r in enumerate(results[:$COUNT], 1):
|
||||
title = r.get('title', '无标题')
|
||||
url = r.get('url', '')
|
||||
content = r.get('content', '')[:200]
|
||||
lines.append(f'{i}. {title}')
|
||||
lines.append(f' {url}')
|
||||
if content:
|
||||
lines.append(f' {content}')
|
||||
lines.append('')
|
||||
print('\\n'.join(lines))
|
||||
" 2>/dev/null)
|
||||
|
||||
echo "$ANSWER"
|
||||
export RESP QUERY COUNT
|
||||
python3 -c "
|
||||
import os, json
|
||||
d = json.loads(os.environ['RESP'])
|
||||
result = {
|
||||
'query': os.environ['QUERY'],
|
||||
'answer': d.get('answer', ''),
|
||||
'results': [
|
||||
{'title': r.get('title', ''), 'url': r.get('url', ''), 'content': r.get('content', '')[:300]}
|
||||
for r in d.get('results', [])[:int(os.environ['COUNT'])]
|
||||
]
|
||||
}
|
||||
print(json.dumps(result, ensure_ascii=False))
|
||||
" 2>/dev/null || echo '{"error":"搜索请求失败"}'
|
||||
|
||||
Reference in New Issue
Block a user