第 3 课
接入 Claude Code,再用 Search / Fetch 做带引用的联网问答
用环境变量把 DeepSeek 接进 Claude Code,用 Anthropic SDK 调用,再用官方 Search / Fetch 接口写出先搜索、再带编号引用作答的脚本。
课程目录第 3 / 3 课
学习位置仅保存在当前浏览器,有效期 180 天。
图文教材
本课按 DeepSeek 官方 接入 Claude Code、Anthropic API、网页搜索与抓取 与 V4.1-Flash-1017 发布公告 整理(2026-10-22 核对);Anthropic SDK 与 Search 接口的报错输出为 2026-10-22 实测(anthropic 2.0.0)。 目标:用 DeepSeek 驱动 Claude Code 写代码;用 Anthropic SDK 调 DeepSeek;再用官方 Search / Fetch 接口给自己的应用加上「先搜索、再回答、附来源」的能力。
你将得到什么
- 一组可直接粘贴的 Claude Code 环境变量(Linux / macOS 与 Windows 各一份)
anthropic_call.py:用 Anthropic SDK 调deepseek-flashsearch_answer.py:调 Search 接口拿结果,再让deepseek-flash带编号引用作答- 一张 Search / Fetch 计费与限速速查表
先修:已完成第 1 课;本机有 Node.js 18+(Windows 还需 Git for Windows)。
一、把 DeepSeek 接进 Claude Code
DeepSeek 提供 Anthropic 兼容地址 https://api.deepseek.com/anthropic,Claude Code 只要改环境变量就能用 DeepSeek 模型。
1. 安装 Claude Code(已安装可跳过):
npm install -g @anthropic-ai/claude-code
claude --version
对照结果:打印出版本号即安装成功。
2. 配置环境变量(官方推荐配置,<your DeepSeek API Key> 换成你的 key)。Linux / macOS:
export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_AUTH_TOKEN=<your DeepSeek API Key>
export ANTHROPIC_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-flash
export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-flash
export CLAUDE_CODE_EFFORT_LEVEL=max
export CLAUDE_CODE_AUTO_COMPACT_WINDOW=786432
Windows PowerShell:
$env:ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
$env:ANTHROPIC_AUTH_TOKEN="<your DeepSeek API Key>"
$env:ANTHROPIC_MODEL="deepseek-flash[1m]"
$env:ANTHROPIC_DEFAULT_OPUS_MODEL="deepseek-flash[1m]"
$env:ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-flash[1m]"
$env:ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-flash"
$env:CLAUDE_CODE_SUBAGENT_MODEL="deepseek-flash"
$env:CLAUDE_CODE_EFFORT_LEVEL="max"
$env:CLAUDE_CODE_AUTO_COMPACT_WINDOW="786432"
每一行的作用:
| 变量 | 作用 |
|---|---|
ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN | 请求改发到 DeepSeek,并用 DeepSeek 的 key 鉴权 |
ANTHROPIC_MODEL 与三个 DEFAULT_*_MODEL | 主模型和 Opus / Sonnet / Haiku 档位都用 deepseek-flash;[1m] 表示使用 1M 上下文 |
CLAUDE_CODE_SUBAGENT_MODEL | 子智能体也用 deepseek-flash |
CLAUDE_CODE_EFFORT_LEVEL | 思考强度设为 max |
CLAUDE_CODE_AUTO_COMPACT_WINDOW | 自动压缩对话所参照的上下文窗口(786432 = 768K token) |
这些 export 只对当前终端有效;想长期使用,把它们写进 ~/.bashrc 或 ~/.zshrc。
3. 进入项目启动:
cd /path/to/my-project
claude
进入后可以先让它做一件只读的小事验证连通,例如输入:
用三句话概括这个仓库的文件夹结构,不要修改任何文件。
对照结果:Claude Code 读取项目文件后用中文给出概括。到 DeepSeek 开放平台查看用量,能看到这次会话产生的 deepseek-flash 调用。
两个要知道的细节:
- 模型映射:如果你不改模型变量、仍传 Claude 模型名,DeepSeek 会自动映射:
claude-opus开头的映射到deepseek-v4-pro(按 V4 Pro 计价),claude-sonnet/claude-haiku开头的映射到deepseek-flash。上面的配置把所有档位都指向 Flash,费用最低。 - 联网搜索:在 Claude Code 里提问需要联网时,模型会调用 Web Search,由 DeepSeek 的搜索接口完成。官方公告写明:这部分 Search / Fetch 调用目前不计费,北京时间 2026 年 11 月 1 日 00:00 起按次收费(另有总结搜索结果产生的 token 费用)。
二、用 Anthropic SDK 调 DeepSeek
已经在用 Anthropic SDK 的应用,改两个环境变量就能切到 DeepSeek:
pip3 install anthropic
export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_API_KEY=$DEEPSEEK_API_KEY
新建 anthropic_call.py(官方示例):
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="deepseek-flash",
max_tokens=1000,
system="You are a helpful assistant.",
messages=[
{
"role": "user",
"content": [{"type": "text", "text": "Hi, how are you?"}],
}
],
)
print(message.content)
python3 anthropic_call.py
对照结果:打印一个内容块列表(message.content),其中 type='text' 的 TextBlock 里就是模型的回答。
key 不对时(2026-10-22 实测,最后一行):
anthropic.AuthenticationError: Error code: 401 - {'error': {'message': 'Authentication Fails, Your api key: ****-key is invalid (request_id: 713a720a-be32-4e14-946e-cfb797b2ebb2)', 'type': 'authentication_error', 'param': None, 'code': 'invalid_request_error'}}
注意:model 写不以 claude 开头、又不是 DeepSeek 模型名的值,会直接返回 400。Anthropic 格式下调思考强度用 output_config,例如 {"effort": "high"}。
三、Search 接口:用 DeepSeek 自研搜索引擎搜网页
V4.1-Flash-1017 发布时,DeepSeek 把网页端一直在用的自研搜索引擎开放为 API。鉴权和对话接口相同,都是 Bearer key。
curl https://api.deepseek.com/v1/tools/search \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "DeepSeek V4 模型 发布",
"count": 5,
"need_content": true
}'
对照结果(官方文档示例,results 数组每项结构如下;content 只在 need_content 为 true 时有值):
{
"results": [
{
"rerank_score": 2.4,
"title": "DeepSeek V4 模型发布",
"url": "https://example.com/deepseek-v4",
"snippet": "DeepSeek V4 已上线,支持工具调用与长上下文。",
"summary": "DeepSeek 发布了 V4 模型。此次发布改进了工具调用与长上下文能力,适合 Agent 工作流。",
"content": "DeepSeek V4 现已正式上线……",
"site_name": "Example News",
"site_icon": "https://example.com/favicon.ico",
"date": "2026-06-01T00:00:00+00:00",
"authority": 3
}
]
}
| 字段 | 用法 |
|---|---|
snippet | 100–200 字短摘要,适合前端展示 |
summary | 600–800 字长摘要,适合直接喂给模型 |
rerank_score | 0–3 分,≥1.5 为优质结果 |
authority | 0–4(-1 表示未知),≥3 为极权威来源 |
date | UTC 的 RFC 3339 时间,未知时为 null |
请求参数:query 必填(1–128 个字符);count 为 1–50,默认 10;need_content 默认 false。query 里可以直接用搜索语法,常用的有:
DeepSeek site:github.com OR site:huggingface.co
DeepSeek -site:example.com
DeepSeek lang:zh,en
DeepSeek after:2026-01-01
DeepSeek "精确短语"
用假 key 调用的样子(2026-10-22 实测,HTTP 401):
{"error":{"message":"Authentication Fails, Your api key: ****-key is invalid (request_id: eff7c3cb-f7ed-47c7-bff8-d6f7e369d20c)","type":"authentication_error","param":null,"code":"invalid_request_error"}}
四、Fetch 接口:把一个网页抓成 Markdown
curl https://api.deepseek.com/v1/tools/fetch \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://api-docs.deepseek.com/zh-cn/guides/search"}'
对照结果(结构同官方示例;下面的 title 与 content 开头按该页面实际内容示意,content 是整页 Markdown 正文):
{
"title": "网页搜索与抓取 | DeepSeek API Docs",
"content": "# 网页搜索与抓取\n\nSearch 接口和 Fetch 接口为 Agent 与 RAG 应用提供实时网页内容……"
}
url 必须是含 host 的 http/https 地址,不能带用户名密码。抓不到可用正文时返回 404,被安全策略拒绝时返回 403;这两种属于不改请求就不要重试的错误。
五、组合起来:先搜索,再带引用作答
下面把 Search 接口和第 1 课的对话接口串起来:先搜 5 条结果,把 summary 编号后交给 deepseek-flash,要求回答时用 [1]、[2] 标注来源。新建 search_answer.py:
import os
import sys
import requests
from openai import OpenAI
KEY = os.environ["DEEPSEEK_API_KEY"]
question = sys.argv[1] if len(sys.argv) > 1 else "DeepSeek V4.1 Flash 1017 有哪些更新?"
# 1) 搜索:拿 5 条结果的长摘要
r = requests.post(
"https://api.deepseek.com/v1/tools/search",
headers={"Authorization": f"Bearer {KEY}"},
json={"query": question, "count": 5, "ori_question": question},
timeout=60,
)
r.raise_for_status()
results = r.json()["results"]
sources = "\n\n".join(
f"[{i}] {x['title']}\n{x['url']}\n{x['summary']}" for i, x in enumerate(results, 1)
)
# 2) 作答:只依据搜索结果,用编号标注来源
client = OpenAI(api_key=KEY, base_url="https://api.deepseek.com")
resp = client.chat.completions.create(
model="deepseek-flash",
messages=[
{"role": "system", "content": "只根据给出的搜索结果回答,用中文,每个事实后用 [编号] 标注来源;结果里没有的就说不知道。"},
{"role": "user", "content": f"问题:{question}\n\n搜索结果:\n{sources}"},
],
extra_body={"thinking": {"type": "disabled"}},
)
print(resp.choices[0].message.content)
print("\n来源:")
for i, x in enumerate(results, 1):
print(f"[{i}] {x['url']}")
pip3 install requests openai
python3 search_answer.py "DeepSeek V4.1 Flash 1017 有哪些更新?"
对照结果(结构如下;具体内容取决于当时的搜索结果):
DeepSeek V4.1 Flash 已更新到 1017 版本,网页端、App 与 API 同步切换 [1]……同时开放了 Search 与 Fetch 接口,价格为 5 元 / 千次 [2]……
来源:
[1] https://api-docs.deepseek.com/zh-cn/news/news261017
[2] (第 2 条搜索结果的网址)
这里用 ori_question 把用户原问题一起传给搜索接口,官方说明这有助于理解搜索意图;作答时关掉思考模式,是因为这一步主要是归纳,不需要长推理。
六、计费与限速速查
| 项目 | Search | Fetch |
|---|---|---|
| 价格 | 5 元 / 千次成功请求 | 5 元 / 千次成功请求 |
| 账号 QPS 上限 | 100 | 25(另有目标域名限速) |
| 什么时候不计费 | 请求失败、无结果、超时 | 请求失败、无正文、超时 |
- 只有 HTTP 200 且有结果的请求计费;
count多少不影响单价。 - 遇到 408、429、5xx 等待后重试;402 先充值;其他 4xx 不改请求就不要重试。
- Claude Code / Codex / DeepSeek Harness 里由服务端自动发起的搜索,2026 年 11 月 1 日 00:00(北京时间)起也按上表计费。
本课检查清单
- Claude Code 用 DeepSeek 完成了一次只读任务
-
anthropic_call.py打印出了 TextBlock - Search curl 返回了
results数组,并能说出snippet与summary的区别 -
search_answer.py输出了带 [编号] 的回答和来源列表
学完三课,你已经能用 DeepSeek 完成「直接调用 → 思考与工具调用 → 接入编码 Agent 与联网搜索」这一整套流程。价格和模型名以后还会变,动手前先看一眼官方「模型 & 价格」页。
