base on 🤖 🔥 Language-to-actions engine
Get 1:1 support, Join the community (NEW!!)
[![](https://dcbadge.vercel.app/api/server/yjEgCgvefr)](https://discord.gg/yjEgCgvefr)
> [!TIP]
> If you are looking for a managed version of OpenCopilot, [check out the cloud version ](https://cloud.opencopilot.so/) - it's production-ready with our latest planning engine that can handle and understand complex user requests.
<img width="1445" alt="image" style="border-radius:20px" src="https://github.com/openchatai/OpenCopilot/assets/32633162/340d174b-6ddd-452f-a66d-6c5567cc4583">
**Documentation [available here](https://docs.opencopilot.so)**
------
# 🔥 OpenCopilot
----
OpenCopilot allows you to have your own product's AI copilot. It integrates with your underlying APIs and can execute API calls whenever needed. It uses LLMs to determine if the user's request requires calling an API endpoint. Then, it decides which endpoint to call and passes the appropriate payload based on the given API definition.
## How does it work?
- Provide your APIs/actions definition, including your public endpoints and how to call them. Currently, OpenCopilot supports Swagger OpenAPI 3.0 for bulk import.
- OpenCopilot validates your schema to achieve the best results.
- Finally, you can integrate our user-friendly chat bubble into your SaaS app.
## 🚀 Getting Started
- Make sure you have docker installed.
- To begin, clone this Git repository:
```
git clone
[email protected]:openchatai/OpenCopilot.git
```
In the `.env` file located in the `llm-server` directory, make sure to replace the placeholder value for the `OPENAI_API_KEY` variable with your actual token:
```
OPENAI_API_KEY=YOUR_TOKEN_HERE
```
### For Linux Machines
To install the necessary dependencies and set up the environment for OpenCopilot, use the following command:
```bash
make install
```
### For ARM Machines (Mac Silicon)
If you are using an ARM machine, specifically Mac Silicon, use the following command to install dependencies and set up the environment:
```bash
make install-arm
```
Once the installation is complete, you can access the OpenCopilot console at [http://localhost:8888](http://localhost:8888).
## Additional Commands
- **make migrate**: Run Alembic migrations.
- **make down**: Stop and remove all containers.
- **make exec-dashboard**: Access the dashboard container's shell.
- **make exec-llm-server**: Access the llm-server container's shell.
- **make restart**: Restart all containers.
- **make logs**: Show container logs.
- **make purge**: Fully clean uninstall (remove containers, networks, volumes, .env).
- **make help**: Display help message with available targets.
This will install the necessary dependencies and set up the environment for the OpenCopilot project.
Once the installation is complete, you can access the OpenCopilot console at http://localhost:8888
## Try it out:
**You can try it out on [opencopilot.so](http://opencopilot.so/)**
[![IMAGE ALT TEXT](https://github.com/openchatai/OpenCopilot/assets/32633162/edebbaa6-eba5-4f72-b88d-cf0d690fffa8)](http://www.youtube.com/watch?v=HVvbY7A7lIQ "Video Title")
(OpenCopilot is not affiliated with Shopify, and they do not use OpenCopilot, it's just a demo of what copilots are capable of)
## AI Copilot: a growing trend
- [Shopify is developing "Shopify Sidekick."](https://www.youtube.com/watch?v=HVvbY7A7lIQ&ab_channel=Shopify)
- [Microsoft is working on "Windows Copilot."](https://www.youtube.com/watch?v=FCfwc-NNo30&ab_channel=MicrosoftDeveloper)
- [GitHub is in the process of creating "GitHub Copilot."](https://github.com/features/copilot)
- [Microsoft is also developing "Bing Copilot."](https://www.microsoft.com/en-us/bing?form=MA13FV)
Our goal is to empower every SaaS product with the ability to have their own AI copilots tailored for their unique products.
## 🏁 What OpenCopilot can and can't do now?
- It is capable of calling your underlying APIs.
- It can transform the response into meaningful text.
- It can automatically populate certain request payload fields based on the context.
- For instance, you can request actions like: "Initiate a new case about X problem," and the title field will be automatically filled with the appropriate name.
- It is not suitable for handling large APIs (you will need to write JSON transformers to make it work, refer to the docs for more)
## 🛣️ Teach the copilot via flows:
Most of the time, the copilot can figure out what actions to execute when the user requests something, but in case there is a complex flow, you can define it to help the copilot:
<img width="1453" alt="image 2" src="https://github.com/openchatai/OpenCopilot/assets/32633162/81cb899c-0200-40c6-bc2f-4fe49e112085">
## 🛣️ Embed on your app in a few lines of code
Less than <10 lines of codes to implement on your web app or desktop app
<img width="1445" alt="image" src="https://github.com/openchatai/OpenCopilot/assets/32633162/d2ad2597-9de2-4177-b894-7ce92dfd1fcd">
### Important links
- The backend server (API) is reachable via http://localhost:8888/backend
- The dashboard server is reachable via http://localhost:8888/
- You can also [use our SDK](https://github.com/openchatai/typescript-sdk)
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome!
## Contributors ✨
- Learn how OpenCopilot codebase works and how you can contribute using Onbaord AI's tool: [learnthisrepo.com/opencopilot](https://learnthisrepo.com/opencopilot)
- This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome!
## Analytics
This product collects anonymous usage data to help improve your experience. You can opt out by setting `ENABLE_EXTERNAL_API_LOGGING=no` in your environment variables.
", Assign "at most 3 tags" to the expected json: {"id":"2267","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"