操作步骤

1. 新建工具:点击左下角用户名,进入工作空间->工具,创建工具,粘贴下方代码并保存

2. 填入API Key:在工具列表中点击该工具的“配置项”图标(齿轮),填入“Deepseek Api Key”并保存

3. 启用工具:聊天输入框点击扩展功能->工具,开启“DeepSeek 联网搜索”;或在设置中编辑模型并选择该工具,此后所有使用该模型的对话自动可用

工具代码

"""
title: DeepSeek 联网搜索
description: 调用 DeepSeek 官方 Search / Fetch API,为模型提供实时网页检索能力
version: 1.0.0
requirements: requests
license: MIT
"""

import requests
from pydantic import BaseModel, Field


class Tools:
    class Valves(BaseModel):
        DEEPSEEK_API_KEY: str = Field(
            default="",
            description="DeepSeek API Key,在 platform.deepseek.com 的 API Keys 页面创建",
        )
        RESULT_COUNT: int = Field(
            default=5,
            description="每次搜索返回的结果条数(1-50,默认 10)",
        )
        NEED_CONTENT: bool = Field(
            default=False,
            description="是否让搜索接口直接返回网页正文(开启后正文较长,可能占用较多上下文)",
        )

    def __init__(self):
        self.valves = self.Valves()
        self.citation = True

    def deepseek_search(self, query: str) -> str:
        """
        使用 DeepSeek 官方搜索引擎检索实时网页信息。当用户的问题涉及新闻、最新动态、
        实时数据、价格等模型训练数据覆盖不到的内容时,必须先调用本工具检索,再依据结果作答。
        :param query: 搜索查询词(1-128 个字符,支持 site:、lang:、after:、before: 等语法)
        :return: 结构化搜索结果,包含标题、链接与摘要
        """
        if not self.valves.DEEPSEEK_API_KEY:
            return "错误:请先在工具设置(Valves)中填入 DEEPSEEK_API_KEY。"
        try:
            resp = requests.post(
                "https://api.deepseek.com/v1/tools/search",
                headers={
                    "Authorization": f"Bearer {self.valves.DEEPSEEK_API_KEY}",
                    "Content-Type": "application/json",
                },
                json={
                    "query": query,
                    "count": self.valves.RESULT_COUNT,
                    "need_content": self.valves.NEED_CONTENT,
                },
                timeout=30,
            )
            resp.raise_for_status()
            results = resp.json().get("results", [])
            if not results:
                return "未搜索到相关结果,请更换查询词重试。"
            lines = []
            for i, r in enumerate(results):
                entry = (
                    f"[{i + 1}] {r.get('title', '')}\n"
                    f"链接:{r.get('url', '')}\n"
                    f"日期:{r.get('date', '') or '未知'}\n"
                    f"摘要:{r.get('summary') or r.get('snippet', '')}"
                )
                content = r.get("content")
                if content:
                    entry += f"\n正文:{content[:2000]}"
                lines.append(entry)
            return "\n\n".join(lines)
        except Exception as e:
            return f"搜索失败:{e}"

    def deepseek_fetch(self, url: str) -> str:
        """
        抓取指定网页的正文内容(返回 Markdown)。当需要阅读某个搜索结果
        或用户给出的具体链接时调用。
        :param url: 要抓取的网页地址(HTTP/HTTPS)
        :return: 网页标题与正文内容
        """
        if not self.valves.DEEPSEEK_API_KEY:
            return "错误:请先在工具设置(Valves)中填入 DEEPSEEK_API_KEY。"
        try:
            resp = requests.post(
                "https://api.deepseek.com/v1/tools/fetch",
                headers={
                    "Authorization": f"Bearer {self.valves.DEEPSEEK_API_KEY}",
                    "Content-Type": "application/json",
                },
                json={"url": url},
                timeout=30,
            )
            resp.raise_for_status()
            page = resp.json()
            return f"标题:{page.get('title', '')}\n\n{page.get('content', '')}"
        except Exception as e:
            return f"抓取失败:{e}"

参考文档:
DeepSeek 网页搜索与抓取
OpenWebUI 官方文档

标签: none