base on AI Search & RAG Without Moving Your Data. Get instant answers from your company's knowledge across 100+ apps while keeping data secure. Deploy in minutes, not months. <div align="center"> [![SWIRL](docs/images/large_header.png)](https://www.swirlaiconnect.com) </div> <h1>SWIRL</h1> ## Give your team ChatGPT-level search without moving data to the cloud ### RAG with One Drive & Microsoft 365 in 60 seconds Ask question โ†’ Get answer with sources โ†’ Click through to source ![SWIRL One Drive RAG](docs/images/SWIRL_4_AI_Search.gif) Watch it on [Youtube](https://youtu.be/6cT25SD4cV4) **Teams using SWIRL saves an average 7.5 hours of productive time per week.** <div align="center"> [โšก Quick Start](#-try-swirl-now-in-docker) ยท [๐Ÿ”Œ Connectors](swirlaiconnect.com/connectors) ยท [๐Ÿค Contribute](#contributing) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg?color=088395&logoColor=blue&style=flat-square)](https://opensource.org/license/apache-2-0/) [![GitHub Release](https://img.shields.io/github/v/release/swirlai/swirl-search?style=flat-square&color=8DDFCB&label=Release)](https://github.com/swirlai/swirl-search/releases) [![Website](https://img.shields.io/badge/Website-swirlaiconnect.com-00215E?style=flat-square)](https://www.swirlaiconnect.com) [![Time Saved](https://img.shields.io/badge/Hours%20Saved-10K%2B-brightgreen)]() [![GitHub Stars](https://img.shields.io/github/stars/swirlai/swirl-search?style=social)](https://github.com/swirlai/swirl-search/stargazers) [![Test and Build Pipeline](https://github.com/swirlai/swirl-search/actions/workflows/test-build-pipeline.yml/badge.svg?style=flat-square&branch=main)](https://github.com/swirlai/swirl-search/actions/workflows/test-build-pipeline.yml) </div> [![Bringing AI to the Data Newsletter](docs/images/Newsletter_CTA.png)](https://www.linkedin.com/newsletters/7201909550860427264/) ## ๐Ÿค” Why SWIRL? ### Skip the Complexity, Keep the Power <table> <tr> <td> <h3 align="center">โŒ Without SWIRL</h3> - Set up vector databases - Move data around - Complex ETL pipelines - Weeks of infrastructure work - Security headaches </td> <td> <h3 align="center">โœ… With SWIRL</h3> - One docker command - Data stays in place - No vector DB needed - 2-minute setup - Enterprise-grade security </td> </tr> </table> ## ๐Ÿš€ Built Different ### No Vector DB Drama ```bash # No need for: $ setup-vector-db $ migrate-data $ configure-indexes # Just this: $ curl https://raw.githubusercontent.com/swirlai/swirl-search/main/docker-compose.yaml -o docker-compose.yaml ``` ## ๐Ÿ’ก What Can You Build With SWIRL? Real examples of what teams build with SWIRL: ### ๐Ÿ” Knowledge Base Search - Connect SharePoint, Confluence, & Drive - Get instant answers with source links - Keep sensitive data secure ### ๐Ÿค– Customer Support Assistant - Search across support docs & tickets - Draft responses using your content - Maintain consistent answers ### ๐Ÿ‘ฉโ€๐Ÿ’ป Developer Assistant - Search GitHub, Jira, & documentation - Find code examples & solutions - Speed up development workflow ### ๐Ÿข Unified Search - Unified search across all tools - Results respect existing permissions - No data duplication needed ### ๐Ÿ‘€ See it in action ![SWIRL Chat in Action](docs/images/SWIRL_4_AI_Chat.gif) ## Schedule Your [Free Demo](https://swirlaiconnect.com/contact-us) of SWIRL Enterprise **Try SWIRL Enterprise for free for 30 Days. Click on the banner to contact us.** [![SWIRL Assistant](docs/images/swirl_enterprise_demo.png)](https://swirlaiconnect.com/contact-us) ### โšก Why Teams Choose SWIRL - ๐Ÿ”’ Your infrastructure, your control - ๐Ÿš€ Deploy in minutes, not months - ๐Ÿ”Œ 100+ enterprise connectors - ๐Ÿค– AI that respects your security ## SWIRL's Ranking in Action SWIRL doesn't just search - it understands your company's context. Instead of broad web results, you get precise answers from your private data, right where it lives. <a href="https://www.youtube.com/watch?v=Ypn4XvSJfcQ" target="_blank"> ![SWIRL vs Google Ranking](docs/images/SWIRL_ranking_img.png) </a> ## SWIRL Features ![Features 1](docs/images/part_1.png) ![Features 2](docs/images/part_2.png) <br/> ### **Full list of connectors is available [here](https://swirlaiconnect.com/connectors)** **For Support on Connectors** Contact the Swirl Team at: [[email protected]](mailto:[email protected]) <br/> # ๐Ÿ”ฅ Try Swirl Now In Docker ## Prerequisites - To run Swirl in Docker, you must have the latest [Docker app](https://docs.docker.com/get-docker/) for MacOS, Linux, or Windows installed and running locally. You can also watch the [**video tutorial**](https://www.youtube.com/watch?v=OogRYkfSki8) to get started. - Windows users must also install and configure either the WSL 2 or the Hyper-V backend, as outlined in the [System Requirements for installing Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/#system-requirements). ## Start Swirl in Docker > **Warning** > Make sure the Docker app is running before proceeding! - Download the YAML file: [https://raw.githubusercontent.com/swirlai/swirl-search/main/docker-compose.yaml](https://raw.githubusercontent.com/swirlai/swirl-search/main/docker-compose.yaml) ```bash curl https://raw.githubusercontent.com/swirlai/swirl-search/main/docker-compose.yaml -o docker-compose.yaml ``` - *Optional*: To enable Swirl's Real-Time Retrieval Augmented Generation (RAG) in Docker, run the following commands from the Console using a valid OpenAI API key: ``` shell export MSAL_CB_PORT=8000 export MSAL_HOST=localhost export OPENAI_API_KEY=โ€˜<your-OpenAI-API-key>โ€™ ``` :key: Check out [OpenAI's YouTube video](https://youtu.be/nafDyRsVnXU?si=YpvyaRvhX65vtBrb) if you don't have an OpenAI API Key. - In MacOS or Linux, run the following command from the Console: ```bash docker-compose pull && docker-compose up ``` - In Windows, run the following command from PowerShell: ```bash docker compose up ``` After a few minutes the following or similar should appear: <img src="https://docs.swirlaiconnect.com/images/swirl_docker_1.png" height="70%" width="90%"> - Open this URL with a browser: <http://localhost:8000> (or <http://localhost:8000/galaxy>) - If the search page appears, click `Log Out` at the top, right. The Swirl login page will appear. - Enter the username `admin` and password `password`, then click `Login`. - Enter a search in the search box and press the `Search` button. Ranked results appear in just a few seconds: <img src="docs/images/SWIRL_4_Galaxy_UI.png" height="70%" weight="70%" style="border-radius: 10px;"> - To view the raw JSON, open <http://localhost:8000/swirl/search/> The most recent Search object will be displayed at the top. Click on the `result_url` link to view the full JSON Response. ## Notes ๐Ÿ“ > **Warning** > The Docker version of Swirl *does not* retain any data or configuration when shut down! :key: Swirl comes configured to search Arxiv, European PMC and Google News right out of the box. :key: Using Swirl with Microsoft 365 requires installation and approval by an authorized company Administrator. For more information, please review the [M365 Guide](https://docs.swirlaiconnect.com/M365-Guide.html) or [contact us](mailto:[email protected]). ## Next Steps ๐Ÿ‘‡ - Check out the details of our [latest release](https://github.com/swirlai/swirl-search/releases)! - Head over to the [Quick Start Guide](https://docs.swirlaiconnect.com/Quick-Start.html) and install Swirl locally! ## Video Tutorial Guide to Run SWIRL in Docker in 60 seconds. <a href="https://www.youtube.com/watch?v=Ypn4XvSJfcQ" target="_blank"> <img src="docs/images/SWIRL_in_docker_guide.jpg" height="200px" width="400px"/> </a> <br/> # ๐ŸŒŸ Key Features | โœฆ | Feature | |:-----:|:--------| | ๐Ÿ“Œ | [Microsoft 365 integration and OAUTH2 support](https://docs.swirlaiconnect.com/M365-Guide.html) | | ๐Ÿ” | [SearchProvider configurations](https://github.com/swirlai/swirl-search/tree/main/SearchProviders) for all included Connectors. They can be [organized with the active, default and tags properties](https://docs.swirlaiconnect.com/User-Guide.html#organizing-searchproviders-with-active-default-and-tags). | | โœ๏ธ | [Adaptation of the query for each provider](https://docs.swirlaiconnect.com/User-Guide.html#search-syntax) such as rewriting `NOT term` to `-term`, removing NOTted terms from providers that don't support NOT, and passing down the AND, + and OR operators. | | โณ | [Synchronous or asynchronous search federation](https://docs.swirlaiconnect.com/Developer-Guide.html#architecture) via [APIs](http://localhost:8000/swirl/swagger-ui/) | | ๐Ÿ›Ž๏ธ | [Optional subscribe feature](https://docs.swirlaiconnect.com/Developer-Guide.html#subscribe-to-a-search) to continuously monitor any search for new results | | ๐Ÿ› ๏ธ | Pipelining of [Processor](https://docs.swirlaiconnect.com/Developer-Guide.html#develop-new-processors) stages for real-time adaptation and transformation of queries, responses and results | | ๐Ÿ—„๏ธ | [Results stored](https://docs.swirlaiconnect.com/Developer-Reference.html#result-objects) in SQLite3 or PostgreSQL for post-processing, consumption and/or analytics | | โžก๏ธ | Built-in [Query Transformation](https://docs.swirlaiconnect.com/Developer-Guide.html#using-query-transformations) support, including re-writing and replacement | | ๐Ÿ“– | [Matching on word stems](https://docs.swirlaiconnect.com/Developer-Reference.html#cosinerelevancypostresultprocessor) and [handling of stopwords](https://docs.swirlaiconnect.com/Developer-Guide.html#configure-stopwords-language) via NLTK | | ๐Ÿšซ | [Duplicate detection](https://docs.swirlaiconnect.com/Developer-Guide.html#detect-and-remove-duplicate-results) on field or by configurable Cosine Similarity threshold | | ๐Ÿ”„ | Re-ranking of unified results [using Cosine Vector Similarity](https://docs.swirlaiconnect.com/Developer-Reference.html#cosinerelevancypostresultprocessor) based on [spaCy](https://spacy.io/)'s large language model and [NLTK](https://www.nltk.org/) | | ๐ŸŽš๏ธ | [Result mixers](https://docs.swirlaiconnect.com/Developer-Reference.html#mixers-1) order results by relevancy, date or round-robin (stack) format, with optional filtering of just new items in subscribe mode | | ๐Ÿ“„ | Page through all results requested, re-run, re-score and update searches using URLs provided with each result set | | ๐Ÿ“ | [Sample data sets](https://github.com/swirlai/swirl-search/tree/main/Data) for use with SQLite3 and PostgreSQL | | โœ’๏ธ | [Optional spell correction](https://docs.swirlaiconnect.com/Developer-Guide.html#add-spelling-correction) using [TextBlob](https://textblob.readthedocs.io/en/dev/quickstart.html#spelling-correction) | | โŒ› | [Optional search/result expiration service](https://docs.swirlaiconnect.com/Admin-Guide.html#search-expiration-service) to limit storage use | | ๐Ÿ”Œ | Easily extensible [Connector](https://github.com/swirlai/swirl-search/tree/main/swirl/connectors) and [Mixer](https://github.com/swirlai/swirl-search/tree/main/swirl/mixers) objects | <br/> # โ˜ Use the Swirl Cloud For information about Swirl as a managed service, please [contact us](mailto:[email protected])! <br/> # ๐Ÿ“– Documentation ๐Ÿ”— [SWIRL Documentation](https://docs.swirlaiconnect.com/) <br/> # ๐Ÿ‘ทโ€โ™‚๏ธ Need Help? We're Here for You At Swirl, every user matters to us. Whether you're a beginner finding your way or an expert with feedback, we're here to support, listen, and help. Don't hesitate to reach out to us. - **Direct Support:** For any questions, suggestions, or even a simple hello, drop us an email at [[email protected]](mailto:[email protected]). We cherish every message and promise to get back to you promptly! - **Request A Connector (Enterprise Support)** Want to see a new connector quickly and fast? Contact us: [[email protected]](mailto:[email protected]) ", Assign "at most 3 tags" to the expected json: {"id":"3564","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"