首页 > 其他分享 >wails实现腾讯元器bot

wails实现腾讯元器bot

时间:2024-07-20 10:18:56浏览次数:5  
标签:code log color yuanqi bot markdown 元器 hljs wails

简单记录工具的一个模块

后端

Api调用

登录 腾讯元器 后创建智能体,按自己的需求来创建,发布后要等等审核。

image

等发布完成后点击调用api即可,这里可以看到user_id​, assistant_id​,token​参数

image

使用github.com/chenmingyong0423/go-yuanqi​这个封装好了的库来调用api,根据demo的使用(这里以非流式 API 交互为例子),要注意更改一处,原先的chat.Chat()​改为chat.Session()​(作者的demo中没有及时更新使用),如下:

package main

import (
	"context"
	"fmt"
	"github.com/chenmingyong0423/go-yuanqi"
	"log"
	"time"
)

/**
 * @Author Lockly
 * @Description
 * @Date 2024/7/1
 **/

func main() {
	chat := yuanqi.NewChat("assistant_id", "user_id", "token", yuanqi.WithAssistantVersion(""), yuanqi.WithTimeOut(10*time.Second))
	// 上面的参数依次填入
	session := chat.Session().WithStream(false).WithChatType("published")


	textContent := yuanqi.NewContentBuilder().Text("hi").Build()

	// 图片消息要启用插件故没有使用
	message := yuanqi.NewMessageBuilder().
		Role("user").
		Content(textContent).Build()

	resp, err := session.AddMessages(message).Request(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	// 如果只想要获得ai的回答
	fmt.Println(resp.Choices[0].Message.Content)
}

简单封装一下即可,传入问题获取回复,上面的三个参数从配置中获取。简单说一下在wails的app.go(其他注册了的一样)中定义方法,命令行wails dev​启动之后会自动加入wailsjs供前端调用:

image

简单定义一下:

func (a *App) ChatWithAI(content string, config *share.Config) string {
	resp, err := service.Chat(content, a.config)
	if err != nil {
		log.Logger.Error("ERR 获取AI回复失败")
		return err.Error()
	}
	return resp
}

前端

界面

前端要调用先引入import {ChatWithAI} from "../../../wailsjs/go/cli/App";​,然后显示用的naive ui的组件, 针对于配置,可以增加一个页面(模态框,抽屉都可以的)进行修改,其他有必要的可以看着添加。

    <n-modal v-model:show="showModal">
      <n-card
          style="width: 600px"
          title="AI Assistant"
          :bordered="false"
          size="huge"
          role="dialog"
          aria-modal="true"
      >
        <template #header-extra>
          配置
        </template>
          <n-form style="margin: 1px">
            <n-form-item-row label="AssistantID">
              <n-input v-model:value="data.AssistantID" placeholder="智能体ID"/>
            </n-form-item-row>

            <n-form-item-row label="Assistant Name">
              <n-input v-model:value="data.AssistantName" placeholder="智能体名称,自定义"/>
            </n-form-item-row>

            <n-form-item-row label="UserID">
              <n-input v-model:value="data.UserID" placeholder="UserID"/>
            </n-form-item-row>

            <n-form-item-row label="Token">
              <n-input v-model:value="data.Token" placeholder="Token"/>
            </n-form-item-row>
          </n-form>
        <n-flex justify="space-between">
          <n-button strong secondary type="primary" @click="submit">保存</n-button>
          <n-button strong secondary type="info" @click="reset">清空</n-button>
        </n-flex>
        <template #footer>
          ❗目前仅支持腾讯元器
        </template>
      </n-card>
    </n-modal>

image

聊天的显示用的是n-log组件,用于显示日志的,将问题和回复push进去,关键是支持高亮,

    <n-log
        language="naive-log"
        font-size="14"
        :log="chatData"
        :loading="waiting"
        line-height="1.5"
        rows="27.5"
        style="padding: 10px"
    />

这里定义const msg: string[] = []; const chatData = ref(showMsg('', false))​其中showMsg函数只要做到将content push进msg然后加上\n换行就可以简单实现消息显示,接着处理高亮。

高亮

naive ui中不内置highlight.js,所以在使用前要引入import hljs from 'highlight.js/lib/core'​并提前设定:

  <n-config-provider :hljs="hljs">
    <my-app />
  </n-config-provider>

hljs里面内置了一些语言,但是我尝试了他并不会生效,比如注册markdown​然后再n-log中也使用markdown​,当ai回复的代码用markdown语法```来装载代码时并不会高亮,同样用相应的语言也不奏效。

import markdown from 'highlight.js/lib/languages/markdown'

hljs.registerLanguage('markdown ', markdown )

但是官网中提供的例子是自定义的语言来实现相应的功能,比如他们的高亮全部数字:

  import hljs from 'highlight.js/lib/core'

  hljs.registerLanguage('naive-log', () => ({
    contains: [
      {
        className: 'number',
        begin: /\d+/
      }
    ]
  }))

同样的可以像他这样用正则匹配到字符去设置类目来调整样式,比如对中英文,以及我这里想标记对话的符号 »​:

hljs.registerLanguage('naive-log', () => ({
  contains: [
    {
      className: 'number',
      begin: /\d+/
    },
    {
      className: 'chinese',
      begin: /[\u4e00-\u9fa5]/, // 中文字符范围(Unicode 编码范围)
      relevance: 10
    },
    {
      className: 'english', 
      begin: /[A-Za-z]/, 
      relevance: 0
    },
    {
      className: 'bot',
      begin: /[\w\s]+»\s*/, // 匹配任何单词、空格直到遇到 » 后跟空格
      relevance: 1,
    },
  ]
}))

这里的className随便定义,好区分就行,然后对其进行定义,wails中在style.css中定义:(其他新增的在下面添加即可)

.n-code,
.n-layout-content,
.n-layout-header,
.n-layout,
.terminal .t-window {
    font-family: "Microsoft YaHei UI", system-ui;
}

.n-code .hljs-attr,
.n-code .hljs-variable,
.n-code .hljs-template-variable,
.n-code .hljs-type,
.n-code .hljs-selector-class,
.n-code .hljs-selector-attr,
.n-code .hljs-selector-pseudo,
.n-code .hljs-number {
    color: #078585;
    font-family: "Microsoft YaHei UI", system-ui;
}

.n-code .hljs-log-info {color: #25c9ab;}
.n-code .hljs-log-debug {color: #13778a;}
.n-code .hljs-log-error {color: #931023;}
.n-code .hljs-log-warn {color: #0d705e;}

.n-code .hljs-chinese {color: rgba(19, 19, 19, 0.89);}
.n-code .hljs-english {color: rgba(31, 32, 33, 0.89);}
.n-code .hljs-bot {color: #11c5a4;}

最后增加一个输入框和两个按钮,输入框设置属性@keydown.enter="send"​回车就触发方法send,这个方法用于调用前面的ChatWithAI​,由于回复需要时间,可以在输入框和日志显示都设置:loading属性来等待加载,同时输入框在等待期间要禁用。

    <n-log
        language="naive-log"
        font-size="14"
        :log="chatData"
        :loading="waiting"
        line-height="1.5"
        rows="27.5"
        style="padding: 10px"
    />

    <n-flex justify="space-around" size="large" style="margin-top: 20px">
      <n-input
          v-model:value="data.Message"
          placeholder="回车搜索"
          :loading=waiting
          :disabled=disable
          style="width: 80%;"
          @keydown.enter="send"
          clearable
      >
        <template #prefix>
          <n-icon :component="FlashOutline" />
        </template>
      </n-input>
      <n-button strong secondary type="primary" @click="clearMsg">清空</n-button>
      <n-button strong secondary type="info" @click="showModal = true">设置</n-button>
    </n-flex>

image

最后效果如下(完整代码后续会开源):

image

标签:code,log,color,yuanqi,bot,markdown,元器,hljs,wails
From: https://www.cnblogs.com/bktown/p/18312794/wails-implements-tencent-component-bot-2lh7w3

相关文章

  • robotframework关键字库的定义
    学习总结,有错误欢迎指出。总结:robotframework关键字库定义包含两种方式:模块(不建议)和类。1.关键字定义1)模块(略)2)类定义     模块名和类名需要一致,模块名和类名需要一致,模块名和类名需要一致。引入     如果初始函数含有变量,引入关键字库时需要......
  • 自动化测试-Robotframework项目结构示例
    学习总结,有错误欢迎指出。总结:项目要有自己的一套结构,形成自己的体系,应对不同的项目。1.项目结构2.目录说明......
  • TURTLEBOT3 Burger 汉堡式堆叠平台 好价格 性价比之王!
    暑假特惠:ROBOTISROS开源智能机器人TurtleBot3Burger汉堡机器人RPi4开源平台slam无人车主板树莓派42GB【图片价格品牌报价】-京东(jd.com) 本产品为搭载RaspberryPi4的TurtleBot3机器人的升级版。 RaspberryPi4,这款单板计算机在CPU、RAM和图形处理能力方......
  • MiniRHex:一种开源的六足机器人 by DYNAMIXEL Robotis
    原文链接:https://www.youtube.com/watch?v=ldLXVDNCCzc  At#IROS 2023,weranintotheCarnegieMellonUniversity RobomechanicsLab.TheyhadsomereallycoolrobotstherethatwerePoweredby#DYNAMIXEL XLseriesmotors.Oneoftherobotstheyhadfeat......
  • 【THM】Mr Robot CTF练习
    【THM】MrRobotCTF练习基于电视剧《黑客军团》,你能得到这个靶机的根权限吗?你能得到这台黑客军团风格靶机的根权限吗?这是一个适用于初学者/中级用户的虚拟机。机器上有3个隐藏的钥匙,你能找到它们吗?感谢LeonJohnson创造了这台靶机。本机器在创建者的明确许可下在此处使用......
  • 1016、基于数电电路交通灯数码管显示系统设计(Proteus仿真+元器件清单+配套资料等)
    毕设帮助、开题指导、技术解答(有偿)见文未一、设计功能1、通过纯数电硬件电路实现,两个方向通行时间分别为40s和55s,黄灯时间为5s,具有夜间模式,所有黄灯闪烁。2、通过数码管显示相关的信息二、Proteus仿真图资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源......
  • J. Bottles
    原题链接题解,先去考虑算法,再去解决时间复杂度的问题假如一定要选\(k_1\)个,瓶子,那么我一定是选\(sumb\)尽量大(容量大),且\(suma\)也尽量大的(少搬运),那么对于相同的\(sumb\)选择\(suma\)更大的所以三维dp,时间复杂度够code#include<bits/stdc++.h>#definelllongl......
  • 自动化测试-RobotFramework环境准备(python基础)
    学习总结,有错误欢迎指出。总结:推荐为每个python相关项目创建独立的虚拟环境。1.虚拟环境安装虚拟环境:为每个项目提供独立的执行器和包管理。示例:使用python内置库venv模块,在项目根目录下创建虚拟环境。python-mvenv.venv-m:执行“位于搜索路径(sys.path)下......
  • SciTech-EECS-PCB设计- PCB设计-原理图设计 - Schematic library(原理图元器件库)的设
    原理图绘制的“环境参数设置”设置原理图绘制的“环境参数”步骤大体有:在ad软件主界面菜单,选择“File->New->Project”,在创建工程的窗口,看见一个名称为PCB_Project1.PrjPCB的新工程。按照前面所介绍的“添加原理图”的方法,添加名称为“Sheet1.SchDoc”的“原理图文件”。......
  • Franka - Robot - Ros - Customization(定制)
    franka_gazebo的启动文件包含大量参数,您可以使用这些参数自定义行为的模拟。例如,要在一个模拟中生成两只熊猫,您可以使用以下方法:<?xmlversion="1.0"?><launch><includefile="$(findgazebo_ros)/launch/empty_world.launch"><!--Startpaused,simulationwillb......