搭建一个微信机器人,接入Midjourney

Midjourney很好用,画面很美观,可是一群没有账号的伙伴用不了,所以想着做一个微信机器人去调用Midjourney来降低运用门槛,让大家都用起来。

建立微信机器人

必定不会从零开始自己建立,先去翻了翻GitHub,找到了一个现已介入ChatGPT的微信机器人。

github.com/zhayujie/ch…

搭建一个微信机器人,接入Midjourney

Wechat robot based on ChatGPT, which using OpenAI api and itchat library. 运用ChatGPT建立微信谈天机器人,根据GPT3.5/4.0 API实现,支撑个人微信、大众号、企业微信布置,能处理文本、语音和图片,拜访操作体系和互联网。

预备

1. OpenAI账号注册

前往OpenAI注册页面创立账号,参阅这篇教程能够经过虚拟手机号来接收验证码。创立完账号则前往API办理页面创立一个 API Key 并保存下来,后面需求在项目中装备这个key。

项目中默许运用的对话模型是 gpt3.5 turbo,计费方法是约每 500 汉字 (包括请求和回复) 耗费 0.002,图片生成是每张耗费0.002,图片生成是每张耗费 0.016。

2.运转环境

支撑 Linux、MacOS、Windows 体系(可在Linux服务器上长期运转),一起需装置Python

建议Python版别在 3.7.1~3.9.X 之间,引荐3.8版别,3.10及以上版别在 MacOS 可用,其他体系上不确定能否正常运转。

(1) 克隆项目代码:

git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/

(2) 装置中心依靠 (必选):

能够运用itchat创立机器人,并具有文字沟通功用所需的最小依靠集合。

pip3 install -r requirements.txt

(3) 拓宽依靠 (可选,建议装置):

pip3 install -r requirements-optional.txt

假如某项依靠装置失败请注释掉对应的行再持续。

其间tiktoken要求python版别在3.8以上,它用于精确核算会话运用的tokens数量,强烈建议装置。

运用googlebaidu语音辨认需装置ffmpeg

默许的openai语音辨认不需求装置ffmpeg

装备

装备文件的模板在根目录的config-template.json中,需复制该模板创立最终生效的config.json文件:

  cp config-template.json config.json

然后在config.json中填入装备,以下是对默许装备的说明,可根据需求进行自定义修正(请去掉注释):

# config.json文件内容示例
{
  "open_ai_api_key": "YOUR API KEY",                          # 填入上面创立的 OpenAI API KEY
  "model": "gpt-3.5-turbo",                                   # 模型称号。当use_azure_chatgpt为true时,其称号为Azure上model deployment称号
  "proxy": "127.0.0.1:7890",                                  # 署理客户端的ip和端口
  "single_chat_prefix": ["bot", "@bot"],                      # 私聊时文本需求包括该前缀才能触发机器人回复
  "single_chat_reply_prefix": "[bot] ",                       # 私聊时主动回复的前缀,用于区别真人
  "group_chat_prefix": ["@bot"],                              # 群聊时包括该前缀则会触发机器人回复
  "group_name_white_list": ["ChatGPT测验群", "ChatGPT测验群2"], # 敞开主动回复的群称号列表
  "group_chat_in_one_session": ["ChatGPT测验群"],              # 支撑会话上下文同享的群称号  
  "image_create_prefix": ["画", "看", "找"],                   # 敞开图片回复的前缀
  "conversation_max_tokens": 1000,                            # 支撑上下文回忆的最多字符数
  "speech_recognition": false,                                # 是否敞开语音辨认
  "group_speech_recognition": false,                          # 是否敞开群组语音辨认
  "use_azure_chatgpt": false,                                 # 是否运用Azure ChatGPT service替代openai ChatGPT service. 当设置为true时需求设置 open_ai_api_base,如 https://xxx.openai.azure.com/
  "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在答复并处理人们的任何问题,并且能够运用多种语言与人沟通。",  # 人格描述
  # 订阅音讯,大众号和企业微信channel中请填写,当被订阅时会主动回复,可运用特别占位符。目前支撑的占位符有{trigger_prefix},在程序中它会主动替换成bot的触发词。
  "subscribe_msg": "感谢您的关注!\n这里是ChatGPT,能够自在对话。\n支撑语音对话。\n支撑图片输出,画字最初的音讯将按要求创作图片。\n支撑角色扮演和文字冒险等丰厚插件。\n输入{trigger_prefix}#help 查看详细指令。"
}

装备说明:

1.个人谈天

  • 个人谈天中,需求以 “bot”或”@bot” 为最初的内容触发机器人,对应装备项single_chat_prefix(假如不需求以前缀触发能够填写"single_chat_prefix": [""])
  • 机器人回复的内容会以 “[bot] ” 作为前缀, 以区别真人,对应的装备项为single_chat_reply_prefix(假如不需求前缀能够填写"single_chat_reply_prefix": "")

