首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

wails实现腾讯元器bot

编程知识
2024年07月20日 09:11

简单记录工具的一个模块

后端

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

From:https://www.cnblogs.com/bktown/p/18312794/wails-implements-tencent-component-bot-2lh7w3
本文地址: http://www.shuzixingkong.net/article/211
0评论
提交 加载更多评论
其他文章 构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南
构建基于Java Spring Boot和Uniapp的心理小程序:从零到一的完整指南 前言 大家好,今天我们来聊聊如何使用Java Spring Boot和Uniapp构建一个心理小程序。这个项目不仅能帮助你提升技术水平,还能为用户提供心理健康支持。我们将从项目的整体架构开始,逐步深入到具体的代码
集群及分布式定时任务中间件MEE_TIMED
集群及分布式定时任务中间件MEE_TIMED 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521 MEE_TIMED一套开源的定时任务中间件,MEE_TIMED 简化了 scheduled及shedlock的配置,同时也升级了这两种中间件的能力 ,
集群及分布式定时任务中间件MEE_TIMED 集群及分布式定时任务中间件MEE_TIMED 集群及分布式定时任务中间件MEE_TIMED
C#/.NET这些实用的编程技巧你都会了吗?
DotNet Exercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core各种编程常用语法、算法、技巧、中间件、类库等等。 GitHub开源地址:https:/
C#/.NET这些实用的编程技巧你都会了吗?
阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)
阅读翻译Prompting Engineering Guides之Introduction(提示工程简介) 关于 首次发表日期:2024-07-19 Prompting Engineering Guides官网: https://www.promptingguide.ai/zh 使用ChatGPT和
阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)
GitHub Star 数量前 12 的开源无代码工具
相关文章:GitHub Star 数量前 15 的开源低代码项目 在本篇文章中,我们将探索 12 款在 GitHub 上星级排名前列的开源无代码工具。 每款工具都旨在简化和加速开发过程,但各自侧重于不同的应用场景。 从动态表单生成的 Formily,到高度可定制的 NocoBase 用于复杂业务系统
GitHub Star 数量前 12 的开源无代码工具 GitHub Star 数量前 12 的开源无代码工具 GitHub Star 数量前 12 的开源无代码工具
Langchain 与 LlamaIndex:LLM 应用开发框架的比较与使用建议
Langchain 和 Llamaindex 是两种广泛使用的主流 LLM 应用开发框架。两者有什么不同?我们该如何使用?以下我根据各类资料和相关文档做了初步选型。 一、Langchain 1. 适用场景 (1)需要构建灵活、可扩展的通用应用程序。 (2)需要复杂的工作流程支持。 (3)需要复杂的交
渐变边框文字效果?CSS 轻松拿捏!
今天,有个群友问了我这么一个问题,如果不想切图,是否有办法实现带渐变边框的字体效果?如下所示: 本文,就将尝试一下,在 CSS 中,我们可以如何尽可能的实现这种渐变边框字体效果。 元素叠加 首先,比较容易想到的写法是通过元素叠加实现。 元素本身实现文字效果本身 通过元素的伪元素,配合 backgro
渐变边框文字效果?CSS 轻松拿捏! 渐变边框文字效果?CSS 轻松拿捏! 渐变边框文字效果?CSS 轻松拿捏!
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
​《FFmpeg开发实战:从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Windows系统通过Visual Studio开发桌面程序也是很常见的,下面就介绍如何在Visual Studio的C++工程中集成FFm
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg