import requests
API_KEY = "你的APIYI_KEY" # 默认分组即可
URL = "https://api.apiyi.com/v1/messages"
HEADERS = {
"content-type": "application/json",
"x-api-key": API_KEY,
"anthropic-version": "2023-06-01",
}
SEARCH_TOOL = {
"name": "web_search",
"description": ("Search the web for current information. Call this whenever "
"the user asks about recent events or anything after your "
"knowledge cutoff. You may call it multiple times."),
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string", "description": "搜索关键词"}},
"required": ["query"],
},
}
def do_search(query: str) -> str:
"""接您选用的搜索 API(Tavily/Brave/Serper 等),返回结果文本。"""
# 以 Tavily 为例:
# r = requests.post("https://api.tavily.com/search",
# json={"api_key": TAVILY_KEY, "query": query, "max_results": 5})
# return "\n".join(f"- {x['title']}\n {x['url']}\n {x['content'][:200]}"
# for x in r.json()["results"])
...
messages = [{"role": "user", "content": "Anthropic 最近发布了什么新模型?请搜索后回答并附来源"}]
for _ in range(5): # 工具循环,最多 5 轮
resp = requests.post(URL, headers=HEADERS, json={
"model": "claude-sonnet-4-6",
"max_tokens": 2048,
"tools": [SEARCH_TOOL],
"messages": messages,
}, timeout=180).json()
if resp.get("stop_reason") != "tool_use":
print(next(b["text"] for b in resp["content"] if b["type"] == "text"))
break
messages.append({"role": "assistant", "content": resp["content"]})
results = [{"type": "tool_result", "tool_use_id": b["id"],
"content": do_search(b["input"]["query"])}
for b in resp["content"] if b["type"] == "tool_use"]
messages.append({"role": "user", "content": results})