From d781d61907536c9f7dc0e27b35fd585f8435494b Mon Sep 17 00:00:00 2001 From: Hk-Gosuto Date: Sat, 12 Oct 2024 17:59:12 +0800 Subject: [PATCH] feat: #311 --- README.md | 6 ++++++ app/api/langchain-tools/duckduckgo_search.ts | 11 +++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 90786f40b34..797078c5b08 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,12 @@ - ⚠ 注意:已知在 vercel 环境下会出现调用不稳定的情况 https://github.com/Hk-Gosuto/ChatGPT-Next-Web-LangChain/issues/89#issuecomment-1868887904 - DuckDuckGo + + - 环境变量:`DDG_API_PROXY_PREFIX` + + 配置后将在 DuckDuckGo 插件相关接口前拼接配置内容,如:`DDG_API_PROXY_PREFIX=https://example.com/` 则最终请求为:`https://example.com/https://duckduckgo.com` + + 可以结合类似 1234567Yang/cf-proxy-ex 这类代理项目来实现 DuckDuckGo 插件相关接口的代理 - 计算 - [Calculator](https://api.js.langchain.com/classes/langchain_tools_calculator.Calculator.html) diff --git a/app/api/langchain-tools/duckduckgo_search.ts b/app/api/langchain-tools/duckduckgo_search.ts index 01b1fe79334..0e54b089e8a 100644 --- a/app/api/langchain-tools/duckduckgo_search.ts +++ b/app/api/langchain-tools/duckduckgo_search.ts @@ -2,6 +2,8 @@ import { decode } from "html-entities"; import { convert as htmlToText } from "html-to-text"; import { Tool } from "@langchain/core/tools"; +const API_PROXY_PREFIX = process.env.DDG_API_PROXY_PREFIX ?? ""; + const SEARCH_REGEX = /DDG\.pageLayout\.load\('d',(\[.+\])\);DDG\.duckbar\.load\('images'/; const IMAGES_REGEX = @@ -325,7 +327,7 @@ async function search( }; const response = await fetch( - `https://links.duckduckgo.com/d.js?${queryString(queryObject)}`, + `${API_PROXY_PREFIX}https://links.duckduckgo.com/d.js?${queryString(queryObject)}`, ); const data = await response.text(); @@ -369,7 +371,7 @@ async function search( description: decode(search.a), rawDescription: search.a, hostname: search.i, - icon: `https://external-content.duckduckgo.com/ip3/${search.i}.ico`, + icon: `${API_PROXY_PREFIX}https://external-content.duckduckgo.com/ip3/${search.i}.ico`, url: search.u, bang, }); @@ -456,7 +458,7 @@ function queryString(query: Record) { async function getVQD(query: string, ia = "web") { try { const response = await fetch( - `https://duckduckgo.com/?${queryString({ q: query, ia })}`, + `${API_PROXY_PREFIX}https://duckduckgo.com/?${queryString({ q: query, ia })}`, ); const data = await response.text(); return VQD_REGEX.exec(data)![1]; @@ -516,16 +518,13 @@ export class DuckDuckGo extends Tool { const searchResults = await search(input, { safeSearch: SafeSearchType.OFF, }); - if (searchResults.noResults) { return "No good search result found"; } - const results = searchResults.results .slice(0, this.maxResults) .map(({ title, description, url }) => htmlToText(description)) .join("\n\n"); - return results; }