做門戶網(wǎng)站需要具備什么yw77731域名查詢
說明
我之前實現(xiàn)了簡單UI來跟OriginBot交互,可以參考這里:古月居 - ROS機器人知識分享社區(qū)? 但是由于我不是專業(yè)的前端開發(fā),寫UI還是比較耗時的,所以最近想修改一下這部分。
還有一個原因是,自己開發(fā)前端,如果想實現(xiàn)遠程交互(不在同一wifi下),就一定需要一個云服務(wù)器來中轉(zhuǎn)一下,這個是比較麻煩的。
我期望的交互效果是可以雙向發(fā)送文字、圖片和語音,找了一圈發(fā)現(xiàn)釘釘?shù)?strong>「單聊機器人」可以滿足所有要求,所以這篇博客記錄一下如何為OriginBot接入釘釘單聊機器人。
創(chuàng)建釘釘單聊機器人
創(chuàng)建單聊機器人的步驟其實不復(fù)雜,可以參考:單聊機器人概述 - 釘釘開放平臺
唯一需要注意的是消息接收模式要選擇Stream模式,不要選擇http模式即可。
如何實現(xiàn)收發(fā)消息
在釘釘開放平臺上創(chuàng)建好單聊機器人后,還需要有一個服務(wù)來收發(fā)消息。
在OriginBot上創(chuàng)建一個文件dingtalk_runtime.py
, 內(nèi)容如下:
"""
用于釘釘單聊機器人收發(fā)消息
"""from?dingtalk_stream?import?AckMessage
import?dingtalk_stream
import?osfrom?prompts?import?base_prompt
from?llms?import?azure_gpt4oclass?DingtalkMsgHandler(dingtalk_stream.ChatbotHandler):def?__init__(self):super(dingtalk_stream.ChatbotHandler,?self).__init__()async?def?process(self,?callback:?dingtalk_stream.CallbackMessage):incoming_message?=?dingtalk_stream.ChatbotMessage.from_dict(callback.data)message_type?=?incoming_message.message_typeif?message_type?not?in?("text"):self.reply_text("您發(fā)送的消息類型不合法,目前只支持文本。",?incoming_message)return?AckMessage.STATUS_OK,?"OK"if?message_type?==?"text":text?=?incoming_message.text.content.strip()self.reply_text(text,?incoming_message)return?AckMessage.STATUS_OK,?"OK"def?main():credential?=?dingtalk_stream.Credential(os.getenv("DINGTALK_CLIENTID"),os.getenv("DINGTALK_CLIENTSECRET"),)client?=?dingtalk_stream.DingTalkStreamClient(credential)client.register_callback_handler(dingtalk_stream.chatbot.ChatbotMessage.TOPIC,?DingtalkMsgHandler())client.start_forever()if?__name__?==?"__main__":main()
運行這個腳本后,在釘釘中給“originbot_home_assistant”這個機器人發(fā)送消息后,它會給你回復(fù)一樣的內(nèi)容。
到這里就已經(jīng)實現(xiàn)了最基礎(chǔ)的交互功能了。
大家在代碼中可以看到,我目前限定了只能接收文本格式的消息,其他類型暫時都不允許,這主要是為了降低一開始的開發(fā)難度,不用考慮所有可能。
但實際上,釘釘?shù)膯瘟臋C器人支持很豐富的消息類型,可以看下面的說明:企業(yè)機器人發(fā)送單聊消息 - 釘釘開放平臺
我會在后面需要的時候添加其他消息類型。
集成GPT4o
上面給出的通過釘釘單聊機器人跟智能小車交互的代碼是非常簡單的,它只能把你發(fā)給小車的消息原樣返回,但實際使用過程中肯定不會這樣使用。我在這里是希望通過在交互過程中集成GPT4o來讓其更加智能化。
具體可以看下面的代碼:
"""
大模型相關(guān)的封裝和調(diào)用,?文件名是llms.py
"""import?os
import?requests
import?json
import?base64from?logger?import?logger#?讀取圖片并編碼為?Base64?字符串
def?encode_image_to_base64(image_path=None,?image_bytes=None):if?image_path?and?image_bytes:raise?ValueError("image_path?and?image_bytes?cannot?be?both?provided.")if?image_path:with?open(image_path,?"rb")?as?image_file:encoded_string?=?base64.b64encode(image_file.read()).decode("utf-8")if?image_bytes:encoded_string?=?base64.b64encode(image_bytes).decode("utf-8")return?encoded_stringdef?azure_gpt4o(message):api_key?=?os.getenv("API_KEY")headers?=?{"Content-Type":?"application/json",?"api-key":?api_key}data?=?{"messages":?message,"max_tokens":?4096,"temperature":?0.8,"frequency_penalty":?0,"presence_penalty":?0,"top_p":?0.95,"stop":?None,}url?=?os.environ.get("GPT4O_ENDPOINT")try:response?=?requests.post(url,?headers=headers,?data=json.dumps(data))if?response.status_code?==?200:return?response.json()["choices"][0]["message"]["content"]else:logger.info(f"LLM?調(diào)用失敗,狀態(tài)碼:{response.status_code},錯誤信息:{response.text}")except?requests.RequestException?as?e:logger.error(f"請求發(fā)生錯誤:{e}")except?Exception?as?e:logger.error(f"發(fā)生未知錯誤:{e}")
點擊輕松實現(xiàn)遠程智能交互:OriginBot與釘釘和GPT4o的集成指南——古月居可查看全文