diff --git a/README-EN.md b/README-EN.md
index e8eec67..f80fdf4 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -7,6 +7,7 @@
# Version Updates
+- V0.2.2, 20240420, support Moonshot API
- V0.2.1, 20240310, supports Google, Bing, Duckduckgo, Search1API for news-type searches; supports adjusting the number of search results via the MAX_RESULTS environment variable; supports adjusting the number of in-depth searches desired via the CRAWL_RESULTS environment variable.
- V0.2.0,20240310,Optimized openai.js, cloudflare worker version, really faster this time!
- V0.1.9, 20240318, optimized the handling of streams in openai.js for faster speed, recommend updating; fixed the audio issue in the server deployment version; added a sponsored button on Github.
@@ -16,13 +17,11 @@
- V0.1.5, 20240205, supports news search, making it more convenient to quickly browse news
- V0.1.4, 20240120, Supports one-click deployment with Zeabur, very convenient, highly recommended!
- V0.1.3, 20240120, Supports local deployment, can be deployed on your own server
-- V0.1.2, 20240115, Fixes streaming output issues in non-search scenarios for the cloudflare worker version
-- V0.1.1, 20240114, Supports one-click deployment with Vercel, currently suitable for those who like tinkering
For more historical updates, please see [Version History](https://github.com/fatwang2/search2ai/releases)
-# Product Introduction
-- search2ai, so that your LLM API support networking, search, news, web page summarization, has supported OpenAI, Gemini, the big model will be based on your input to determine whether the network, not every time the network search, do not need to install any plug-ins, do not need to replace the key, directly in your commonly used OpenAI/Gemini three-way client replacement of custom You can directly replace the customized address in your usual OpenAI/Gemini three-way client, and also support self-deployment, which will not affect the use of other functions, such as drawing, voice, etc.
+# S2A
+Help your LLM API support networking, search, news, web page summarization, has supported OpenAI, Gemini, Moonshot, the big model will be based on your input to determine whether the network, not every time the network search, do not need to install any plug-ins, do not need to replace the key, directly in your commonly used OpenAI/Gemini three-way client replacement of custom You can directly replace the customized address in your usual OpenAI/Gemini three-way client, and also support self-deployment, which will not affect the use of other functions, such as drawing, voice, etc.
@@ -35,33 +34,26 @@ For more historical updates, please see [Version History](https://github.com/fat
+# Features
+| Model | Features | Stream | Deployments |
+| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `OpenAI` | search, news, crawler | stream, unstream| Zeabur, Local deployment, Cloudflare Worker, Vercel|
+| `Gemini` | search | stream, unstream| Cloudflare Worker|
+| `Moonshot` | search, news, crawler | unstream| Zeabur, Local deployment, Cloudflare Worker, Vercel|
-# How to Use
-**Direct use: Replace the custom domain in the client with the following address**
+# Usage
+**Replace the custom domain in any client with the following address**
-OpenAI
-```
-https://api.search2ai.online
-```
-Gemini
-```
-https://geminiapi.search2ai.online
-```
-As shown in the picture
- |
|
-Demo site experience address:
-- [OpenAI](https://search2ai.online/demo), follow the instructions to use your key, replace the custom domain
-- [Gemini](https://search2ai.online/gemini)
+# Deployment
+**Zeabur**
-**One-Click Deployment with Zeabur (Highly Recommended)**
-
-Click the button for one-click deployment, default duckduckgo search, can be switched on your own
+Click the button for one-click deployment, switched on your own environment variables
[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/A4HGYF?referralCode=fatwang2)
@@ -69,34 +61,12 @@ To keep the project updated, it is recommended to fork this repository first, th
[![Deployed on Zeabur](https://zeabur.com/deployed-on-zeabur-dark.svg)](https://zeabur.com?referralCode=fatwang2&utm_source=fatwang2&utm_campaign=oss)
-Environment variables
-- SEARCH_SERVICE: temporarily supports search1api, google, bing, serpapi, serper, duckduckgo, required
-- APIBASE: if you are using OpenAI three-way proxy, you can fill in here, note that you do not need to add v1, non-required!
-- MAX_RESULTS:the results of search
-- CRAWL_RESULTS:the reults of search you want to crawl
-- SEARCH1API_KEY: such as the selection of search1api required, I build their own search services, 0.99 U.S. dollars / 1000 times per month, the application address https://search21api.com
-- BING_KEY: Required if choosing bing search, please search for tutorials, application address https://search2ai.online/bing
-- GOOGLE_CX: Required if choosing Google search, Search engine ID, please search for tutorials, application address https://search2ai.online/googlecx
-- GOOGLE_KEY: Required if choosing Google search, API key, application address https://search2ai.online/googlekey
-- SERPAPI_KEY: Required if choosing serpapi, free 100 times/month, registration address https://search2ai.online/serpapi
-- SERPER_KEY: Required if choosing serper, free 2500 times for 6 months, note variable name is different from above, registration address https://search2ai.online/serper
-
**Local Deployment**
1. Clone the repository locally
```
git clone https://github.com/fatwang2/search2ai
```
2. Copy .env.template as .env, configure environment variables
-- SEARCH_SERVICE: temporarily supports search1api, google, bing, serpapi, serper, duckduckgo, required
-- APIBASE: if you are using OpenAI three-way proxy, you can fill in here, note that you do not need to add v1, non-required!
-- MAX_RESULTS:the results of search
-- CRAWL_RESULTS:the reults of search you want to crawl
-- SEARCH1API_KEY: such as the selection of search1api required, I build their own search services, 0.99 U.S. dollars / 1000 times per month, the application address https://search21api.com
-- BING_KEY: Required if choosing bing search, please search for tutorials, application address https://search2ai.online/bing
-- GOOGLE_CX: Required if choosing Google search, Search engine ID, please search for tutorials, application address https://search2ai.online/googlecx
-- GOOGLE_KEY: Required if choosing Google search, API key, application address https://search2ai.online/googlekey
-- SERPAPI_KEY: Required if choosing serpapi, free 100 times/month, registration address https://search2ai.online/serpapi
-- SERPER_KEY: Required if choosing serper, free 2500 times for 6 months, note variable name is different from above, registration address https://search2ai.online/serper
3. Enter the api directory, run the program, and display the log in real-time
```
@@ -108,26 +78,16 @@ cd api && nohup node index.js > output.log 2>&1 & tail -f output.log
http://localhost:3014/v1/chat/completions
```
-**Deployment with cloudflare worker**
-1. Copy the code of [openai.js](https://search2ai.online/cloudflare), or [gemini.js](https://search2ai.online/geminicf),no modifications needed! Deploy in cloudflare's worker, after going online, the worker's address can be used as your interface call's custom domain address, note the concatenation, worker address only represents the part before v1
+**Cloudflare worker**
+1. Copy the code of [search2openai.js](search2openai.js), or [search2gemini.js](search2gemini.js),no modifications needed! Deploy in cloudflare's worker, after going online, the worker's address can be used as your interface call's custom domain address, note the concatenation, worker address only represents the part before v1
2. Configure variables in the worker(only openai)
![Effect Example](pictures/worker.png)
-- SEARCH_SERVICE: temporarily supports search1api, google, bing, serpapi, serper, duckduckgo, required
-- APIBASE: if you are using OpenAI three-way proxy, you can fill in here, note that you do not need to add v1, non-required!
-- MAX_RESULTS:the results of search
-- CRAWL_RESULTS:the reults of search you want to crawl
-- SEARCH1API_KEY: such as the selection of search1api required, I build their own search services, 0.99 U.S. dollars / 1000 times per month, the application address https://search21api.com
-- BING_KEY: Required if choosing bing search, please search for tutorials, application address https://search2ai.online/bing
-- GOOGLE_CX: Required if choosing Google search, Search engine ID, please search for tutorials, application address https://search2ai.online/googlecx
-- GOOGLE_KEY: Required if choosing Google search, API key, application address https://search2ai.online/googlekey
-- SERPAPI_KEY: Required if choosing serpapi, free 100 times/month, registration address https://search2ai.online/serpapi
-- SERPER_KEY: Required if choosing serper, free 2500 times for 6 months, note variable name is different from above, registration address https://search2ai.online/serper
3. Configure triggers - custom domain in the worker, direct access to the worker's address in China might have issues, need to replace with custom domain
![Alt text](pictures/域名.png)
-**Deployment with Vercel**
+**Vercel**
Special note: Vercel project does not support streaming output and has a 10s response limit, actual user experience is poor, released mainly for experts to pull request
@@ -137,6 +97,22 @@ One-click deployment
To ensure updates, you can also first fork this project and then deploy it on Vercel yourself
+# Environment Variables
+This project provides some additional configuration options, which can be set through environment variables:
+
+| Environment Variable | Required | Description | Example |
+| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `SEARCH_SERVICE` | Yes | Your search service. The key of the service you choose needs to be configured. Supports search1api, google, bing, serpapi, serper, duckduckgo. | `search1api, google, bing, serpapi, serper, duckduckgo` |
+| `APIBASE` | No | OpenAI third-party proxy address. If using Moonshot, fill in `https://api.moonshot.cn`. | `https://api.openai.com` |
+| `MAX_RESULTS` | No | Number of search results. | `10` |
+| `CRAWL_RESULTS` | No | The number of deep searches (retrieve the main text of the webpage after searching). Currently only supports search1api, deep search will be slow. | `1` |
+| `SEARCH1API_KEY` | Conditional | Required if search1api is selected. My own fast and cheap search service. Apply at https://search21api.com. | `xxx` |
+| `BING_KEY` | Conditional | Required if Bing search is selected. Please search for the tutorial yourself. Apply at https://search2ai.online/bing. | `xxx` |
+| `GOOGLE_CX` | Conditional | Required if Google search is selected. Search engine ID. Please search for the tutorial yourself. Apply at https://search2ai.online/googlecx. | `xxx` |
+| `GOOGLE_KEY` | Conditional | Required if Google search is selected. API key. Apply at https://search2ai.online/googlekey. | `xxx` |
+| `SERPAPI_KEY` | Conditional | Required if serpapi is selected. Free 100 times/month. Register at https://search2ai.online/serpapi. | `xxx` |
+| `SERPER_KEY` | Conditional | Required if serper is selected. Free 2500 times for 6 months. Register at https://search2ai.online/serper. | `xxx` |
+
# Risk statement
To ensure the persistence of this project, certain interface requests will be forwarded via [search1api](https://search.search2ai.one). Please be assured that this forwarding service does not save any private data.
diff --git a/README.md b/README.md
index 9a13b85..cc3bb97 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@
# 版本更新
+- V0.2.2,20240420,支持Moonshot的非流式模式
- V0.2.1,20240310,支持Google、Bing、Duckduckgo、Search1API新闻类搜索;支持通过环境变量MAX_RESULTS调整搜索结果数量;支持通过环境变量CRAWL_RESULTS调整希望深度搜索的数量
- V0.2.0,20240310,优化openai.js,cloudflare worker版本,这次速度真的更快了!
- V0.1.9,20240318,优化openai.js对流式的处理方式,速度更快,建议更新;修复服务器部署版本的语音问题;增加Github赞助按钮
@@ -20,8 +21,8 @@
更多历史更新,请参见 [版本记录](https://github.com/fatwang2/search2ai/releases)
-# 产品介绍
-- search2ai,让你的 LLM API 支持联网,搜索、新闻、网页总结,已支持OpenAI、Gemini,大模型会根据你的输入判断是否联网,不是每次都联网搜索,不需要安装任何插件,也不需要更换key,直接在你常用的 OpenAI/Gemini 三方客户端替换自定义地址即可,也支持自行部署,不会影响使用的其他功能,如画图、语音等
+# S2A
+让你的 大模型 API 支持联网,搜索、新闻、网页总结,已支持OpenAI、Gemini、Moonshot(非流式),大模型会根据你的输入判断是否联网,不是每次都联网搜索,不需要安装任何插件,也不需要更换key,直接在你常用的三方客户端替换自定义地址即可,也支持自行部署,不会影响使用的其他功能,如画图、语音等
-# 使用方法
-**直接使用:替换客户端自定义域名为下面地址即可**
+# 功能
+| 模型 | 功能 | 流式输出 | 部署方式 |
+| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `OpenAI` | 联网、新闻、内容爬取 | 流式、非流式| Zeabur、本地部署、Cloudflare Worker、Vercel|
+| `Gemini` | 联网 | 流式、非流式| Cloudflare Worker|
+| `Moonshot` | 联网、新闻、内容爬取 | 非流式| Zeabur、本地部署、Cloudflare Worker、Vercel|
-OpenAI
-```
-https://api.search2ai.online
-```
-Gemini
-```
-https://geminiapi.search2ai.online
-```
-
-如图所示
+# 使用
+**替换客户端自定义域名为你部署后的地址**
- |
|
-demo站体验地址
-- [OpenAI](https://search2ai.online/demo) 根据提示使用你的key,更换自定义域名即可
-- [Gemini](https://search2ai.online/gemini) 可直接使用
-**Zeabur一键部署(强烈推荐)**
+# 部署
+**Zeabur一键部署**
-点击按钮即可一键部署,默认duckduckgo搜索,可自行修改环境变量进行切换
+点击按钮即可一键部署,修改环境变量
[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/A4HGYF?referralCode=fatwang2)
@@ -68,34 +62,12 @@ demo站体验地址
[![Deployed on Zeabur](https://zeabur.com/deployed-on-zeabur-dark.svg)](https://zeabur.com?referralCode=fatwang2&utm_source=fatwang2&utm_campaign=oss)
-环境变量
-- SEARCH_SERVICE:暂时支持search1api、google、bing、serpapi、serper、duckduckgo,必填
-- APIBASE:如果你在用 OpenAI 三方代理,在这里填入,注意不需要加v1,非必填
-- MAX_RESULTS:你需要保留的搜索结果的数量
-- CRAWL_RESULTS:你需要进行深度搜索的结果数量,目前仅支持 search1api
-- SEARCH1API_KEY:如选search1api必填,我自己搭建的搜索服务,0.99美金/1000次每个月,申请地址 https://search21api.com
-- BING_KEY:如选bing搜索必填,请自行搜索教程,申请地址 https://search2ai.online/bing
-- GOOGLE_CX:如选Google搜索必填,Search engine ID,请自行搜索教程,申请地址 https://search2ai.online/googlecx
-- GOOGLE_KEY:如选Google搜索必填,API key,申请地址 https://search2ai.online/googlekey
-- SERPAPI_KEY: 如选serpapi必填,免费100次/月,注册地址 https://search2ai.online/serpapi
-- SERPER_KEY: 如选serper必填,6个月免费额度2500次,注意变量名称跟上面不一样,注册地址 https://search2ai.online/serper
-
**本地部署**
1. 克隆仓库到本地
```
git clone https://github.com/fatwang2/search2ai
```
2. 复制.env.template为.env,配置环境变量
-- SEARCH_SERVICE:暂时支持search1api、google、bing、serpapi、serper、duckduckgo,必填
-- APIBASE:如果你在用 OpenAI 三方代理,可在这里填入,注意不需要加v1,非必填
-- MAX_RESULTS:你需要保留的搜索结果的数量
-- CRAWL_RESULTS:你需要进行深度搜索的结果数量,目前仅支持 search1api
-- SEARCH1API_KEY:如选search1api必填,我自己搭建的搜索服务,0.99美金/1000次每个月,申请地址 https://search21api.com
-- BING_KEY:如选bing搜索必填,请自行搜索教程,申请地址 https://search2ai.online/bing
-- GOOGLE_CX:如选Google搜索必填,Search engine ID,请自行搜索教程,申请地址 https://search2ai.online/googlecx
-- GOOGLE_KEY:如选Google搜索必填,API key,申请地址 https://search2ai.online/googlekey
-- SERPAPI_KEY: 如选serpapi必填,免费100次/月,注册地址 https://search2ai.online/serpapi
-- SERPER_KEY: 如选serper必填,6个月免费额度2500次,注意变量名称跟上面不一样,注册地址 https://search2ai.online/serper
3. 进入api目录,运行程序,实时显示日志
```
@@ -107,26 +79,16 @@ cd api && nohup node index.js > output.log 2>&1 & tail -f output.log
http://localhost:3014/v1/chat/completions
```
-**cloudflare worker部署**
-1. 复制[openai.js](https://search2ai.online/cloudflare)或者[gemini.js](https://search2ai.online/geminicf)的代码,不需要任何修改!在cloudflare的worker里部署,上线后的worker的地址可作为你接口调用时的自定义域名地址,注意拼接,worker地址仅代表v1前的部分
+**Cloudflare Worker部署**
+1. 复制[search2openai.js](search2openai.js)或者[search2gemini.js](search2gemini.js)的代码,不需要任何修改!在cloudflare的worker里部署,上线后的worker的地址可作为你接口调用时的自定义域名地址,注意拼接,worker地址仅代表v1前的部分
-2. 在worker中配置变量
+2. 在worker中配置环境变量
![效果示例](pictures/worker.png)
-- SEARCH_SERVICE:暂时支持search1api、google、bing、serpapi、serper、duckduckgo,必填
-- APIBASE:如果你在用 OpenAI 三方代理,可在这里填入,注意不需要加v1,非必填
-- MAX_RESULTS:你需要保留的搜索结果的数量
-- CRAWL_RESULTS:你需要进行深度搜索的结果数量,目前仅支持 search1api
-- SEARCH1API_KEY:如选search1api必填,我自己搭建的搜索服务,0.99美金/1000次每个月,申请地址 https://search21api.com
-- BING_KEY:如选bing搜索必填,请自行搜索教程,申请地址 https://search2ai.online/bing
-- GOOGLE_CX:如选Google搜索必填,Search engine ID,请自行搜索教程,申请地址 https://search2ai.online/googlecx
-- GOOGLE_KEY:如选Google搜索必填,API key,申请地址 https://search2ai.online/googlekey
-- SERPAPI_KEY: 如选serpapi必填,免费100次/月,注册地址 https://search2ai.online/serpapi
-- SERPER_KEY: 如选serper必填,6个月免费额度2500次,注意变量名称跟上面不一样,注册地址 https://search2ai.online/serper
3. worker里配置触发器-自定义域名,国内直接访问worker的地址可能会出问题,需要替换为自定义域名
![Alt text](pictures/域名.png)
-**vercel部署**
+**Vercel部署**
特别说明:vercel项目暂不支持流式输出,且有10s响应限制,实际使用体验不佳,放出来主要是想等大神给我pull request
@@ -136,6 +98,23 @@ http://localhost:3014/v1/chat/completions
为保证更新,也可以先fork本项目后自己在vercel上部署
+# 环境变量
+该项目提供了一些额外的配置项,通过环境变量设置:
+
+| 环境变量 | 是否必须 | 描述 | 例子 |
+| -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| `SEARCH_SERVICE` | Yes | 你的搜索服务,选择什么服务,就需要配置什么服务的key支持search1api、google、bing、serpapi、serper、duckduckgo| `search1api, google, bing, serpapi, serper, duckduckgo`|
+| `APIBASE` | No | OpenAI 三方代理地址,使用Moonshot则填写`https://api.moonshot.cn`| `https://api.openai.com`|
+| `MAX_RESULTS` | No | 搜索结果条数| `10`|
+| `CRAWL_RESULTS` | No | 要进行深度搜索(搜索后获取网页正文)的数量,目前仅支持 search1api,深度速度会慢| `1`|
+| `SEARCH1API_KEY` | No | 如选search1api必填,我自己搭建的搜索服务,又快又便宜,申请地址 https://search21api.com| `xxx`|
+| `BING_KEY` | No | 如选bing搜索必填,请自行搜索教程,申请地址 https://search2ai.online/bing| `xxx`|
+| `GOOGLE_CX` | No | 如选Google搜索必填,Search engine ID,请自行搜索教程,申请地址 https://search2ai.online/googlecx| `xxx`|
+| `GOOGLE_KEY` | No | 如选Google搜索必填,API key,申请地址 https://search2ai.online/googlekey| `xxx`|
+| `SERPAPI_KEY` | No | 如选serpapi必填,免费100次/月,注册地址 https://search2ai.online/serpapi| `xxx`|
+| `SERPER_KEY` | No | 如选serper必填,6个月免费额度2500次,注册地址 https://search2ai.online/serper| `xxx`|
+
+
# 风险声明
为了确保本项目的持久运行,某些接口请求将通过[search1api](https://search.search2ai.one)进行转发。请放心,该转发服务不会保存任何隐私数据。
diff --git a/gemini.js b/search2gemini.js
similarity index 100%
rename from gemini.js
rename to search2gemini.js
diff --git a/openai.js b/search2openai.js
similarity index 98%
rename from openai.js
rename to search2openai.js
index 939cd0f..3ea2565 100644
--- a/openai.js
+++ b/search2openai.js
@@ -142,10 +142,10 @@
return `\u5728 news \u51FD\u6570\u4E2D\u6355\u83B7\u5230\u9519\u8BEF: ${error}`;
}
}
- async function crawer(url) {
+ async function crawler(url) {
console.log(`\u6B63\u5728\u4F7F\u7528 URL \u8FDB\u884C\u81EA\u5B9A\u4E49\u722C\u53D6:${JSON.stringify(url)}`);
try {
- const response = await fetch("https://crawler.search2ai.online", {
+ const response = await fetch("https://crawler.search2ai.one", {
method: "POST",
headers: {
"Content-Type": "application/json"
@@ -168,7 +168,7 @@
return JSON.stringify(data);
} catch (error) {
console.error(`\u5728 crawl \u51FD\u6570\u4E2D\u6355\u83B7\u5230\u9519\u8BEF: ${error}`);
- return `\u5728 crawer \u51FD\u6570\u4E2D\u6355\u83B7\u5230\u9519\u8BEF: ${error}`;
+ return `\u5728 crawler \u51FD\u6570\u4E2D\u6355\u83B7\u5230\u9519\u8BEF: ${error}`;
}
}
async function handleRequest(request, apiBase, apiKey) {
@@ -224,7 +224,7 @@
{
type: "function",
function: {
- name: "crawer",
+ name: "crawler",
description: "Get the content of a specified url",
parameters: {
type: "object",
@@ -401,7 +401,7 @@
const availableFunctions = {
search: search,
news: news,
- crawer: crawer,
+ crawler: crawler,
};
let assistantMessage = {
@@ -431,7 +431,7 @@
let functionResponse;
if (functionName === "search" && typeof functionArgs.query === "string") {
functionResponse = await functionToCall(functionArgs.query);
- } else if (functionName === "crawer" && typeof functionArgs.url === "string") {
+ } else if (functionName === "crawler" && typeof functionArgs.url === "string") {
functionResponse = await functionToCall(functionArgs.url);
} else if (functionName === "news" && typeof functionArgs.query === "string") {
functionResponse = await functionToCall(functionArgs.query);
@@ -506,7 +506,7 @@
const availableFunctions = {
"search": search,
"news": news,
- "crawer": crawer
+ "crawler": crawler
};
for (const toolCall of toolCalls) {
const functionName = toolCall.function.name;
@@ -515,7 +515,7 @@
let functionResponse;
if (functionName === "search") {
functionResponse = await functionToCall(functionArgs.query);
- } else if (functionName === "crawer") {
+ } else if (functionName === "crawler") {
functionResponse = await functionToCall(functionArgs.url);
} else if (functionName === "news") {
functionResponse = await functionToCall(functionArgs.query);
@@ -526,7 +526,7 @@
name: functionName,
content: functionResponse
});
- if (functionName === "search" || functionName === "crawer" || functionName === "news") {
+ if (functionName === "search" || functionName === "crawler" || functionName === "news") {
calledCustomFunction = true;
}
}
diff --git a/units/crawler.js b/units/crawler.js
index dab8a4f..0b56e4d 100644
--- a/units/crawler.js
+++ b/units/crawler.js
@@ -4,7 +4,7 @@ const fetch = require('node-fetch');
async function crawler(url) {
console.log(`正在使用 URL 进行自定义爬取:${JSON.stringify(url)}`);
try {
- const response = await fetch('https://crawler.search2ai.online', {
+ const response = await fetch('https://crawler.search2ai.one', {
method: 'POST',
headers: {
"Content-Type": "application/json"