2.群组谈天

  • 群组谈天中,群称号需装备在group_name_white_list 中才能敞开群聊主动回复。假如想对一切群聊生效,能够直接填写"group_name_white_list": ["ALL_GROUP"]
  • 默许只需被人 @ 就会触发机器人主动回复;另外群谈天中只需检测到以 “@bot” 最初的内容,相同会主动回复(方便自己触发),这对应装备项group_chat_prefix
  • 可选装备:group_name_keyword_white_list装备项支撑含糊匹配群称号,group_chat_keyword装备项则支撑含糊匹配群音讯内容,用法与上述两个装备项相同。(Contributed byevolay)
  • group_chat_in_one_session:使群聊同享一个会话上下文,装备["ALL_GROUP"]则作用于一切群聊

3.语音辨认

  • 增加"speech_recognition": true将敞开语音辨认,默许运用openai的whisper模型辨认为文字,一起以文字回复,该参数仅支撑私聊 (注意由于语音音讯无法匹配前缀,一旦敞开将对一切语音主动回复,支撑语音触发画图);
  • 增加"group_speech_recognition": true将敞开群组语音辨认,默许运用openai的whisper模型辨认为文字,一起以文字回复,参数仅支撑群聊 (会匹配group_chat_prefix和group_chat_keyword, 支撑语音触发画图);
  • 增加"voice_reply_voice": true将敞开语音回复语音(一起作用于私聊和群聊),可是需求装备对应语音组成平台的key,由于itchat协议的限制,只能发送语音mp3文件,若运用wechaty则回复的是微信语音。

4.其他装备

  • model: 模型称号,目前支撑gpt-3.5-turbo,text-davinci-003,gpt-4,gpt-4-32k(其间gpt-4 api暂未开放)
  • temperature,frequency_penalty,presence_penalty: Chat API接口参数,概况参阅OpenAI官方文档。
  • proxy:由于目前openai接口国内无法拜访,需装备署理客户端的地址,概况参阅#351
  • 对于图画生成,在满足个人或群组触发条件外,还需求额外的关键词前缀来触发,对应装备image_create_prefix
  • 关于OpenAI对话及图片接口的参数装备(内容自在度、回复字数限制、图片大小等),能够参阅对话接口和图画接口文档直接在代码bot/openai/open_ai_bot.py中进行调整。
  • conversation_max_tokens:表示能够回忆的上下文最大字数(一问一答为一组对话,假如累积的对话字数超出限制,就会优先移除最早的一组对话)
  • rate_limit_chatgptrate_limit_dalle:每分钟最高问答速率、画图速率,超速后排队按序处理。
  • clear_memory_commands: 对话内指令,主动清空前文回忆,字符串数组可自定义指令别名。
  • hot_reload: 程序退出后,暂存微信扫码状况,默许封闭。
  • character_desc装备中保存着你对机器人说的一段话,他会记住这段话并作为他的设定,你能够为他定制任何人格 (关于会话上下文的更多内容参阅该issue)
  • subscribe_msg:订阅音讯,大众号和企业微信channel中请填写,当被订阅时会主动回复, 可运用特别占位符。目前支撑的占位符有{trigger_prefix},在程序中它会主动替换成bot的触发词。

一切可选的装备项均在该文件中列出。

运转

1.本地运转

假如是开发机本地运转,直接在项目根目录下执行:

python3 app.py

终端输出二维码后,运用微信进行扫码,当输出 “Start auto replying” 时表示主动回复程序现已成功运转了(注意:用于登录的微信需求在付出处已完结实名认证)。扫码登录后你的账号就成为机器人了,能够在微信手机端经过装备的关键词触发主动回复 (任意老友发送音讯给你,或是自己发音讯给老友),参阅#142。

2.服务器布置

运用nohup指令在后台运转程序:

touch nohup.out                                   # 首次运转需求新建日志文件  
nohup python3 app.py & tail -f nohup.out          # 在后台运转程序并经过日志输出二维码

扫码登录后程序即可运转于服务器后台,此时可经过ctrl+c封闭日志,不会影响后台程序的运转。运用ps -ef | grep app.py | grep -v grep指令可查看运转于后台的进程,假如想要重新发动程序能够先kill掉对应的进程。日志封闭后假如想要再次打开只需输入tail -f nohup.out。此外,scripts目录下有一键运转、封闭程序的脚本供运用。

多账号支撑: 将项目复制多份,分别发动程序,用不同账号扫码登录即可实现一起运转。

特别指令: 用户向机器人发送 #reset即可清空该用户的上下文回忆。

