Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
3.2 KiB
3.2 KiB
title, tags, aliases, source
| title | tags | aliases | source | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 添加网络搜索引擎 |
|
|
添加新的网络搜索引擎.md |
添加新的网络搜索引擎
本文档说明如何在 WeKnora 中添加一个新的网络搜索引擎类型(如 Brave Search、Searx 等)。
架构概述
搜索引擎的 API 端点硬编码在代码中,不向用户暴露 BaseURL,从源头消除 SSRF 风险。
internal/types/web_search_provider.go # 实体定义 + Provider 类型元数据
internal/infrastructure/web_search/ # Provider 实现(bing/google/duckduckgo/tavily)
internal/container/container.go # DI 注册
internal/types/interfaces/web_search.go # WebSearchProvider 接口
类似的扩展开发模式参见 集成向量数据库
步骤
以添加 Brave Search 为例:
1. 注册类型常量
在 internal/types/web_search_provider.go 中添加:
WebSearchProviderTypeBrave WebSearchProviderType = "brave"
2. 添加类型元数据
在 GetWebSearchProviderTypes() 中添加:
{
ID: "brave", Name: "Brave Search", Free: false,
RequiresAPIKey: true, Description: "Brave Search API",
DocsURL: "https://brave.com/search/api/",
}
3. 创建 Provider 实现
新建 internal/infrastructure/web_search/brave.go:
- 构造函数签名:
func(types.WebSearchProviderParameters) (interfaces.WebSearchProvider, error) - API 端点硬编码为常量
- 实现
interfaces.WebSearchProvider接口:Name()和Search()
4. 添加参数校验
在 isValidProviderType() 中添加新类型。
5. DI 注册
在 registerWebSearchProviders 中注册。
6. 验证
go build ./...
# 调用 API 验证
curl http://localhost:8080/api/v1/web-search-providers/types
需要额外参数的情况
如果新引擎需要 API Key 以外的参数:
- 方式一:使用
WebSearchProviderParameters.ExtraConfig字段 - 方式二:在
WebSearchProviderParameters中添加专用字段
文件变更清单
| 文件 | 操作 |
|---|---|
internal/types/web_search_provider.go |
添加常量 + 类型元数据 |
internal/infrastructure/web_search/brave.go |
新建 Provider 实现 |
internal/application/service/web_search_provider.go |
isValidProviderType 加新类型 |
internal/container/container.go |
registerWebSearchProviders 注册 |