ChatGPT on WeChat
🤖️ Turn your WeChat into ChatGPT within only 2 steps! 🤖️
Features
This project is implemented based on this amazing project that I contibuted before, with Wechaty SDK
and OpenAI API
, we achieve:
- fast and robust connection to a set of AI models with different features, typically
gpt-4o
andgpt-3.5-turbo
which powersChatGPT
- stable, persistent and rapid deployment on cloud servers
Railway
0. Table of Content
- ChatGPT on WeChat
1. How to Deploy this Bot?
You can deploy in local or on cloud, whatever you want.
The deploy on cloud method is recommended.
1.1 Deploy in Local
1.1.1 Get your OpenAI API Keys
openaiApiKey
can be generated in the API Keys Page in your OpenAI accountopenaiOrganizationID
is optional, which can be found in the Settings Page in your Open AI account
1.1.2 Configure Environment Variables
You can copy the template config.yaml.example
into a new file config.yaml
, and paste the configurations:
openaiApiKey: "<your_openai_api_key>"
openaiOrganizationID: "<your_organization_id>"
chatgptTriggerKeyword: "<your_keyword>"
Or you can export the environment variables listed in .env.example
to your system, which is a more encouraged method to keep your OpenAI API Key
safe:
export OPENAI_API_KEY="sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export OPENAI_ORGANIZATION_KEY="org-XXXXXXXXXXXXXXX"
export CHATGPT_TRIGGER_KEYWORD="Hi bot:"
Please note:
chatgptTriggerKeyword
is the keyword which can trigger auto-reply:- In private chat, the message starts with it will trigger auto-reply
- In group chat, the message starts with
@Name <keyword>
will trigger auto-reply
chatgptTriggerKeyword
can be empty string, which means:- In private chat, every messages will trigger auto-reply
- In group chat, only "@ the bot" will trigger auto-reply
1.1.3 Setup the Docker
- Setup Docker Image
docker build -t chatgpt-on-wechat .
- Setup Docker Container
docker run -v $(pwd)/config.yaml:/app/config.yaml chatgpt-on-wechat
You can also build with Docker Compose:
- Start the container
docker-compose up -d
- View the QR code to log in to wechat
docker-compose logs -f
1.1.4 Login your WeChat
Once you deploy the bot successfully, just follow the terminal
or Logs
in Docker container prompt carefully:
- Scan the QR Code with mobile WeChat
- Click "Log in" to allow desktop login (where our bot stays)
- Wait a few seconds and start chatting!
🤖 Enjoy your powerful chatbot! 🤖
1.2 Deploy on Cloud
Click the button below to fork this repo and deploy with Railway!
1.2.1 Configure on Railway
Fill in the following blanks:
- Your forked repo name (can be any name you like)
- Choose make it private or not (also up to you)
- Environment variables (for how to get OpenAI API keys, please refer to 1.1.1 Get your OpenAI API Keys)
Please note:
Make sure the environment variables are set in RailWay instead of writing directly in config.yaml
. It's really NOT recommended to implicitly write out your OpenAI API Key
in public repo. Anyone with your key can get access to the OpenAI API services, and it's possbile for you to lose money if you pay for that.
1.2.2 Deploy & Login on Railway
The deploy process is automatic. It may take a few minutes for the first time. As you see the Success
, click the tab to see the details. (which is your secret WeChat console!)
Click Deply Logs
and you will see everything is setting up, wait for a QR Code to pop up. Scan it as if you are login to your desktop WeChat, and click "Log in" on your mobile WeChat.
Finally, everything is good to go! You will see the logs when people sending you messagem, and whenever the chatbot is auto-triggered to reply.
🤖 Enjoy your powerful chatbot! 🤖
2. Any Fancy Advanced Settings?
2.1 Config Reply in Error
When the OpenAI API encounters some errors (e.g. over-crowded traffic, no authorization, ...), the chatbot will auto-reply the pre-configured message.
You can change it in src/chatgpt.js
:
const chatgptErrorMessage = "🤖️:ChatGPT摆烂了,请稍后再试~";
2.2 Config OpenAI
Models
You can change whatever OpenAI
Models you like to handle task at different capability, time-consumption and expense trade-off. (e.g. model with better capability costs more time to respond)
Currently, the latest GPT-4o
model is up and running!
Since the latest gpt-4
model is currently in a limited beta and only accessible to those who have been granted access, currently we use the gpt-3.5-turbo
model as default. Of course, if you have the access to gpt-4
API, you can just change the model to gpt-4
without any other modification.
According to OpenAI doc,
GPT-4o (“o” for “omni”) is our most advanced model. It is multimodal (accepting text or image inputs and outputting text), and it has the same high intelligence as GPT-4 Turbo but is much more efficient—it generates text 2x faster and is 50% cheaper. Additionally, GPT-4o has the best vision and performance across non-English languages of any of our models.
GPT-3.5 models can understand and generate natural language or code. Our most capable and cost effective model in the GPT-3.5 family isgpt-3.5-turbo
which has been optimized for chat but works well for traditional completions tasks as well.
Also, for the same model, we can configure dozens of parameter (e.g. answer randomness, maximum word limit...). For example, for the temperature
field:
Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
You can configure all of them in src/chatgpt.js
:
chatgptModelConfig: object = {
// this model field is required
model: "gpt-4o",
// add your ChatGPT model parameters below
temperature: 0.8,
// max_tokens: 2000,
};
For more details, please refer to OpenAI Models Doc.
2.3 Config Model Features
You can change whatever features you like to handle different types of tasks. (e.g. complete text, edit text, generate code...)
Currently, we use createChatCompletion()
powered by gpt-4o
model, which:
take a series of messages as input, and return a model-generated message as output.
You can configure in src/chatgpt.js
:
const response = await this.openaiApiInstance.createChatCompletion({
...this.chatgptModelConfig,
messages: inputMessages,
});
For more details, please refer to OpenAI API Doc.
2.4 Add Customized Task Handler
You can add your own task handlers to expand the ability of this chatbot!
In src/chatgpt.ts
ChatGPTBot.onCustimzedTask()
, write your own task handler:
// e.g. if a message starts with "Hello", the bot sends "World!"
if (message.text().startsWith("Hello")) {
await message.say("World!");
return;
}
3. Common Errors and Troubleshooting
3.1 Assertion Error during Login or Self-chat 🤯
-
Error Log:
uncaughtException AssertionError [ERR_ASSERTION]: 1 == 0 at Object.equal (/app/node_modules/wechat4u/src/util/global.js:53:14) at /app/node_modules/wechat4u/src/core.js:195:16 at processTicksAndRejections (node:internal/process/task_queues:96:5) { code: 2, details: 'AssertionError [ERR_ASSERTION]: 1 == 0\n' + ' at Object.equal (/app/node_modules/wechat4u/src/util/global.js:53:14)\n' + ' at /app/node_modules/wechat4u/src/core.js:195:16\n' + ' at processTicksAndRejections (node:internal/process/task_queues:96:5)' }
-
Solution:
3.2 I can't trigger auto reply 🤔
- Solution:
- Before deployment, read the trigger conditions in 1.1.2 Configure Environment Variables
- After deployment, check the console logs for following lines:
- 🎯 Trigger keyword in private chat is:
<keyword>
- 🎯 Trigger keyword in group chat is:
@Name <keyword>
- 🎯 Trigger keyword in private chat is:
4. How to Contribute to this Project?
You are more than welcome to raise some issues, fork this repo, commit your code and submit pull request. And after code review, we can merge your contribution. I'm really looking forward to develop more interesting features!
Also, there're something in the to-do list for future enhancement:
- Chat with context (integrate with
LangChain
):
- Keep track of every on-going conversation for each private chat or group chat
- Dynamic drop or summarize the history conversation sent throught API in case the token gets oversized
- Set time-out for a conversation when users stop chatting for a while
- More AI capability:
- Integrate OpenAI
DALL·E
model for AI image creation. Triggered by customized keyword (e.g. Hi bot, draw...) - Integrate OpenAi
Whisper
model for speech recognition. Triggered by voice messages and do transcription or translation
- More flexible depolyment:
- Make deployment templates on other cloud platforms
- Optimize depolyment process to be more robust and compatible on different OS
5. Acknowledgement
Great thanks to:
- @leoncsyang for fixing Issue #81
- @hdfk7 for fixing Issue #67
- @jichangfeng for merging PR #61