建立Midjourney

相同不是从零开始写,从GitHub里找了找,果然找到了一个好项目。

github.com/novicezk/mi…

搭建一个微信机器人,接入Midjourney

署理 MidJourney 的discord频道,实现api形式调用AI绘图

现有功用

  • 支撑 Imagine 指令和相关U、V操作
  • Imagine 时支撑增加图片base64,作为垫图
  • 支撑 Describe 指令,根据图片生成 prompt
  • 支撑 Blend 指令,多个图片混合
  • 支撑 Imagine、V、Blend 图片生成进度
  • 支撑中文 prompt 翻译,需装备百度翻译或 gpt
  • prompt 灵敏词判别,支撑覆盖调整
  • 任务队列,默许队列10,并发3。可参阅MidJourney订阅级别调整mj.queue
  • 可选 user-token 衔接 wss,以获取错误信息和完整功用
  • 支撑 discord域名(server、cdn、wss)反代,装备 mj.ng-discord

运用前提

  1. 科学上网
  2. docker环境
  3. 注册 MidJourney,创立自己的频道,参阅docs.midjourney.com/docs/quick-…
  4. 增加自己的机器人:流程说明
  5. user-wss方法,可不增加自己的机器人,但仍需参阅流程的第4、5步,获取用户Token、服务器ID、频道ID

危险须知

  1. 作图频繁等行为,触发midjourney验证码后,需赶快人工验证
  2. user-wss方法能够获取midjourney的错误信息、支撑图片变换进度,但可能会增加账号危险

快速发动

  1. /xxx/xxx/config目录下创立 application.yml(mj装备项)、banned-words.txt(可选,覆盖默许的灵敏词文件);参阅src/main/resources下的文件
  2. 发动容器,映射config目录
docker run -d --name midjourney-proxy \
 -p 8080:8080 \
 -v /xxx/xxx/config:/home/spring/config \
 --restart=always \
 novicezk/midjourney-proxy:2.1.4
  1. 拜访http://ip:port/mj查看API文档

附: 不映射config目录方法,直接在发动指令中设置参数

docker run -d --name midjourney-proxy \
 -p 8080:8080 \
 -e mj.discord.guild-id=xxx \
 -e mj.discord.channel-id=xxx \
 -e mj.discord.user-token=xxx \
 -e mj.discord.bot-token=xxx \
 --restart=always \
 novicezk/midjourney-proxy:2.1.4

本地开发

  • 依靠java17和maven
  • 更改装备项: 修正src/main/application.yml
  • 项目运转: 发动ProxyApplication的main函数
  • 更改代码后,构建镜像:docker build . -t midjourney-proxy

集成

midjourney_bot.py

这个需求从零开始写,Midjourney Proxy服务运用JAVA布置,并经过HTTP能够拜访,所以这个机器人就是纯粹的运用HTTP调用服务。

import time
import requests  
from config import conf  
class MidJourneyBot(object):  
    def __init__(self):  
        pass  
    def mj_create_img(self,query):  
        url = conf().get("midjourney_url")  
        url = url + "/trigger/submit"  
        if query.endswith("."):  
            query = query[:-1]  
        bodyParams = {  
            "action": "IMAGINE",  
            "prompt": query  
        }  
        # 1. 运用PSOT拜访Midjourney接口生成图片  
        response = requests.post(url, json=bodyParams)  
        print(response)  
        # 2. 定时器获取图片生成状况  
        if (response.status_code == 200):  
            data = response.json()  
            # 接口调用成功  
            if (data['code'] == 1):  
                job_id = data['result']  
                # 开始循环调用图片生成状况接口  
                return True, self.check_job_status(job_id)  
            return False, "Not Implemented"  
        # 3. 生成成功返回图片地址  
        return False, "Not Implemented"  
    # 运用定时器定期获取图片生成状况  
    def check_job_status(self,job_id):  
        base_url = conf().get("midjourney_url")  
        url = f"{base_url}/task/{job_id}/fetch"  
        try:  
            while True:  
                response = requests.get(url)  
                if response.status_code == 200:  
                    data = response.json()  
                    status = data['status']  
                if status == 'SUCCESS':  
                    return data['imageUrl']  
                elif status in ['error', 'expired']:  
                    raise Exception(f'Job failed with status {status}')  
                else:  
                    raise Exception('Failed to check job status')  
                time.sleep(2) # 每5秒查看一次  
        except Exception as e:  
            print(e)

修正chat_gpt_bot.py文件

搭建一个微信机器人,接入Midjourney

找到:elif context.type == ContextType.IMAGE_CREATE:代码行 替换原有调用OpenAI图片生成服务的代码,运用Midjourney实现高质量图片生成。