FastGPT 是一個超級🐮🍺的 ChatGPT 平臺項目,功能非常強大:
✅ 集成了 ChatGPT、GPT4 和 Claude
✅ 可以使用任意文本來訓練自己的知識庫、文檔庫,而且知識庫專有模型可以限定爲“只能回答知識庫相關問題,其他問題一律不予回答”
✅ 開放模型市場,其中有一個非常暴躁的模型叫暴躁小哥😄
✅ 提供 API,你可以通過 API 的形式接入到自己的應用中,例如:飛書、企業微信、客服助手、公衆號等
✅ 可自定義 OpenAI API Key
🌐鏈接:https://fastgpt.run/?inviterId=64215e9914d068bf840141d0
而 Laf 是一款爲所有開發者打造的集函數、數據庫、存儲爲一體的雲開發平臺,助你像寫博客一樣寫代碼,隨時隨地發佈上線應用!3 分鐘上線 ChatGPT 應用!
🏠官網(國內):https://laf.run
🌎官網(海外):https://laf.dev
這篇文章教你用兩分半的時間,利用 FastGPT 和 Laf 將 ChatGPT 接入企業微信。
條件
企業微信需要使用已經備案的域名,所以這裏需要用國區的域名。點擊這裏可以參考企業微信詳細說明
FastGPT操作
- 前往“AI助手”頁面,創建一個AI助手,並記錄這裏的modelId(用FASTGPT_MODEL_ID表示)
- 前往“開發”頁面,創建一個API KEY,記錄這裏的API KEY 爲 FASTGPT_APIKEY
企業微信操作
- 進入企業微信管理後臺-我的企業,記錄這裏的企業ID爲 WXWORK_CORPID
- 進入應用管理頁面,點擊【創建應用】進入創建頁面,填寫應用信息後點擊【創建應用】。如果已經有現成的應用,可以跳過此步驟。
- 在應用管理頁面點擊剛剛創建好的應用,進入應用詳情頁面。記錄這裏的AgentId和Secret(需要點擊獲取按鈕,在企業微信聊天窗口裏面獲取),分別爲WXWORK_AGENTID和WXWORK_CORPSECRET。
- 在應用詳情頁面,接收消息處點擊【設置API接收】。
在API接收消息頁面,點一下兩個【隨機獲取】按鈕,它會自動生成一個Token和EncodingAESKey,我們分別記爲WXWORK_TOKEN和WXWORK_AESKEY。注意,不要關掉這個頁面,Laf側配置完畢後我們再來填寫URL。
Laf 操作
- 進入Laf控制檯,新建一個應用。
- 進入開發頁面,先安裝兩個npm依賴:
- xml2js
- @wecom/crypto
- 創建一個雲函數
chatgpt
(不可改名),取消所有請求方法,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'
export async function sendGptMessage(message) {
console.log('send gpt message', message)
const res = await cloud.fetch({
url: 'https://fastgpt.run/api/openapi/chat/chat',
method: 'POST',
headers: {
apikey: process.env.FASTGPT_APIKEY
},
data: {
"modelId": process.env.FASTGPT_MODEL_ID,
"isStream": false,
"prompts": [
{
"obj": "Human",
"value": message
},
]
}
})
console.log('send gpt message result', res?.data)
return res.data?.data
}
- 創建一個雲函數
wxwork
(不可改名),取消所有請求方法,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'
export async function getToken() {
const cache = cloud.shared.get('access-token')
console.log('checking cache', cache, cache.expires >= Date.now())
if (cache && cache.expires >= Date.now()) return cache.token;
console.log('start to get token of', process.env.WXWORK_CORPID)
const res = await cloud.fetch({
url: 'https://qyapi.weixin.qq.com/cgi-bin/gettoken',
method: 'get',
params: {
corpid: process.env.WXWORK_CORPID,
corpsecret: process.env.WXWORK_CORPSECRET,
}
})
const token = res.data.access_token
cloud.shared.set('access-token', { token, expires: Date.now() + res.data.expires_in * 1000 })
return token
}
export async function sendMessage(message, user) {
console.log('send messagge', user, message)
const res = await cloud.fetch({
url: 'https://qyapi.weixin.qq.com/cgi-bin/message/send',
method: 'POST',
params: {
access_token: await getToken()
},
data: {
"touser": user,
"msgtype": "text",
"agentid": process.env.WXWORK_AGENTID,
"text": {
"content": message
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
})
console.log('send message result', res.data)
}
- 創建一個雲函數
wxwork-gpt-api
(隨便改名),開放GET和POST請求,填寫下面的代碼併發布。
import cloud from '@lafjs/cloud'
import { decrypt, getSignature } from '@wecom/crypto';
import { sendMessage } from '@/wxwork'
import { sendGptMessage } from '@/chatgpt'
import xml2js from 'xml2js';
export default async function (ctx: FunctionContext) {
const { query } = ctx;
const { msg_signature, timestamp, nonce, echostr } = query;
const token = process.env.WXWORK_TOKEN;
const key = process.env.WXWORK_AESKEY;
console.log('start to invoke wxwork-gpt-api')
// 簽名驗證專用
if (ctx.method === 'GET') {
const signature = getSignature(token, timestamp, nonce, echostr);
if (signature !== msg_signature) {
return { message: '簽名驗證失敗', code: 401 }
}
const { message } = decrypt(key, echostr);
return message
}
const payload = ctx.body.xml;
const encrypt = payload.encrypt[0];
const signature = getSignature(token, timestamp, nonce, encrypt);
if (signature !== msg_signature) {
return { message: '簽名驗證失敗', code: 401 }
}
//ctx.response.sendStatus(200);
const { message } = decrypt(key, encrypt);
const {
xml
} = await xml2js.parseStringPromise(message)
// 由於GPT API耗時較久,這裏提前返回,防止企業微信超時重試,後續再手動調用發消息接口
ctx.response.sendStatus(200);
await asyncSendMessage(xml)
return { message: true, code: 0 }
}
async function asyncSendMessage(xml) {
if (xml.MsgType[0] !== 'text') return;
sendMessage('AI思考中, 請耐心等待~~', xml.FromUserName[0])
try {
const result = await sendGptMessage(xml.Content[0])
await sendMessage(result, xml.FromUserName[0])
}
catch (e){
console.log(e, e.config)
sendMessage('接口請求失敗,請聯繫管理員查看錯誤信息', xml.FromUserName[0])
}
}
- 點擊左下角設置,選擇環境變量,將剛剛收集的WXWORK_TOKEN、WXWORK_AESKEY、WXWORK_CORPID、WXWORK_AGENTID、WXWORK_CORPSECRET、FASTGPT_APIKEY、FASTGPT_MODEL_ID 填入,並點擊更新按鈕。
- 複製
wxwork-gpt-api
這個雲函數的調用地址,將它填寫到企業微信管理後臺【API接收消息】頁面中的URL中,並保存上述信息。
- 在企業微信中,進入你剛剛創建的應用,就可以跟機器人愉快的聊天了~~