diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..14aab39 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Python cache files +__pycache__/ +*.py[cod] + +# Virtual environments +venv/ +.venv/ + +# Environment variables (secrets) +.env + +# Git metadata +.git/ + +# macOS Finder files +.DS_Store + +# Log files +*.log \ No newline at end of file diff --git a/.gitignore b/.gitignore index 43242b9..f8801e4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ test_agent.py config.ini .voices/ experimental/ +chrome_bundle/ .logs/ .screenshots/*.png .screenshots/*.jpg diff --git a/README.md b/README.md index 4fc0927..7430bf8 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,9 @@ https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316 Disclaimer: This demo, including all the files that appear (e.g: CV_candidates.zip), are entirely fictional. We are not a corporation, we seek open-source contributors not candidates. -> 🛠️ **Work in Progress** – Looking for contributors! +> 🛠⚠️️ **Active Work in Progress** – Please note that Code/Bash is not dockerized yet but will be soon (see docker_deployement branch) - Do not deploy over network or production. + +> 🙏 Please also understand that this project began as a side experiment, with no roadmap and no expectations, we didn't expect to end in Github trending. Financial backing is exactly $1/month (shoutout to my single sponsor). Contributions, feedback, and patience are deeply appreciated. ## Installation diff --git a/README_CHT.md b/README_CHT.md index 27de4fd..eaf37bf 100644 --- a/README_CHT.md +++ b/README_CHT.md @@ -8,23 +8,23 @@ [English](./README.md) | 繁體中文 | [日本語](./README_JP.md) -*一个 **100% 本地替代 Manus AI** 的方案,这款支持语音的 AI 助理能够自主浏览网页、编写代码和规划任务,同时将所有数据保留在您的设备上。专为本地推理模型量身打造,完全在您自己的硬件上运行,确保完全的隐私保护和零云端依赖。* +*一个 **100% 本地替代 Manus AI** 的方案,這款支持語音的 AI 助理能够自主瀏覽網頁、编寫代码和規劃任務,同时將所有用戶資料保留在您的裝置上。專門為本地推理模型量身打造,完全在您自己的硬體上執行,确保完全的隐私保护和零雲端依賴。* [![Visit AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) -### 为什么选择 AgenticSeek? +### 为什么選擇 AgenticSeek? -* 🔒 完全本地化与隐私保护 - 所有功能都在您的设备上运行 — 无云端服务,无数据共享。您的文件、对话和搜索始终保持私密。 +* 🔒 完全本地化與隐私保护 - 所有功能都在您的设备上運行 — 无云端服务,无数据共享。您的文件、对话和搜索始终保持私密。 -* 🌐 智能网页浏览 - AgenticSeek 能够自主浏览互联网 — 搜索、阅读、提取信息、填写网页表单 — 全程无需人工操作。 +* 🌐 智能網頁瀏覽 - AgenticSeek 能够自主瀏覽網頁 — 搜索、閱读、提取信息、填寫網页表單 — 全程无需人工操作。 -* 💻 自主编码助手 - 需要代码?它可以编写、调试并运行 Python、C、Go、Java 等多种语言的程序 — 全程无需监督。 +* 💻 自主编码助手 - 需要代码?它可以编寫、调试并運行 Python、C、Go、Java 等多种语言的程序 — 全程无需监督。 -* 🧠 智能代理选择 - 您提问,它会自动选择最适合该任务的代理。就像拥有一个随时待命的专家团队。 +* 🧠 智能代理选择 - 您提问,它會自动选择最适合该任务的代理。就像拥有一个随时待命的專家团队。 -* 📋 规划与执行复杂任务 - 从旅行规划到复杂项目 — 它能将大型任务分解为步骤,并利用多个 AI 代理完成工作。 +* 📋 规划與执行复杂任务 - 从旅行规划到复杂项目 — 它能將大型任务分解为步骤,并利用多个 AI 代理完成工作。 -* 🎙️ 语音功能 - 清晰、快速、未来感十足的语音与语音转文本功能,让您能像科幻电影中一样与您的个人 AI 助手对话。 +* 🎙️ 語音功能 - 清晰、快速、未来感十足的語音與語音轉文本功能,讓您能像科幻电影中一样與您的个人 AI 助手对话。 https://github.com/user-attachments/assets/4bd5faf6-459f-4f94-bd1d-238c4b331469 @@ -36,7 +36,7 @@ https://github.com/user-attachments/assets/4bd5faf6-459f-4f94-bd1d-238c4b331469 確保已安裝了 Chrome driver,Docker 和 Python 3.10(或更新)。 -我们强烈建议您使用 Python 3.10 进行设置,否则可能会发生依赖错误。 +我们强烈建议您使用 Python 3.10 進行設定,否则可能會发生依赖错误。 有關於 Chrome driver 的問題,請參見 **Chromedriver** 部分。 @@ -64,7 +64,7 @@ source agentic_seek_env/bin/activate ./install.sh ``` -** 若要让文本转语音(TTS)功能支持中文,你需要安装 jieba(中文分词库)和 cn2an(中文数字转换库):** +** 若要將文字轉成語音(TTS)功能支持中文,你需要安装 jieba(中文分詞庫)和 cn2an(中文數字轉換庫):** ``` pip3 install jieba cn2an @@ -73,7 +73,7 @@ pip3 install jieba cn2an **手動安裝:** -**注意:对于任何操作系统,请确保您安装的 ChromeDriver 与您已安装的 Chrome 版本匹配。运行 `google-chrome --version`。如果您的 Chrome 版本 > 135,请参阅已知问题** +**注意:對於不同作業系統,請確保已經安装的 ChromeDriver 與您已安装的 Chrome 版本一致。可以執行 `google-chrome --version`。如果您的 Chrome 版本 > 135,請參考已知问题** - *Linux*: @@ -81,7 +81,7 @@ pip3 install jieba cn2an 安装依赖项:`sudo apt install -y alsa-utils portaudio19-dev python3-pyaudio libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1` -安装与您的 Chrome 浏览器版本匹配的 ChromeDriver: +安装與您的 Chrome 瀏覽器版本匹配的 ChromeDriver: `sudo apt install -y chromium-chromedriver` 安装 requirements:`pip3 install -r requirements.txt` @@ -104,11 +104,11 @@ pip3 install jieba cn2an 安装 pyreadline3:`pip install pyreadline3` -手动安装 portaudio(例如,通过 vcpkg 或预编译的二进制文件),然后运行:`pip install pyaudio` +手动安装 portaudio(例如,通过 vcpkg 或預編譯的二進制文件),然後運行:`pip install pyaudio` -从以下网址手动下载并安装 chromedriver:https://sites.google.com/chromium.org/driver/getting-started +从以下網址手动下载并安装 chromedriver:https://sites.google.com/chromium.org/driver/getting-started -将 chromedriver 放置在包含在您的 PATH 中的目录中。 +將 chromedriver 放置在包含在您的 PATH 中的目录中。 安装 requirements:`pip3 install -r requirements.txt` @@ -116,45 +116,45 @@ pip3 install jieba cn2an **建議至少使用 Deepseek 14B 以上參數的模型,較小的模型難以使用助理功能並且很快就會忘記上下文之間的關係。** -**本地运行助手** +**本地運行助手** -启动你的本地提供者,例如使用 ollama: +啟動你的本地提供者,例如使用 ollama: ```sh ollama serve ``` -请参阅下方支持的本地提供者列表。 +请参閱下方支持的本地提供者列表。 -修改 config.ini 文件以设置 provider_name 为支持的提供者,并将 provider_model 设置为该提供者支持的 LLM。我们推荐使用具有推理能力的模型,如 *Qwen* 或 *Deepseek*。 +修改 config.ini 文件以設定 provider_name 为支持的提供者,并將 provider_model 設定为该提供者支持的 LLM。我们推荐使用具有推理能力的模型,如 *Qwen* 或 *Deepseek*。 请参见 README 末尾的 **FAQ** 部分了解所需硬件。 ```sh [MAIN] -is_local = True # 无论是在本地运行还是使用远程提供者。 +is_local = True # 无论是在本地運行还是使用远程提供者。 provider_name = ollama # 或 lm-studio, openai 等.. provider_model = deepseek-r1:14b # 选择适合您硬件的模型 provider_server_address = 127.0.0.1:11434 agent_name = Jarvis # 您的 AI 助手的名称 -recover_last_session = True # 是否恢复之前的会话 -save_session = True # 是否记住当前会话 -speak = True # 文本转语音 -listen = False # 语音转文本,仅适用于命令行界面 +recover_last_session = True # 是否恢复之前的會话 +save_session = True # 是否记住当前會话 +speak = True # 文本轉語音 +listen = False # 語音轉文本,僅适用于命令行界面 work_dir = /Users/mlg/Documents/workspace # AgenticSeek 的工作空间。 jarvis_personality = False # 是否使用更"贾维斯"风格的性格,不推荐在小型模型上使用 -languages = en zh # 语言列表,文本转语音将默认使用列表中的第一种语言 +languages = en zh # 语言列表,文本轉語音將默认使用列表中的第一种语言 [BROWSER] -headless_browser = True # 是否使用无头浏览器,只有在使用网页界面时才推荐使用。 -stealth_mode = True # 使用无法检测的 selenium 来减少浏览器检测 +headless_browser = True # 是否使用无头瀏覽器,只有在使用網页界面时才推荐使用。 +stealth_mode = True # 使用无法檢測的 selenium 来减少瀏覽器檢測 ``` **本地提供者列表** | 提供者 | 本地? | 描述 | |-------------|--------|-------------------------------------------------------| -| ollama | 是 | 使用 ollama 作为 LLM 提供者,轻松本地运行 LLM | -| lm-studio | 是 | 使用 LM Studio 本地运行 LLM(将 `provider_name` 设置为 `lm-studio`)| +| ollama | 是 | 使用 ollama 作为 LLM 提供者,轻松本地運行 LLM | +| lm-studio | 是 | 使用 LM Studio 本地運行 LLM(將 `provider_name` 設定为 `lm-studio`)| | openai | 否 | 使用兼容的 API | 下一步: [Start services and run AgenticSeek](#Start-services-and-Run) @@ -184,14 +184,14 @@ provider_server_address = 127.0.0.1:5000 --- ## Start services and Run -(启动服务并运行) +(啟動服务并運行) 如果需要,请激活你的 Python 环境。 ```sh source agentic_seek_env/bin/activate ``` -启动所需的服务。这将启动 `docker-compose.yml` 中的所有服务,包括: +啟動所需的服务。这將啟動 `docker-compose.yml` 中的所有服务,包括: - searxng - redis(由 redis 提供支持) - 前端 @@ -201,25 +201,25 @@ sudo ./start_services.sh # MacOS start ./start_services.cmd # Windows ``` -**选项 1:** 使用 CLI 界面运行。 +**選項 1:** 使用 CLI 界面運行。 ```sh python3 cli.py ``` -**选项 2:** 使用 Web 界面运行。 +**選項 2:** 使用 Web 界面運行。 注意:目前我們建議您使用 CLI 界面。Web 界面仍在積極開發中。 -启动后端服务。 +啟動後端服务。 ```sh python3 api.py ``` -访问 `http://localhost:3000/`,你应该会看到 Web 界面。 +访问 `http://localhost:3000/`,你应该會看到 Web 界面。 -请注意,目前 Web 界面不支持消息流式传输。 +请注意,目前 Web 界面不支持消息流式傳輸。 *如果你不知道如何開始,請參閱 **Usage** 部分* @@ -228,9 +228,9 @@ python3 api.py ## Usage (使用方法) -为确保 agenticSeek 在中文环境下正常工作,请确保在 config.ini 中设置语言选项。 +为确保 agenticSeek 在中文环境下正常工作,请确保在 config.ini 中設定语言選項。 languages = en zh -更多信息请参阅 Config 部分 +更多信息请参閱 Config 部分 確定所有的核心檔案都啟用了,也就是執行過這條命令 `./start_services.sh` 然後你就可以使用 `python3 cli.py` 來啟動 AgenticSeek 了! @@ -287,11 +287,11 @@ python3 cli.py 所以我們希望你在使用時,能明確地表明你希望他要怎麼做,下面給你一個範例! 你該說: -- 进行网络搜索,找出哪些国家最适合独自旅行 +- 進行網路搜索,找出哪些国家最适合獨自旅行 而不是說: -- 你知道哪些国家适合独自旅行? +- 你知道哪些国家适合獨自旅行? --- @@ -357,7 +357,7 @@ provider_server_address = x.x.x.x:3333 ## 語音轉文字 -请注意,目前语音转文字功能仅支持英语。 +请注意,目前語音轉文字功能僅支援英语。 預設狀況下,語音轉文字功能是停用的。若要啟用它,請在 `config.ini` 檔案中,將 `listen` 選項設為 `True`: @@ -538,13 +538,13 @@ https://googlechromelabs.github.io/chrome-for-testing/ **Q: 是否支持中文以外的语言?** -DeepSeek R1 天生会说中文 +DeepSeek R1 天生會说中文 但注意:代理路由系统只懂英文,所以必须通过 config.ini 的 languages 参数(如 languages = en zh)告诉系统: -如果不设置中文?后果可能是:你让它写代码,结果跳出来个"医生代理"(虽然我们根本没有这个代理... 但系统会一脸懵圈!) +如果不設定中文?後果可能是:你讓它寫代码,结果跳出来个"醫生代理"(虽然我们根本没有这个代理... 但系统會一脸懵圈!) -实际上会下载一个小型翻译模型来协助任务分配 +实际上會下载一个小型翻译模型来协助任务分配 ## 貢獻 @@ -556,8 +556,8 @@ DeepSeek R1 天生会说中文 ## 维护者: - > [Fosowl](https://github.com/Fosowl) | 巴黎时间 + > [Fosowl](https://github.com/Fosowl) | 巴黎時間 | (有时很忙) - > [antoineVIVIES](https://github.com/antoineVIVIES) | Taipei Time + > [https://github.com/antoineVIVIES](https://github.com/antoineVIVIES) | 台北時間 | (經常很忙) - > [steveh8758](https://github.com/steveh8758) | 台北时间 \ No newline at end of file + > [steveh8758](https://github.com/steveh8758) | 台北時間 | (總是很忙) diff --git a/searxng/settings.yml.new b/searxng/settings.yml.new deleted file mode 100644 index 608074c..0000000 --- a/searxng/settings.yml.new +++ /dev/null @@ -1,2737 +0,0 @@ -general: - # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} - debug: false - # displayed name - instance_name: "searxng" - # For example: https://example.com/privacy - privacypolicy_url: false - # use true to use your own donation page written in searx/info/en/donate.md - # use false to disable the donation link - donation_url: false - # mailto:contact@example.com - contact_url: false - # record stats - enable_metrics: true - # expose stats in open metrics format at /metrics - # leave empty to disable (no password set) - # open_metrics: - open_metrics: '' - -brand: - new_issue_url: https://github.com/searxng/searxng/issues/new - docs_url: https://docs.searxng.org/ - public_instances: https://searx.space - wiki_url: https://github.com/searxng/searxng/wiki - issue_url: https://github.com/searxng/searxng/issues - # custom: - # maintainer: "Jon Doe" - # # Custom entries in the footer: [title]: [link] - # links: - # Uptime: https://uptime.searxng.org/history/darmarit-org - # About: "https://searxng.org" - -search: - # Filter results. 0: None, 1: Moderate, 2: Strict - safe_search: 0 - # Existing autocomplete backends: "360search", "baidu", "brave", "dbpedia", "duckduckgo", "google", "yandex", - # "mwmbl", "seznam", "sogou", "stract", "swisscows", "quark", "qwant", "wikipedia" - - # leave blank to turn it off by default. - autocomplete: "" - # minimun characters to type before autocompleter starts - autocomplete_min: 4 - # backend for the favicon near URL in search results. - # Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default. - favicon_resolver: "" - # Default search language - leave blank to detect from browser information or - # use codes from 'languages.py' - default_lang: "auto" - # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages - # Available languages - # languages: - # - all - # - en - # - en-US - # - de - # - it-IT - # - fr - # - fr-BE - # ban time in seconds after engine errors - ban_time_on_fail: 5 - # max ban time in seconds after engine errors - max_ban_time_on_fail: 120 - suspended_times: - # Engine suspension time after error (in seconds; set to 0 to disable) - # For error "Access denied" and "HTTP error [402, 403]" - SearxEngineAccessDenied: 86400 - # For error "CAPTCHA" - SearxEngineCaptcha: 86400 - # For error "Too many request" and "HTTP error 429" - SearxEngineTooManyRequests: 3600 - # Cloudflare CAPTCHA - cf_SearxEngineCaptcha: 1296000 - cf_SearxEngineAccessDenied: 86400 - # ReCAPTCHA - recaptcha_SearxEngineCaptcha: 604800 - - # remove format to deny access, use lower case. - # formats: [html, csv, json, rss] - formats: - - html - -server: - # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} - port: 8888 - bind_address: "127.0.0.1" - # public URL of the instance, to ensure correct inbound links. Is overwritten - # by ${SEARXNG_URL}. - base_url: / # "http://example.com/location" - # rate limit the number of request on the instance, block some bots. - # Is overwritten by ${SEARXNG_LIMITER} - limiter: false - # enable features designed only for public instances. - # Is overwritten by ${SEARXNG_PUBLIC_INSTANCE} - public_instance: false - - # If your instance owns a /etc/searxng/settings.yml file, then set the following - # values there. - - secret_key: "1234bbd68b6c51ff0b9ccb77e39b1f20a3178b63e71496cbc89ef019f0341382" # Is overwritten by ${SEARXNG_SECRET} - # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} - image_proxy: false - # 1.0 and 1.1 are supported - http_protocol_version: "1.0" - # POST queries are more secure as they don't show up in history but may cause - # problems when using Firefox containers - method: "POST" - default_http_headers: - X-Content-Type-Options: nosniff - X-Download-Options: noopen - X-Robots-Tag: noindex, nofollow - Referrer-Policy: no-referrer - -redis: - # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. - # https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis - url: false - -ui: - # Custom static path - leave it blank if you didn't change - static_path: "" - # Is overwritten by ${SEARXNG_STATIC_USE_HASH}. - static_use_hash: false - # Custom templates path - leave it blank if you didn't change - templates_path: "" - # query_in_title: When true, the result page's titles contains the query - # it decreases the privacy, since the browser can records the page titles. - query_in_title: false - # infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page. - infinite_scroll: false - # ui theme - default_theme: simple - # center the results ? - center_alignment: false - # URL prefix of the internet archive, don't forget trailing slash (if needed). - # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" - # Default interface locale - leave blank to detect from browser information or - # use codes from the 'locales' config section - default_locale: "" - # Open result links in a new tab by default - # results_on_new_tab: false - theme_args: - # style of simple theme: auto, light, dark - simple_style: auto - # Perform search immediately if a category selected. - # Disable to select multiple categories at once and start the search manually. - search_on_category_select: true - # Hotkeys: default or vim - hotkeys: default - # URL formatting: pretty, full or host - url_formatting: pretty - -# Lock arbitrary settings on the preferences page. -# -# preferences: -# lock: -# - categories -# - language -# - autocomplete -# - favicon -# - safesearch -# - method -# - doi_resolver -# - locale -# - theme -# - results_on_new_tab -# - infinite_scroll -# - search_on_category_select -# - method -# - image_proxy -# - query_in_title - -# searx supports result proxification using an external service: -# https://github.com/asciimoo/morty uncomment below section if you have running -# morty proxy the key is base64 encoded (keep the !!binary notation) -# Note: since commit af77ec3, morty accepts a base64 encoded key. -# -# result_proxy: -# url: http://127.0.0.1:3000/ -# # the key is a base64 encoded string, the YAML !!binary prefix is optional -# key: !!binary "your_morty_proxy_key" -# # [true|false] enable the "proxy" button next to each result -# proxify_results: true - -# communication with search engines -# -outgoing: - # default timeout in seconds, can be override by engine - request_timeout: 3.0 - # the maximum timeout in seconds - # max_request_timeout: 10.0 - # suffix of searx_useragent, could contain information like an email address - # to the administrator - useragent_suffix: "" - # The maximum number of concurrent connections that may be established. - pool_connections: 100 - # Allow the connection pool to maintain keep-alive connections below this - # point. - pool_maxsize: 20 - # See https://www.python-httpx.org/http2/ - enable_http2: true - # uncomment below section if you want to use a custom server certificate - # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults - # and https://www.python-httpx.org/compatibility/#ssl-configuration - # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer - # - # uncomment below section if you want to use a proxyq see: SOCKS proxies - # https://2.python-requests.org/en/latest/user/advanced/#proxies - # are also supported: see - # https://2.python-requests.org/en/latest/user/advanced/#socks - # - # proxies: - # all://: - # - http://proxy1:8080 - # - http://proxy2:8080 - # - # using_tor_proxy: true - # - # Extra seconds to add in order to account for the time taken by the proxy - # - # extra_proxy_timeout: 10 - # - # uncomment below section only if you have more than one network interface - # which can be the source of outgoing search requests - # - # source_ips: - # - 1.1.1.1 - # - 1.1.1.2 - # - fe80::/126 - -# Plugin configuration, for more details see -# https://docs.searxng.org/admin/settings/settings_plugins.html -# -plugins: - - searx.plugins.calculator.SXNGPlugin: - active: true - - searx.plugins.hash_plugin.SXNGPlugin: - active: true - - searx.plugins.self_info.SXNGPlugin: - active: true - - searx.plugins.unit_converter.SXNGPlugin: - active: true - - searx.plugins.ahmia_filter.SXNGPlugin: - active: true - - searx.plugins.hostnames.SXNGPlugin: - active: true - - searx.plugins.oa_doi_rewrite.SXNGPlugin: - active: false - - searx.plugins.tor_check.SXNGPlugin: - active: false - - searx.plugins.tracker_url_remover.SXNGPlugin: - active: false - - -# Configuration of the "Hostnames plugin": -# -# hostnames: -# replace: -# '(.*\.)?youtube\.com$': 'invidious.example.com' -# '(.*\.)?youtu\.be$': 'invidious.example.com' -# '(.*\.)?reddit\.com$': 'teddit.example.com' -# '(.*\.)?redd\.it$': 'teddit.example.com' -# '(www\.)?twitter\.com$': 'nitter.example.com' -# remove: -# - '(.*\.)?facebook.com$' -# low_priority: -# - '(.*\.)?google(\..*)?$' -# high_priority: -# - '(.*\.)?wikipedia.org$' -# -# Alternatively you can use external files for configuring the "Hostnames plugin": -# -# hostnames: -# replace: 'rewrite-hosts.yml' -# -# Content of 'rewrite-hosts.yml' (place the file in the same directory as 'settings.yml'): -# '(.*\.)?youtube\.com$': 'invidious.example.com' -# '(.*\.)?youtu\.be$': 'invidious.example.com' -# - -checker: - # disable checker when in debug mode - off_when_debug: true - - # use "scheduling: false" to disable scheduling - # scheduling: interval or int - - # to activate the scheduler: - # * uncomment "scheduling" section - # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" - # to your uwsgi.ini - - # scheduling: - # start_after: [300, 1800] # delay to start the first run of the checker - # every: [86400, 90000] # how often the checker runs - - # additional tests: only for the YAML anchors (see the engines section) - # - additional_tests: - rosebud: &test_rosebud - matrix: - query: rosebud - lang: en - result_container: - - not_empty - - ['one_title_contains', 'citizen kane'] - test: - - unique_results - - android: &test_android - matrix: - query: ['android'] - lang: ['en', 'de', 'fr', 'zh-CN'] - result_container: - - not_empty - - ['one_title_contains', 'google'] - test: - - unique_results - - # tests: only for the YAML anchors (see the engines section) - tests: - infobox: &tests_infobox - infobox: - matrix: - query: ["linux", "new york", "bbc"] - result_container: - - has_infobox - -categories_as_tabs: - general: - images: - videos: - news: - map: - music: - it: - science: - files: - social media: - -engines: - - name: 360search - engine: 360search - shortcut: 360so - disabled: true - - - name: 360search videos - engine: 360search_videos - shortcut: 360sov - disabled: true - - - name: 9gag - engine: 9gag - shortcut: 9g - disabled: true - - - name: acfun - engine: acfun - shortcut: acf - disabled: true - - - name: adobe stock - engine: adobe_stock - shortcut: asi - categories: ["images"] - # https://docs.searxng.org/dev/engines/online/adobe_stock.html - adobe_order: relevance - adobe_content_types: ["photo", "illustration", "zip_vector", "template", "3d", "image"] - timeout: 6 - disabled: true - - - name: adobe stock video - engine: adobe_stock - shortcut: asv - network: adobe stock - categories: ["videos"] - adobe_order: relevance - adobe_content_types: ["video"] - timeout: 6 - disabled: true - - - name: adobe stock audio - engine: adobe_stock - shortcut: asa - network: adobe stock - categories: ["music"] - adobe_order: relevance - adobe_content_types: ["audio"] - timeout: 6 - disabled: true - - - name: alexandria - engine: json_engine - shortcut: alx - categories: general - paging: true - search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} - results_query: results - title_query: title - url_query: url - content_query: snippet - timeout: 1.5 - disabled: true - about: - website: https://alexandria.org/ - official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md - use_official_api: true - require_api_key: false - results: JSON - - # - name: astrophysics data system - # engine: astrophysics_data_system - # sort: asc - # weight: 5 - # categories: [science] - # api_key: your-new-key - # shortcut: ads - - - name: alpine linux packages - engine: alpinelinux - disabled: true - shortcut: alp - - - name: annas archive - engine: annas_archive - disabled: true - shortcut: aa - - # - name: annas articles - # engine: annas_archive - # shortcut: aaa - # # https://docs.searxng.org/dev/engines/online/annas_archive.html - # aa_content: 'magazine' # book_fiction, book_unknown, book_nonfiction, book_comic - # aa_ext: 'pdf' # pdf, epub, .. - # aa_sort: oldest' # newest, oldest, largest, smallest - - - name: apk mirror - engine: apkmirror - timeout: 4.0 - shortcut: apkm - disabled: true - - - name: apple app store - engine: apple_app_store - shortcut: aps - disabled: true - - # Requires Tor - - name: ahmia - engine: ahmia - categories: onions - enable_http: true - shortcut: ah - - - name: anaconda - engine: xpath - paging: true - first_page_num: 0 - search_url: https://anaconda.org/search?q={query}&page={pageno} - results_xpath: //tbody/tr - url_xpath: ./td/h5/a[last()]/@href - title_xpath: ./td/h5 - content_xpath: ./td[h5]/text() - categories: it - timeout: 6.0 - shortcut: conda - disabled: true - - - name: arch linux wiki - engine: archlinux - shortcut: al - - - name: nixos wiki - engine: mediawiki - shortcut: nixw - base_url: https://wiki.nixos.org/ - search_type: text - disabled: true - categories: [it, software wikis] - - - name: artic - engine: artic - shortcut: arc - timeout: 4.0 - - - name: arxiv - engine: arxiv - shortcut: arx - timeout: 4.0 - - - name: ask - engine: ask - shortcut: ask - disabled: true - - # tmp suspended: dh key too small - # - name: base - # engine: base - # shortcut: bs - - - name: bandcamp - engine: bandcamp - shortcut: bc - categories: music - - - name: baidu - baidu_category: general - categories: [general] - engine: baidu - shortcut: bd - disabled: true - - - name: baidu images - baidu_category: images - categories: [images] - engine: baidu - shortcut: bdi - disabled: true - - - name: baidu kaifa - baidu_category: it - categories: [it] - engine: baidu - shortcut: bdk - disabled: true - - - name: wikipedia - engine: wikipedia - shortcut: wp - # add "list" to the array to get results in the results list - display_type: ["infobox"] - categories: [general] - - - name: bilibili - engine: bilibili - shortcut: bil - disabled: true - - - name: bing - engine: bing - shortcut: bi - disabled: true - - - name: bing images - engine: bing_images - shortcut: bii - - - name: bing news - engine: bing_news - shortcut: bin - - - name: bing videos - engine: bing_videos - shortcut: biv - - - name: bitchute - engine: bitchute - shortcut: bit - disabled: true - - - name: bitbucket - engine: xpath - paging: true - search_url: https://bitbucket.org/repo/all/{pageno}?name={query} - url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href - title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] - content_xpath: //article[@class="repo-summary"]/p - categories: [it, repos] - timeout: 4.0 - disabled: true - shortcut: bb - about: - website: https://bitbucket.org/ - wikidata_id: Q2493781 - official_api_documentation: https://developer.atlassian.com/bitbucket - use_official_api: false - require_api_key: false - results: HTML - - - name: bpb - engine: bpb - shortcut: bpb - disabled: true - - - name: btdigg - engine: btdigg - shortcut: bt - disabled: true - - - name: openverse - engine: openverse - categories: images - shortcut: opv - - - name: media.ccc.de - engine: ccc_media - shortcut: c3tv - # We don't set language: de here because media.ccc.de is not just - # for a German audience. It contains many English videos and many - # German videos have English subtitles. - disabled: true - - - name: chefkoch - engine: chefkoch - shortcut: chef - # to show premium or plus results too: - # skip_premium: false - - - name: chinaso news - chinaso_category: news - engine: chinaso - shortcut: chinaso - disabled: true - - - name: chinaso images - chinaso_category: images - engine: chinaso - shortcut: chinasoi - disabled: true - - - name: chinaso videos - chinaso_category: videos - engine: chinaso - shortcut: chinasov - disabled: true - - - name: cloudflareai - engine: cloudflareai - shortcut: cfai - # get api token and accont id from https://developers.cloudflare.com/workers-ai/get-started/rest-api/ - cf_account_id: 'your_cf_accout_id' - cf_ai_api: 'your_cf_api' - # create your ai gateway by https://developers.cloudflare.com/ai-gateway/get-started/creating-gateway/ - cf_ai_gateway: 'your_cf_ai_gateway_name' - # find the model name from https://developers.cloudflare.com/workers-ai/models/#text-generation - cf_ai_model: 'ai_model_name' - # custom your preferences - # cf_ai_model_display_name: 'Cloudflare AI' - # cf_ai_model_assistant: 'prompts_for_assistant_role' - # cf_ai_model_system: 'prompts_for_system_role' - timeout: 30 - disabled: true - - # - name: core.ac.uk - # engine: core - # categories: science - # shortcut: cor - # # get your API key from: https://core.ac.uk/api-keys/register/ - # api_key: 'unset' - - - name: cppreference - engine: cppreference - shortcut: cpp - paging: false - disabled: true - - - name: crossref - engine: crossref - shortcut: cr - timeout: 30 - disabled: true - - - name: crowdview - engine: json_engine - shortcut: cv - categories: general - paging: false - search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} - results_query: results - url_query: link - title_query: title - content_query: snippet - title_html_to_text: true - content_html_to_text: true - disabled: true - about: - website: https://crowdview.ai/ - - - name: yep - engine: yep - shortcut: yep - categories: general - search_type: web - timeout: 5 - disabled: true - - - name: yep images - engine: yep - shortcut: yepi - categories: images - search_type: images - disabled: true - - - name: yep news - engine: yep - shortcut: yepn - categories: news - search_type: news - disabled: true - - - name: curlie - engine: xpath - shortcut: cl - categories: general - disabled: true - paging: true - lang_all: '' - search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 - page_size: 20 - results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] - url_xpath: ./div[@class="title-and-desc"]/a/@href - title_xpath: ./div[@class="title-and-desc"]/a/div - content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] - about: - website: https://curlie.org/ - wikidata_id: Q60715723 - use_official_api: false - require_api_key: false - results: HTML - - - name: currency - engine: currency_convert - categories: general - shortcut: cc - - - name: deezer - engine: deezer - shortcut: dz - disabled: true - - - name: destatis - engine: destatis - shortcut: destat - disabled: true - - - name: deviantart - engine: deviantart - shortcut: da - timeout: 3.0 - - - name: ddg definitions - engine: duckduckgo_definitions - shortcut: ddd - weight: 2 - disabled: true - tests: *tests_infobox - - # cloudflare protected - # - name: digbt - # engine: digbt - # shortcut: dbt - # timeout: 6.0 - # disabled: true - - - name: docker hub - engine: docker_hub - shortcut: dh - categories: [it, packages] - - - name: encyclosearch - engine: json_engine - shortcut: es - categories: general - paging: true - search_url: https://encyclosearch.org/encyclosphere/search?q={query}&page={pageno}&resultsPerPage=15 - results_query: Results - url_query: SourceURL - title_query: Title - content_query: Description - disabled: true - about: - website: https://encyclosearch.org - official_api_documentation: https://encyclosearch.org/docs/#/rest-api - use_official_api: true - require_api_key: false - results: JSON - - - name: erowid - engine: xpath - paging: true - first_page_num: 0 - page_size: 30 - search_url: https://www.erowid.org/search.php?q={query}&s={pageno} - url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href - title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() - content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] - categories: [] - shortcut: ew - disabled: true - about: - website: https://www.erowid.org/ - wikidata_id: Q1430691 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - # - name: elasticsearch - # shortcut: els - # engine: elasticsearch - # base_url: http://localhost:9200 - # username: elastic - # password: changeme - # index: my-index - # enable_http: true - # # available options: match, simple_query_string, term, terms, custom - # query_type: match - # # if query_type is set to custom, provide your query here - # # custom_query_json: {"query":{"match_all": {}}} - # # show_metadata: false - # disabled: true - - - name: wikidata - engine: wikidata - shortcut: wd - timeout: 3.0 - weight: 2 - # add "list" to the array to get results in the results list - display_type: ["infobox"] - tests: *tests_infobox - categories: [general] - - - name: duckduckgo - engine: duckduckgo - shortcut: ddg - - - name: duckduckgo images - engine: duckduckgo_extra - categories: [images, web] - ddg_category: images - shortcut: ddi - disabled: true - - - name: duckduckgo videos - engine: duckduckgo_extra - categories: [videos, web] - ddg_category: videos - shortcut: ddv - disabled: true - - - name: duckduckgo news - engine: duckduckgo_extra - categories: [news, web] - ddg_category: news - shortcut: ddn - disabled: true - - - name: duckduckgo weather - engine: duckduckgo_weather - shortcut: ddw - disabled: true - - - name: apple maps - engine: apple_maps - shortcut: apm - disabled: true - timeout: 5.0 - - - name: emojipedia - engine: emojipedia - timeout: 4.0 - shortcut: em - disabled: true - - - name: tineye - engine: tineye - shortcut: tin - timeout: 9.0 - disabled: true - - - name: etymonline - engine: xpath - paging: true - search_url: https://etymonline.com/search?page={pageno}&q={query} - url_xpath: //a[contains(@class, "word__name--")]/@href - title_xpath: //a[contains(@class, "word__name--")] - content_xpath: //section[contains(@class, "word__defination")] - first_page_num: 1 - shortcut: et - categories: [dictionaries] - about: - website: https://www.etymonline.com/ - wikidata_id: Q1188617 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - # - name: ebay - # engine: ebay - # shortcut: eb - # base_url: 'https://www.ebay.com' - # disabled: true - # timeout: 5 - - - name: 1x - engine: www1x - shortcut: 1x - timeout: 3.0 - disabled: true - - - name: fdroid - engine: fdroid - shortcut: fd - disabled: true - - - name: findthatmeme - engine: findthatmeme - shortcut: ftm - disabled: true - - - name: flickr - categories: images - shortcut: fl - # You can use the engine using the official stable API, but you need an API - # key, see: https://www.flickr.com/services/apps/create/ - # engine: flickr - # api_key: 'apikey' # required! - # Or you can use the html non-stable engine, activated by default - engine: flickr_noapi - - - name: free software directory - engine: mediawiki - shortcut: fsd - categories: [it, software wikis] - base_url: https://directory.fsf.org/ - search_type: title - timeout: 5.0 - disabled: true - about: - website: https://directory.fsf.org/ - wikidata_id: Q2470288 - - # - name: freesound - # engine: freesound - # shortcut: fnd - # disabled: true - # timeout: 15.0 - # API key required, see: https://freesound.org/docs/api/overview.html - # api_key: MyAPIkey - - - name: frinkiac - engine: frinkiac - shortcut: frk - disabled: true - - - name: fyyd - engine: fyyd - shortcut: fy - timeout: 8.0 - disabled: true - - - name: geizhals - engine: geizhals - shortcut: geiz - disabled: true - - - name: genius - engine: genius - shortcut: gen - - - name: gentoo - engine: mediawiki - shortcut: ge - categories: ["it", "software wikis"] - base_url: "https://wiki.gentoo.org/" - api_path: "api.php" - search_type: text - timeout: 10 - - - name: gitlab - engine: gitlab - base_url: https://gitlab.com - shortcut: gl - disabled: true - about: - website: https://gitlab.com/ - wikidata_id: Q16639197 - - # - name: gnome - # engine: gitlab - # base_url: https://gitlab.gnome.org - # shortcut: gn - # about: - # website: https://gitlab.gnome.org - # wikidata_id: Q44316 - - - name: github - engine: github - shortcut: gh - - - name: codeberg - # https://docs.searxng.org/dev/engines/online/gitea.html - engine: gitea - base_url: https://codeberg.org - shortcut: cb - disabled: true - - - name: gitea.com - engine: gitea - base_url: https://gitea.com - shortcut: gitea - disabled: true - - - name: goodreads - engine: goodreads - shortcut: good - timeout: 4.0 - disabled: true - - - name: google - engine: google - shortcut: go - # additional_tests: - # android: *test_android - - - name: google images - engine: google_images - shortcut: goi - # additional_tests: - # android: *test_android - # dali: - # matrix: - # query: ['Dali Christ'] - # lang: ['en', 'de', 'fr', 'zh-CN'] - # result_container: - # - ['one_title_contains', 'Salvador'] - - - name: google news - engine: google_news - shortcut: gon - # additional_tests: - # android: *test_android - - - name: google videos - engine: google_videos - shortcut: gov - # additional_tests: - # android: *test_android - - - name: google scholar - engine: google_scholar - shortcut: gos - - - name: google play apps - engine: google_play - categories: [files, apps] - shortcut: gpa - play_categ: apps - disabled: true - - - name: google play movies - engine: google_play - categories: videos - shortcut: gpm - play_categ: movies - disabled: true - - - name: material icons - engine: material_icons - categories: images - shortcut: mi - disabled: true - - - name: habrahabr - engine: xpath - paging: true - search_url: https://habr.com/en/search/page{pageno}/?q={query} - results_xpath: //article[contains(@class, "tm-articles-list__item")] - url_xpath: .//a[@class="tm-title__link"]/@href - title_xpath: .//a[@class="tm-title__link"] - content_xpath: .//div[contains(@class, "article-formatted-body")] - categories: it - timeout: 4.0 - disabled: true - shortcut: habr - about: - website: https://habr.com/ - wikidata_id: Q4494434 - official_api_documentation: https://habr.com/en/docs/help/api/ - use_official_api: false - require_api_key: false - results: HTML - - - name: hackernews - engine: hackernews - shortcut: hn - disabled: true - - - name: hex - engine: hex - shortcut: hex - disabled: true - # Valid values: name inserted_at updated_at total_downloads recent_downloads - sort_criteria: "recent_downloads" - page_size: 10 - - - name: crates.io - engine: crates - shortcut: crates - disabled: true - timeout: 6.0 - - - name: hoogle - engine: xpath - search_url: https://hoogle.haskell.org/?hoogle={query} - results_xpath: '//div[@class="result"]' - title_xpath: './/div[@class="ans"]//a' - url_xpath: './/div[@class="ans"]//a/@href' - content_xpath: './/div[@class="from"]' - page_size: 20 - categories: [it, packages] - shortcut: ho - about: - website: https://hoogle.haskell.org/ - wikidata_id: Q34010 - official_api_documentation: https://hackage.haskell.org/api - use_official_api: false - require_api_key: false - results: JSON - - - name: il post - engine: il_post - shortcut: pst - disabled: true - - - name: imdb - engine: imdb - shortcut: imdb - timeout: 6.0 - disabled: true - - - name: imgur - engine: imgur - shortcut: img - disabled: true - - - name: ina - engine: ina - shortcut: in - timeout: 6.0 - disabled: true - - - name: invidious - engine: invidious - # Instanes will be selected randomly, see https://api.invidious.io/ for - # instances that are stable (good uptime) and close to you. - base_url: - - https://invidious.adminforge.de - - https://inv.nadeko.net - shortcut: iv - timeout: 3.0 - disabled: true - - - name: ipernity - engine: ipernity - shortcut: ip - disabled: true - - - name: iqiyi - engine: iqiyi - shortcut: iq - disabled: true - - - name: jisho - engine: jisho - shortcut: js - timeout: 3.0 - disabled: true - - - name: kickass - engine: kickass - base_url: - - https://kickasstorrents.to - - https://kickasstorrents.cr - - https://kickasstorrent.cr - - https://kickass.sx - - https://kat.am - shortcut: kc - timeout: 4.0 - - - name: lemmy communities - engine: lemmy - lemmy_type: Communities - shortcut: leco - - - name: lemmy users - engine: lemmy - network: lemmy communities - lemmy_type: Users - shortcut: leus - - - name: lemmy posts - engine: lemmy - network: lemmy communities - lemmy_type: Posts - shortcut: lepo - - - name: lemmy comments - engine: lemmy - network: lemmy communities - lemmy_type: Comments - shortcut: lecom - - - name: library genesis - engine: xpath - # search_url: https://libgen.is/search.php?req={query} - search_url: https://libgen.rs/search.php?req={query} - url_xpath: //a[contains(@href,"book/index.php?md5")]/@href - title_xpath: //a[contains(@href,"book/")]/text()[1] - content_xpath: //td/a[1][contains(@href,"=author")]/text() - categories: files - timeout: 7.0 - disabled: true - shortcut: lg - about: - website: https://libgen.fun/ - wikidata_id: Q22017206 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: z-library - engine: zlibrary - shortcut: zlib - categories: files - timeout: 7.0 - - - name: library of congress - engine: loc - shortcut: loc - categories: images - - - name: libretranslate - engine: libretranslate - # https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#mirrors - base_url: - - https://libretranslate.com/translate - # api_key: abc123 - shortcut: lt - disabled: true - - - name: lingva - engine: lingva - shortcut: lv - # set lingva instance in url, by default it will use the official instance - # url: https://lingva.thedaviddelta.com - - - name: lobste.rs - engine: xpath - search_url: https://lobste.rs/search?q={query}&what=stories&order=relevance - results_xpath: //li[contains(@class, "story")] - url_xpath: .//a[@class="u-url"]/@href - title_xpath: .//a[@class="u-url"] - content_xpath: .//a[@class="domain"] - categories: it - shortcut: lo - timeout: 5.0 - disabled: true - about: - website: https://lobste.rs/ - wikidata_id: Q60762874 - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: mastodon users - engine: mastodon - mastodon_type: accounts - base_url: https://mastodon.social - shortcut: mau - - - name: mastodon hashtags - engine: mastodon - mastodon_type: hashtags - base_url: https://mastodon.social - shortcut: mah - - # - name: matrixrooms - # engine: mrs - # # https://docs.searxng.org/dev/engines/online/mrs.html - # # base_url: https://mrs-api-host - # shortcut: mtrx - # disabled: true - - - name: mdn - shortcut: mdn - engine: json_engine - categories: [it] - paging: true - search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} - results_query: documents - url_query: mdn_url - url_prefix: https://developer.mozilla.org - title_query: title - content_query: summary - about: - website: https://developer.mozilla.org - wikidata_id: Q3273508 - official_api_documentation: null - use_official_api: false - require_api_key: false - results: JSON - - - name: metacpan - engine: metacpan - shortcut: cpan - disabled: true - number_of_results: 20 - - # https://docs.searxng.org/dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch - # - name: meilisearch - # engine: meilisearch - # shortcut: mes - # enable_http: true - # base_url: http://localhost:7700 - # index: my-index - # auth_key: Bearer XXXX - - - name: microsoft learn - engine: microsoft_learn - shortcut: msl - disabled: true - - - name: mixcloud - engine: mixcloud - shortcut: mc - - # MongoDB engine - # Required dependency: pymongo - # - name: mymongo - # engine: mongodb - # shortcut: md - # exact_match_only: false - # host: '127.0.0.1' - # port: 27017 - # enable_http: true - # results_per_page: 20 - # database: 'business' - # collection: 'reviews' # name of the db collection - # key: 'name' # key in the collection to search for - - - name: mozhi - engine: mozhi - base_url: - - https://mozhi.aryak.me - - https://translate.bus-hit.me - - https://nyc1.mz.ggtyler.dev - # mozhi_engine: google - see https://mozhi.aryak.me for supported engines - timeout: 4.0 - shortcut: mz - disabled: true - - - name: mwmbl - engine: mwmbl - # api_url: https://api.mwmbl.org - shortcut: mwm - disabled: true - - - name: niconico - engine: niconico - shortcut: nico - disabled: true - - - name: npm - engine: npm - shortcut: npm - timeout: 5.0 - disabled: true - - - name: nyaa - engine: nyaa - shortcut: nt - disabled: true - - - name: mankier - engine: json_engine - search_url: https://www.mankier.com/api/v2/mans/?q={query} - results_query: results - url_query: url - title_query: name - content_query: description - categories: it - shortcut: man - about: - website: https://www.mankier.com/ - official_api_documentation: https://www.mankier.com/api - use_official_api: true - require_api_key: false - results: JSON - - # read https://docs.searxng.org/dev/engines/online/mullvad_leta.html - # - name: mullvadleta - # engine: mullvad_leta - # leta_engine: google # choose one of the following: google, brave - # use_cache: true # Only 100 non-cache searches per day, suggested only for private instances - # search_url: https://leta.mullvad.net - # categories: [general, web] - # shortcut: ml - - - name: odysee - engine: odysee - shortcut: od - disabled: true - - - name: ollama - engine: ollama - shortcut: ollama - disabled: true - - - name: openairedatasets - engine: json_engine - paging: true - search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} - results_query: response/results/result - url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ - title_query: metadata/oaf:entity/oaf:result/title/$ - content_query: metadata/oaf:entity/oaf:result/description/$ - content_html_to_text: true - categories: "science" - shortcut: oad - timeout: 5.0 - about: - website: https://www.openaire.eu/ - wikidata_id: Q25106053 - official_api_documentation: https://api.openaire.eu/ - use_official_api: false - require_api_key: false - results: JSON - - - name: openairepublications - engine: json_engine - paging: true - search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} - results_query: response/results/result - url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ - title_query: metadata/oaf:entity/oaf:result/title/$ - content_query: metadata/oaf:entity/oaf:result/description/$ - content_html_to_text: true - categories: science - shortcut: oap - timeout: 5.0 - about: - website: https://www.openaire.eu/ - wikidata_id: Q25106053 - official_api_documentation: https://api.openaire.eu/ - use_official_api: false - require_api_key: false - results: JSON - - - name: openclipart - engine: openclipart - shortcut: ocl - inactive: true - disabled: true - timeout: 30 - - - name: openlibrary - engine: openlibrary - shortcut: ol - timeout: 5 - disabled: true - - - name: openmeteo - engine: open_meteo - shortcut: om - disabled: true - - # - name: opensemanticsearch - # engine: opensemantic - # shortcut: oss - # base_url: 'http://localhost:8983/solr/opensemanticsearch/' - - - name: openstreetmap - engine: openstreetmap - shortcut: osm - - - name: openrepos - engine: xpath - paging: true - search_url: https://openrepos.net/search/node/{query}?page={pageno} - url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href - title_xpath: //li[@class="search-result"]//h3[@class="title"]/a - content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] - categories: files - timeout: 4.0 - disabled: true - shortcut: or - about: - website: https://openrepos.net/ - wikidata_id: - official_api_documentation: - use_official_api: false - require_api_key: false - results: HTML - - - name: packagist - engine: json_engine - paging: true - search_url: https://packagist.org/search.json?q={query}&page={pageno} - results_query: results - url_query: url - title_query: name - content_query: description - categories: [it, packages] - disabled: true - timeout: 5.0 - shortcut: pack - about: - website: https://packagist.org - wikidata_id: Q108311377 - official_api_documentation: https://packagist.org/apidoc - use_official_api: true - require_api_key: false - results: JSON - - - name: pdbe - engine: pdbe - shortcut: pdb - # Hide obsolete PDB entries. Default is not to hide obsolete structures - # hide_obsolete: false - - - name: photon - engine: photon - shortcut: ph - - - name: pinterest - engine: pinterest - shortcut: pin - - - name: piped - engine: piped - shortcut: ppd - categories: videos - piped_filter: videos - timeout: 3.0 - - # URL to use as link and for embeds - frontend_url: https://srv.piped.video - # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ - backend_url: - - https://pipedapi.adminforge.de - - https://pipedapi.nosebs.ru - - https://pipedapi.ducks.party - - https://pipedapi.reallyaweso.me - - https://api.piped.private.coffee - - https://pipedapi.darkness.services - - - name: piped.music - engine: piped - network: piped - shortcut: ppdm - categories: music - piped_filter: music_songs - timeout: 3.0 - - - name: piratebay - engine: piratebay - shortcut: tpb - # You may need to change this URL to a proxy if piratebay is blocked in your - # country - url: https://thepiratebay.org/ - timeout: 3.0 - - - name: pixiv - shortcut: pv - engine: pixiv - disabled: true - inactive: true - pixiv_image_proxies: - - https://pximg.example.org - # A proxy is required to load the images. Hosting an image proxy server - # for Pixiv: - # --> https://pixivfe.pages.dev/hosting-image-proxy-server/ - # Proxies from public instances. Ask the public instances owners if they - # agree to receive traffic from SearXNG! - # --> https://codeberg.org/VnPower/PixivFE#instances - # --> https://github.com/searxng/searxng/pull/3192#issuecomment-1941095047 - # image proxy of https://pixiv.cat - # - https://i.pixiv.cat - # image proxy of https://www.pixiv.pics - # - https://pximg.cocomi.eu.org - # image proxy of https://pixivfe.exozy.me - # - https://pximg.exozy.me - # image proxy of https://pixivfe.ducks.party - # - https://pixiv.ducks.party - # image proxy of https://pixiv.perennialte.ch - # - https://pximg.perennialte.ch - - - name: podcastindex - engine: podcastindex - shortcut: podcast - - # Required dependency: psychopg2 - # - name: postgresql - # engine: postgresql - # database: postgres - # username: postgres - # password: postgres - # limit: 10 - # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' - # shortcut : psql - - - name: presearch - engine: presearch - search_type: search - categories: [general, web] - shortcut: ps - timeout: 4.0 - disabled: true - - - name: presearch images - engine: presearch - network: presearch - search_type: images - categories: [images, web] - timeout: 4.0 - shortcut: psimg - disabled: true - - - name: presearch videos - engine: presearch - network: presearch - search_type: videos - categories: [general, web] - timeout: 4.0 - shortcut: psvid - disabled: true - - - name: presearch news - engine: presearch - network: presearch - search_type: news - categories: [news, web] - timeout: 4.0 - shortcut: psnews - disabled: true - - - name: pub.dev - engine: xpath - shortcut: pd - search_url: https://pub.dev/packages?q={query}&page={pageno} - paging: true - results_xpath: //div[contains(@class,"packages-item")] - url_xpath: ./div/h3/a/@href - title_xpath: ./div/h3/a - content_xpath: ./div/div/div[contains(@class,"packages-description")]/span - categories: [packages, it] - timeout: 3.0 - disabled: true - first_page_num: 1 - about: - website: https://pub.dev/ - official_api_documentation: https://pub.dev/help/api - use_official_api: false - require_api_key: false - results: HTML - - - name: public domain image archive - engine: public_domain_image_archive - shortcut: pdia - - - name: pubmed - engine: pubmed - shortcut: pub - timeout: 3.0 - - - name: pypi - shortcut: pypi - engine: pypi - - - name: quark - quark_category: general - categories: [general] - engine: quark - shortcut: qk - disabled: true - - - name: quark images - quark_category: images - categories: [images] - engine: quark - shortcut: qki - disabled: true - - - name: qwant - qwant_categ: web - engine: qwant - shortcut: qw - categories: [general, web] - additional_tests: - rosebud: *test_rosebud - - - name: qwant news - qwant_categ: news - engine: qwant - shortcut: qwn - categories: news - network: qwant - - - name: qwant images - qwant_categ: images - engine: qwant - shortcut: qwi - categories: [images, web] - network: qwant - - - name: qwant videos - qwant_categ: videos - engine: qwant - shortcut: qwv - categories: [videos, web] - network: qwant - - # - name: library - # engine: recoll - # shortcut: lib - # base_url: 'https://recoll.example.org/' - # search_dir: '' - # mount_prefix: /export - # dl_prefix: 'https://download.example.org' - # timeout: 30.0 - # categories: files - # disabled: true - - # - name: recoll library reference - # engine: recoll - # base_url: 'https://recoll.example.org/' - # search_dir: reference - # mount_prefix: /export - # dl_prefix: 'https://download.example.org' - # shortcut: libr - # timeout: 30.0 - # categories: files - # disabled: true - - - name: radio browser - engine: radio_browser - shortcut: rb - - - name: reddit - engine: reddit - shortcut: re - page_size: 25 - disabled: true - - - name: reuters - engine: reuters - shortcut: reu - # https://docs.searxng.org/dev/engines/online/reuters.html - # sort_order = "relevance" - - - name: right dao - engine: xpath - paging: true - page_size: 12 - search_url: https://rightdao.com/search?q={query}&start={pageno} - results_xpath: //div[contains(@class, "description")] - url_xpath: ../div[contains(@class, "title")]/a/@href - title_xpath: ../div[contains(@class, "title")] - content_xpath: . - categories: general - shortcut: rd - disabled: true - about: - website: https://rightdao.com/ - use_official_api: false - require_api_key: false - results: HTML - - - name: rottentomatoes - engine: rottentomatoes - shortcut: rt - disabled: true - - # Required dependency: redis - # - name: myredis - # shortcut : rds - # engine: redis_server - # exact_match_only: false - # host: '127.0.0.1' - # port: 6379 - # enable_http: true - # password: '' - # db: 0 - - # tmp suspended: bad certificate - # - name: scanr structures - # shortcut: scs - # engine: scanr_structures - # disabled: true - - - name: searchmysite - engine: xpath - shortcut: sms - categories: general - paging: true - search_url: https://searchmysite.net/search/?q={query}&page={pageno} - results_xpath: //div[contains(@class,'search-result')] - url_xpath: .//a[contains(@class,'result-link')]/@href - title_xpath: .//span[contains(@class,'result-title-txt')]/text() - content_xpath: ./p[@id='result-hightlight'] - disabled: true - about: - website: https://searchmysite.net - - - name: selfhst icons - engine: selfhst - shortcut: si - inactive: true - disabled: true - - - name: sepiasearch - engine: sepiasearch - shortcut: sep - - - name: sogou - engine: sogou - shortcut: sogou - disabled: true - - - name: sogou images - engine: sogou_images - shortcut: sogoui - disabled: true - - - name: sogou videos - engine: sogou_videos - shortcut: sogouv - disabled: true - - - name: sogou wechat - engine: sogou_wechat - shortcut: sogouw - disabled: true - - - name: soundcloud - engine: soundcloud - shortcut: sc - - - name: stackoverflow - engine: stackexchange - shortcut: st - api_site: 'stackoverflow' - categories: [it, q&a] - - - name: askubuntu - engine: stackexchange - shortcut: ubuntu - api_site: 'askubuntu' - categories: [it, q&a] - - - name: superuser - engine: stackexchange - shortcut: su - api_site: 'superuser' - categories: [it, q&a] - - - name: discuss.python - engine: discourse - shortcut: dpy - base_url: 'https://discuss.python.org' - categories: [it, q&a] - disabled: true - - - name: caddy.community - engine: discourse - shortcut: caddy - base_url: 'https://caddy.community' - categories: [it, q&a] - disabled: true - - - name: pi-hole.community - engine: discourse - shortcut: pi - categories: [it, q&a] - base_url: 'https://discourse.pi-hole.net' - disabled: true - - - name: searchcode code - engine: searchcode_code - shortcut: scc - disabled: true - - # - name: searx - # engine: searx_engine - # shortcut: se - # instance_urls : - # - http://127.0.0.1:8888/ - # - ... - # disabled: true - - - name: semantic scholar - engine: semantic_scholar - disabled: true - shortcut: se - - # Spotify needs API credentials - # - name: spotify - # engine: spotify - # shortcut: stf - # api_client_id: ******* - # api_client_secret: ******* - - # - name: solr - # engine: solr - # shortcut: slr - # base_url: http://localhost:8983 - # collection: collection_name - # sort: '' # sorting: asc or desc - # field_list: '' # comma separated list of field names to display on the UI - # default_fields: '' # default field to query - # query_fields: '' # query fields - # enable_http: true - - # - name: springer nature - # engine: springer - # # get your API key from: https://dev.springernature.com/signup - # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" - # api_key: 'unset' - # shortcut: springer - # timeout: 15.0 - - - name: startpage - engine: startpage - shortcut: sp - startpage_categ: web - categories: [general, web] - additional_tests: - rosebud: *test_rosebud - - - name: startpage news - engine: startpage - startpage_categ: news - categories: [news, web] - shortcut: spn - - - name: startpage images - engine: startpage - startpage_categ: images - categories: [images, web] - shortcut: spi - - - name: tokyotoshokan - engine: tokyotoshokan - shortcut: tt - timeout: 6.0 - disabled: true - - - name: solidtorrents - engine: solidtorrents - shortcut: solid - timeout: 4.0 - base_url: - - https://solidtorrents.to - - https://bitsearch.to - - # For this demo of the sqlite engine download: - # https://liste.mediathekview.de/filmliste-v2.db.bz2 - # and unpack into searx/data/filmliste-v2.db - # Query to test: "!mediathekview concert" - # - # - name: mediathekview - # engine: sqlite - # shortcut: mediathekview - # categories: [general, videos] - # result_type: MainResult - # database: searx/data/filmliste-v2.db - # query_str: >- - # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, - # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, - # description AS content - # FROM film - # WHERE title LIKE :wildcard OR description LIKE :wildcard - # ORDER BY duration DESC - - - name: tagesschau - engine: tagesschau - # when set to false, display URLs from Tagesschau, and not the actual source - # (e.g. NDR, WDR, SWR, HR, ...) - use_source_url: true - shortcut: ts - disabled: true - - - name: tmdb - engine: xpath - paging: true - categories: movies - search_url: https://www.themoviedb.org/search?page={pageno}&query={query} - results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] - url_xpath: .//div[contains(@class,"poster")]/a/@href - thumbnail_xpath: .//img/@src - title_xpath: .//div[contains(@class,"title")]//h2 - content_xpath: .//div[contains(@class,"overview")] - shortcut: tm - disabled: true - - # Requires Tor - - name: torch - engine: xpath - paging: true - search_url: - http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and - results_xpath: //table//tr - url_xpath: ./td[2]/a - title_xpath: ./td[2]/b - content_xpath: ./td[2]/small - categories: onions - enable_http: true - shortcut: tch - - # torznab engine lets you query any torznab compatible indexer. Using this - # engine in combination with Jackett opens the possibility to query a lot of - # public and private indexers directly from SearXNG. More details at: - # https://docs.searxng.org/dev/engines/online/torznab.html - # - # - name: Torznab EZTV - # engine: torznab - # shortcut: eztv - # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab - # enable_http: true # if using localhost - # api_key: xxxxxxxxxxxxxxx - # show_magnet_links: true - # show_torrent_files: false - # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories - # torznab_categories: # optional - # - 2000 - # - 5000 - - # tmp suspended - too slow, too many errors - # - name: urbandictionary - # engine : xpath - # search_url : https://www.urbandictionary.com/define.php?term={query} - # url_xpath : //*[@class="word"]/@href - # title_xpath : //*[@class="def-header"] - # content_xpath: //*[@class="meaning"] - # shortcut: ud - - - name: unsplash - engine: unsplash - shortcut: us - - - name: yandex - engine: yandex - categories: general - search_type: web - shortcut: yd - disabled: true - inactive: true - - - name: yandex images - engine: yandex - categories: images - search_type: images - shortcut: ydi - disabled: true - inactive: true - - - name: yandex music - engine: yandex_music - shortcut: ydm - disabled: true - # https://yandex.com/support/music/access.html - inactive: true - - - name: yahoo - engine: yahoo - shortcut: yh - disabled: true - - - name: yahoo news - engine: yahoo_news - shortcut: yhn - - - name: youtube - shortcut: yt - # You can use the engine using the official stable API, but you need an API - # key See: https://console.developers.google.com/project - # - # engine: youtube_api - # api_key: 'apikey' # required! - # - # Or you can use the html non-stable engine, activated by default - engine: youtube_noapi - - - name: dailymotion - engine: dailymotion - shortcut: dm - - - name: vimeo - engine: vimeo - shortcut: vm - - - name: wiby - engine: json_engine - paging: true - search_url: https://wiby.me/json/?q={query}&p={pageno} - url_query: URL - title_query: Title - content_query: Snippet - categories: [general, web] - shortcut: wib - disabled: true - about: - website: https://wiby.me/ - - - name: wikibooks - engine: mediawiki - weight: 0.5 - shortcut: wb - categories: [general, wikimedia] - base_url: "https://{language}.wikibooks.org/" - search_type: text - disabled: true - about: - website: https://www.wikibooks.org/ - wikidata_id: Q367 - - - name: wikinews - engine: mediawiki - shortcut: wn - categories: [news, wikimedia] - base_url: "https://{language}.wikinews.org/" - search_type: text - srsort: create_timestamp_desc - about: - website: https://www.wikinews.org/ - wikidata_id: Q964 - - - name: wikiquote - engine: mediawiki - weight: 0.5 - shortcut: wq - categories: [general, wikimedia] - base_url: "https://{language}.wikiquote.org/" - search_type: text - disabled: true - additional_tests: - rosebud: *test_rosebud - about: - website: https://www.wikiquote.org/ - wikidata_id: Q369 - - - name: wikisource - engine: mediawiki - weight: 0.5 - shortcut: ws - categories: [general, wikimedia] - base_url: "https://{language}.wikisource.org/" - search_type: text - disabled: true - about: - website: https://www.wikisource.org/ - wikidata_id: Q263 - - - name: wikispecies - engine: mediawiki - shortcut: wsp - categories: [general, science, wikimedia] - base_url: "https://species.wikimedia.org/" - search_type: text - disabled: true - about: - website: https://species.wikimedia.org/ - wikidata_id: Q13679 - tests: - wikispecies: - matrix: - query: "Campbell, L.I. et al. 2011: MicroRNAs" - lang: en - result_container: - - not_empty - - ['one_title_contains', 'Tardigrada'] - test: - - unique_results - - - name: wiktionary - engine: mediawiki - shortcut: wt - categories: [dictionaries, wikimedia] - base_url: "https://{language}.wiktionary.org/" - search_type: text - about: - website: https://www.wiktionary.org/ - wikidata_id: Q151 - - - name: wikiversity - engine: mediawiki - weight: 0.5 - shortcut: wv - categories: [general, wikimedia] - base_url: "https://{language}.wikiversity.org/" - search_type: text - disabled: true - about: - website: https://www.wikiversity.org/ - wikidata_id: Q370 - - - name: wikivoyage - engine: mediawiki - weight: 0.5 - shortcut: wy - categories: [general, wikimedia] - base_url: "https://{language}.wikivoyage.org/" - search_type: text - disabled: true - about: - website: https://www.wikivoyage.org/ - wikidata_id: Q373 - - - name: wikicommons.images - engine: wikicommons - shortcut: wc - categories: images - search_type: images - number_of_results: 10 - - - name: wikicommons.videos - engine: wikicommons - shortcut: wcv - categories: videos - search_type: videos - number_of_results: 10 - - - name: wikicommons.audio - engine: wikicommons - shortcut: wca - categories: music - search_type: audio - number_of_results: 10 - - - name: wikicommons.files - engine: wikicommons - shortcut: wcf - categories: files - search_type: files - number_of_results: 10 - - - name: wolframalpha - shortcut: wa - # You can use the engine using the official stable API, but you need an API - # key. See: https://products.wolframalpha.com/api/ - # - # engine: wolframalpha_api - # api_key: '' - # - # Or you can use the html non-stable engine, activated by default - engine: wolframalpha_noapi - timeout: 6.0 - categories: general - disabled: true - - - name: dictzone - engine: dictzone - shortcut: dc - - - name: mymemory translated - engine: translated - shortcut: tl - timeout: 5.0 - # You can use without an API key, but you are limited to 1000 words/day - # See: https://mymemory.translated.net/doc/usagelimits.php - # api_key: '' - - # Required dependency: mysql-connector-python - # - name: mysql - # engine: mysql_server - # database: mydatabase - # username: user - # password: pass - # limit: 10 - # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' - # shortcut: mysql - - # Required dependency: mariadb - # - name: mariadb - # engine: mariadb_server - # database: mydatabase - # username: user - # password: pass - # limit: 10 - # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' - # shortcut: mdb - - - name: 1337x - engine: 1337x - shortcut: 1337x - disabled: true - - - name: duden - engine: duden - shortcut: du - disabled: true - - - name: seznam - shortcut: szn - engine: seznam - disabled: true - - # - name: deepl - # engine: deepl - # shortcut: dpl - # # You can use the engine using the official stable API, but you need an API key - # # See: https://www.deepl.com/pro-api?cta=header-pro-api - # api_key: '' # required! - # timeout: 5.0 - # disabled: true - - - name: mojeek - shortcut: mjk - engine: mojeek - categories: [general, web] - disabled: true - - - name: mojeek images - shortcut: mjkimg - engine: mojeek - categories: [images, web] - search_type: images - paging: false - disabled: true - - - name: mojeek news - shortcut: mjknews - engine: mojeek - categories: [news, web] - search_type: news - paging: false - disabled: true - - - name: moviepilot - engine: moviepilot - shortcut: mp - disabled: true - - - name: naver - shortcut: nvr - categories: [general, web] - engine: xpath - paging: true - search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} - url_xpath: //a[@class="link_tit"]/@href - title_xpath: //a[@class="link_tit"] - content_xpath: //div[@class="total_dsc_wrap"]/a - first_page_num: 1 - page_size: 10 - disabled: true - about: - website: https://www.naver.com/ - wikidata_id: Q485639 - official_api_documentation: https://developers.naver.com/docs/nmt/examples/ - use_official_api: false - require_api_key: false - results: HTML - language: ko - - - name: rubygems - shortcut: rbg - engine: xpath - paging: true - search_url: https://rubygems.org/search?page={pageno}&query={query} - results_xpath: /html/body/main/div/a[@class="gems__gem"] - url_xpath: ./@href - title_xpath: ./span/h2 - content_xpath: ./span/p - suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a - first_page_num: 1 - categories: [it, packages] - disabled: true - about: - website: https://rubygems.org/ - wikidata_id: Q1853420 - official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ - use_official_api: false - require_api_key: false - results: HTML - - - name: peertube - engine: peertube - shortcut: ptb - paging: true - # alternatives see: https://instances.joinpeertube.org/instances - # base_url: https://tube.4aem.com - categories: videos - disabled: true - timeout: 6.0 - - - name: mediathekviewweb - engine: mediathekviewweb - shortcut: mvw - disabled: true - - - name: yacy - # https://docs.searxng.org/dev/engines/online/yacy.html - engine: yacy - categories: general - search_type: text - base_url: - - https://yacy.searchlab.eu - # see https://github.com/searxng/searxng/pull/3631#issuecomment-2240903027 - # - https://search.kyun.li - # - https://yacy.securecomcorp.eu - # - https://yacy.myserv.ca - # - https://yacy.nsupdate.info - # - https://yacy.electroncash.de - shortcut: ya - disabled: true - # if you aren't using HTTPS for your local yacy instance disable https - # enable_http: false - search_mode: 'global' - # timeout can be reduced in 'local' search mode - timeout: 5.0 - - - name: yacy images - engine: yacy - network: yacy - categories: images - search_type: image - shortcut: yai - disabled: true - # timeout can be reduced in 'local' search mode - timeout: 5.0 - - - name: rumble - engine: rumble - shortcut: ru - base_url: https://rumble.com/ - paging: true - categories: videos - disabled: true - - - name: livespace - engine: livespace - shortcut: ls - categories: videos - disabled: true - timeout: 5.0 - - - name: wordnik - engine: wordnik - shortcut: def - categories: [dictionaries] - timeout: 5.0 - - - name: woxikon.de synonyme - engine: xpath - shortcut: woxi - categories: [dictionaries] - timeout: 5.0 - disabled: true - search_url: https://synonyme.woxikon.de/synonyme/{query}.php - url_xpath: //div[@class="upper-synonyms"]/a/@href - content_xpath: //div[@class="synonyms-list-group"] - title_xpath: //div[@class="upper-synonyms"]/a - no_result_for_http_status: [404] - about: - website: https://www.woxikon.de/ - wikidata_id: # No Wikidata ID - use_official_api: false - require_api_key: false - results: HTML - language: de - - - name: seekr news - engine: seekr - shortcut: senews - categories: news - seekr_category: news - disabled: true - - - name: seekr images - engine: seekr - network: seekr news - shortcut: seimg - categories: images - seekr_category: images - disabled: true - - - name: seekr videos - engine: seekr - network: seekr news - shortcut: sevid - categories: videos - seekr_category: videos - disabled: true - - - name: stract - engine: stract - shortcut: str - disabled: true - - - name: svgrepo - engine: svgrepo - shortcut: svg - timeout: 10.0 - disabled: true - - - name: tootfinder - engine: tootfinder - shortcut: toot - - - name: voidlinux - engine: voidlinux - shortcut: void - disabled: true - - - name: wallhaven - engine: wallhaven - # api_key: abcdefghijklmnopqrstuvwxyz - shortcut: wh - - # wikimini: online encyclopedia for children - # The fulltext and title parameter is necessary for Wikimini because - # sometimes it will not show the results and redirect instead - - name: wikimini - engine: xpath - shortcut: wkmn - search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search - url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href - title_xpath: //li//div[@class="mw-search-result-heading"]/a - content_xpath: //li/div[@class="searchresult"] - categories: general - disabled: true - about: - website: https://wikimini.org/ - wikidata_id: Q3568032 - use_official_api: false - require_api_key: false - results: HTML - language: fr - - - name: wttr.in - engine: wttr - shortcut: wttr - timeout: 9.0 - - - name: yummly - engine: yummly - shortcut: yum - disabled: true - - - name: brave - engine: brave - shortcut: br - time_range_support: true - paging: true - categories: [general, web] - brave_category: search - # brave_spellcheck: true - - - name: brave.images - engine: brave - network: brave - shortcut: brimg - categories: [images, web] - brave_category: images - - - name: brave.videos - engine: brave - network: brave - shortcut: brvid - categories: [videos, web] - brave_category: videos - - - name: brave.news - engine: brave - network: brave - shortcut: brnews - categories: news - brave_category: news - - # - name: brave.goggles - # engine: brave - # network: brave - # shortcut: brgog - # time_range_support: true - # paging: true - # categories: [general, web] - # brave_category: goggles - # Goggles: # required! This should be a URL ending in .goggle - - - name: lib.rs - shortcut: lrs - engine: lib_rs - disabled: true - - - name: sourcehut - shortcut: srht - engine: xpath - paging: true - search_url: https://sr.ht/projects?page={pageno}&search={query} - results_xpath: (//div[@class="event-list"])[1]/div[@class="event"] - url_xpath: ./h4/a[2]/@href - title_xpath: ./h4/a[2] - content_xpath: ./p - first_page_num: 1 - categories: [it, repos] - disabled: true - about: - website: https://sr.ht - wikidata_id: Q78514485 - official_api_documentation: https://man.sr.ht/ - use_official_api: false - require_api_key: false - results: HTML - - - name: goo - shortcut: goo - engine: xpath - paging: true - search_url: https://search.goo.ne.jp/web.jsp?MT={query}&FR={pageno}0 - url_xpath: //div[@class="result"]/p[@class='title fsL1']/a/@href - title_xpath: //div[@class="result"]/p[@class='title fsL1']/a - content_xpath: //p[contains(@class,'url fsM')]/following-sibling::p - first_page_num: 0 - categories: [general, web] - disabled: true - timeout: 4.0 - about: - website: https://search.goo.ne.jp - wikidata_id: Q249044 - use_official_api: false - require_api_key: false - results: HTML - language: ja - - - name: bt4g - engine: bt4g - shortcut: bt4g - - - name: pkg.go.dev - engine: pkg_go_dev - shortcut: pgo - disabled: true - - - name: senscritique - engine: senscritique - shortcut: scr - timeout: 4.0 - disabled: true - -# Doku engine lets you access to any Doku wiki instance: -# A public one or a privete/corporate one. -# - name: ubuntuwiki -# engine: doku -# shortcut: uw -# base_url: 'https://doc.ubuntu-fr.org' - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: git grep -# engine: command -# command: ['git', 'grep', '{{QUERY}}'] -# shortcut: gg -# tokens: [] -# disabled: true -# delimiter: -# chars: ':' -# keys: ['filepath', 'code'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: locate -# engine: command -# command: ['locate', '{{QUERY}}'] -# shortcut: loc -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: find -# engine: command -# command: ['find', '.', '-name', '{{QUERY}}'] -# query_type: path -# shortcut: fnd -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: pattern search in files -# engine: command -# command: ['fgrep', '{{QUERY}}'] -# shortcut: fgr -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -# Be careful when enabling this engine if you are -# running a public instance. Do not expose any sensitive -# information. You can restrict access by configuring a list -# of access tokens under tokens. -# - name: regex search in files -# engine: command -# command: ['grep', '{{QUERY}}'] -# shortcut: gr -# tokens: [] -# disabled: true -# delimiter: -# chars: ' ' -# keys: ['line'] - -doi_resolvers: - oadoi.org: 'https://oadoi.org/' - doi.org: 'https://doi.org/' - doai.io: 'https://dissem.in/' - sci-hub.se: 'https://sci-hub.se/' - sci-hub.st: 'https://sci-hub.st/' - sci-hub.ru: 'https://sci-hub.ru/' - -default_doi_resolver: 'oadoi.org' diff --git a/sources/agents/agent.py b/sources/agents/agent.py index 0e6bfaf..15d6ae0 100644 --- a/sources/agents/agent.py +++ b/sources/agents/agent.py @@ -140,8 +140,10 @@ class Agent(): Remove the reasoning block of reasoning model like deepseek. """ end_tag = "" - end_idx = text.rfind(end_tag)+8 - return text[end_idx:] + end_idx = text.rfind(end_tag) + if end_idx == -1: + return text + return text[end_idx+8:] def extract_reasoning_text(self, text: str) -> None: """ diff --git a/tests/test_tools_parsing.py b/tests/test_tools_parsing.py new file mode 100644 index 0000000..5840f12 --- /dev/null +++ b/tests/test_tools_parsing.py @@ -0,0 +1,230 @@ +import unittest +import os +import sys +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +from sources.tools.tools import Tools + +class TestToolsParsing(unittest.TestCase): + """ + Test suite for the Tools class parsing functionality, specifically the load_exec_block method. + This method is responsible for extracting code blocks from LLM-generated text. + """ + + def setUp(self): + """Set up test fixtures before each test method.""" + class TestTool(Tools): + def execute(self, blocks, safety=False): + return "test execution" + + def execution_failure_check(self, output): + return False + + def interpreter_feedback(self, output): + return "test feedback" + + self.tool = TestTool() + self.tool.tag = "python" # Set tag for testing + + def test_load_exec_block_single_block(self): + """Test parsing a single code block from LLM text.""" + llm_text = """Here's some Python code: +```python +print("Hello, World!") +x = 42 +``` +That's the code.""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 1) + self.assertEqual(blocks[0], '\nprint("Hello, World!")\nx = 42\n') + self.assertIsNone(save_path) + + def test_load_exec_block_multiple_blocks(self): + """Test parsing multiple code blocks from LLM text.""" + llm_text = """First block: +```python +import os +print("First block") +``` + +Second block: +```python +import sys +print("Second block") +``` + +Done.""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 2) + self.assertEqual(blocks[0], '\nimport os\nprint("First block")\n') + self.assertEqual(blocks[1], '\nimport sys\nprint("Second block")\n') + self.assertIsNone(save_path) + + def test_load_exec_block_with_save_path(self): + """Test parsing code block with save path specification.""" + llm_text = """```python +save_path: test_file.py +import os +print("Hello with save path") +```""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 1) + self.assertEqual(blocks[0], '\nsave_path: test_file.py\nimport os\nprint("Hello with save path")\n') + self.assertIsNone(save_path) + + + def test_load_exec_block_with_indentation(self): + """Test parsing code blocks with leading whitespace/indentation.""" + llm_text = """ Here's indented code: + ```python + def hello(): + print("Hello") + return True + ``` + End of code.""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 1) + expected_code = '\ndef hello():\n print("Hello")\n return True\n' + self.assertEqual(blocks[0], expected_code) + + def test_load_exec_block_no_blocks(self): + """Test parsing text with no code blocks.""" + llm_text = """This is just regular text with no code blocks. +There are no python blocks here. +Just plain text.""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNone(blocks) + self.assertIsNone(save_path) + + def test_load_exec_block_wrong_tag(self): + """Test parsing text with code blocks but wrong language tag.""" + llm_text = """```javascript +console.log("This is JavaScript, not Python"); +```""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNone(blocks) + self.assertIsNone(save_path) + + def test_load_exec_block_incomplete_block(self): + """Test parsing text with incomplete code block (missing closing tag).""" + llm_text = """```python +print("This block has no closing tag") +x = 42""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertEqual(blocks, []) + self.assertIsNone(save_path) + + def test_load_exec_block_empty_block(self): + """Test parsing empty code block.""" + llm_text = """```python +```""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 1) + self.assertEqual(blocks[0], '\n') + + def test_load_exec_block_mixed_content(self): + """Test parsing text with mixed content including code blocks.""" + llm_text = """Let me help you with that task. + +First, I'll import the necessary modules: +```python +import os +import sys +``` + +Then I'll define a function: +```python +def process_data(data): + return data.upper() +``` + +Finally, let's use it: +```python +result = process_data("hello world") +print(result) +``` + +That should work!""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 3) + self.assertEqual(blocks[0], '\nimport os\nimport sys\n') + self.assertEqual(blocks[1], '\ndef process_data(data):\n return data.upper()\n') + self.assertEqual(blocks[2], '\nresult = process_data("hello world")\nprint(result)\n') + + def test_load_exec_block_with_special_characters(self): + """Test parsing code blocks containing special characters.""" + llm_text = """```python +text = "Hello \"world\" with 'quotes'" +regex = r"^\\d+$" +path = "C:\\Users\\test\\file.txt" +```""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertIsNotNone(blocks) + self.assertEqual(len(blocks), 1) + expected = '\ntext = "Hello "world" with \'quotes\'"\nregex = r"^\\d+$"\npath = "C:\\Users\\test\\file.txt"\n' + self.assertEqual(blocks[0], expected) + + def test_load_exec_block_tag_undefined(self): + """Test that assertion error is raised when tag is undefined.""" + self.tool.tag = "undefined" + llm_text = """```python +print("test") +```""" + + with self.assertRaises(AssertionError): + self.tool.load_exec_block(llm_text) + + def test_found_executable_blocks_flag(self): + """Test that the executable blocks found flag is set correctly.""" + self.assertFalse(self.tool.found_executable_blocks()) + + llm_text = """```python +print("test") +```""" + + blocks, save_path = self.tool.load_exec_block(llm_text) + + self.assertTrue(self.tool.found_executable_blocks()) + + self.assertFalse(self.tool.found_executable_blocks()) + + def test_get_parameter_value(self): + """Test the get_parameter_value helper method.""" + block = """param1 = value1 +param2 = value2 +some other text +param3 = value3""" + + self.assertEqual(self.tool.get_parameter_value(block, "param1"), "value1") + self.assertEqual(self.tool.get_parameter_value(block, "param2"), "value2") + self.assertEqual(self.tool.get_parameter_value(block, "param3"), "value3") + self.assertIsNone(self.tool.get_parameter_value(block, "nonexistent")) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file