基于Go语言 XTA AI聊天界面实现

项目开源地址: XTA-AI-SDK
人工智能技术的迅速发展,AI聊天应用变得越来越流行。本文将介绍如何使用Go语言和LCL库( Lazarus Component Library)创建一个功能丰富的AI聊天界面。项目主要包含以下模块:

项目背景

本项目旨在为开发者提供一个易于使用且功能全面的AI聊天界面。用户可以通过该界面与AI模型进行交互,上传文件,查看聊天记录,并保存对话内容。界面使用LCL库进行开发,确保跨平台兼容性。

功能模块

1. 主窗口实现

主窗口是应用的核心界面,包含消息显示区、聊天输入框、文件选择按钮等组件。以下是关键实现细节:

  • 消息显示区(Memo组件):用于显示用户输入的消息和AI的回复。支持滚动条,方便查看历史消息。
  • 聊天输入框(Memo组件):用户在此输入消息,支持多行输入和自动换行。
  • 文件选择按钮:允许用户选择单个或多个文件,点击后会弹出文件选择窗口。

关键代码片段

// 初始化主窗口组件
func (m *TMainWindow) initMainBox() {go m.initXTASDK()// 创建ComboBox用于选择AI模型modules := lcl.NewComboBox(m)modules.SetParent(m)modules.SetLeft(150)modules.Items().AddStrings2(chat.GiteeAIModels())modules.SetItemIndex(17)modules.SetHeight(35)modules.SetWidth(300)modules.Font().SetSize(12)modules.SetOnChange(func(sender lcl.IObject) {module := chat.GiteeAIModelNameEnum(modules.Items().Strings(modules.ItemIndex()))m.ai.SetModel(module)m.message.Lines().Add("模型: " + m.ai.Name())m.SetCaption(m.title + " " + m.ai.Name())})
}

2. 文件选择与预览

文件选择窗口允许用户选择文件,并预览文件内容。用户可以选择多个文件,并为每个文件添加描述。窗口使用FileWindow结构体实现。

关键代码片段

// 创建文件选择窗口
func createWindow(files []string, ok func(window *FileWindow)) *FileWindow {form := lcl.NewForm(lcl.Application)form.SetPosition(types.PoScreenCenter)form.SetWidth(300)form.SetHeight(200)form.SetBorderStyleForFormBorderStyle(types.BsNone)form.SetColor(colors.ClAzure)window := &FileWindow{IForm: form, id: time.Now().String()}// 创建文件描述标签和文本框fileLabel := lcl.NewLabel(form)fileLabel.SetParent(form)fileLabel.SetWidth(form.Width())fileLabel.SetLeft(5)fileLabel.SetTop(5)fileLabel.SetCaption("文件描述和作用")window.text = lcl.NewMemo(form)window.text.SetParent(form)window.text.SetBorderStyle(types.BsSingle)window.text.SetHeight(170)window.text.SetWidth(300)window.text.SetTop(30)window.text.Font().SetSize(12)// 确认按钮点击事件okBtn := lcl.NewButton(form)okBtn.SetParent(form)okBtn.SetCaption("确认")okBtn.SetWidth(50)okBtn.SetTop(form.Height() - 30)okBtn.SetLeft(form.Width() - 60)okBtn.SetOnClick(func(sender lcl.IObject) {// 读取文件内容并存储for i, file := range files {_, name := filepath.Split(file)if i > 0 {window.filenames += ", "}window.filenames += namedata, err := ioutil.ReadFile(file)if err == nil {buf := bytes.Buffer{}buf.WriteString(name + "\n")buf.Write(data)buf.WriteString("\n")fmt.Println("文件:", file, "大小:", buf.Len())window.fileContent = append(window.fileContent, buf.String())}}window.fileDesc = window.text.Text()form.Hide()if ok != nil {ok(window)}})return window
}

3. AI交互实现

AI交互模块通过调用Gitee的AI SDK实现。用户输入的消息和上传的文件内容会被发送到AI服务器,接收并处理回复。

关键代码片段

// 初始化AI SDK
func (m *TMainWindow) initXTASDK() {options := chat.DefaultGiteeAIOptionsoptions.APIKey = os.Getenv(chat.ENV_AI_API_KEY)m.ai = chat.NewGiteeAI(options, false)m.ai.SetOnReceive(func(message *chat.TResponse) {lcl.RunOnMainThreadAsync(func(id uint32) {if message != nil {if message.Error != "" {s := fmt.Sprintf("错误: %v %v", message.Error, message.ErrorType)m.message.Lines().Add(s)if m.saveFileBuf != nil {m.saveFileBuf.WriteString(s)m.saveFileBuf.Flush()}}choices := message.Choicesfor _, choice := range choices {if strings.Contains(choice.Delta.Content, "\n") {m.message.Lines().Add(choice.Delta.Content)} else {m.message.SetSelStart(int32(len(m.message.Lines().Text())))m.message.SetSelText(choice.Delta.Content)}if m.saveFileBuf != nil {m.saveFileBuf.WriteString(choice.Delta.Content)m.saveFileBuf.Flush()}}} else {fmt.Println("结束")m.message.Lines().Add("")m.chatBtn.SetEnabled(true)}})})
}

4. 消息保存功能

用户可以选择将聊天记录保存为文本文件。保存功能通过SaveDialog实现,支持选择保存路径和文件名。

关键代码片段

// 保存聊天记录
m.saveChatBtn.SetOnClick(func(sender lcl.IObject) {if m.saveDirDlg.Execute() {m.savePathInp.SetText(m.saveDirDlg.FileName())}
})

使用说明

  1. 安装依赖:确保安装了Go语言环境,并通过go get命令安装所需的依赖库。
  2. 配置API密钥:在环境变量中设置Gitee AI的API密钥。
  3. 运行应用:编译并运行项目,即可看到主界面。
  4. 选择文件:点击“选择文件/多选”按钮,选择需要上传的文件,并填写描述。
  5. 输入消息:在聊天输入框中输入消息,点击“发送”按钮与AI交互。
  6. 保存聊天:点击“保存消息”按钮,选择保存路径和文件名,保存当前聊天记录。

总结

通过以上模块的实现,我们成功创建了一个功能全面的AI聊天界面。项目使用了LCL库进行GUI开发,结合Gitee的AI SDK实现了智能交互。未来,可以根据需求扩展更多功能,如支持更多AI模型、增加语音输入输出等。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18737.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门小清单

在上一篇文章中我向大家介绍了关于C的命名空间的用处以及一些,这篇内容主要是讲解有关C入门的一些小知识,大家可以通过此文章初步进行一个了解,这些东西在之后的C学习中都会有更多的妙用,如果有小伙伴感兴趣C的命名空间&#xff0…

【kafka系列】日志存储设计 消息写入、读取

目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计,其结构包含目录组织、…

复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码

本文给出介绍和matlab程序,来实现地磁辅助惯性导航仿真验证,包含地磁基准图构建、飞行轨迹生成、INS误差建模、地磁匹配定位及多源数据融合等模块。通过对比分析验证地磁匹配修正惯性导航累积误差的有效性,可视化显示卫星拒止环境下的航迹修正…

springboot项目读取 resources 目录下的文件的9种方式

1. 使用 ClassLoader.getResourceAsStream() 方法 InputStream inputStream getClass().getClassLoader().getResourceAsStream(“file.txt”); 2.使用 Class.getResourceAsStream() 方法 InputStream inputStream getClass().getResourceAsStream(“/file.txt”); 3.使用 Re…

基于SSM+uniapp的鲜花销售小程序+LW示例参考

1.项目介绍 系统角色:管理员、商户功能模块:用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试环境&#x…

硕成C语言22【一些算法和数组的概念】

1.求水仙花数 #include <stdio.h>int main() {//求水仙花数&#xff1a;1.三位数 2.个位的立方十位的立方百位的立方该数int unit, tens, hundreds;for (int i 100; i < 1000; i)//i表示该水仙花数{unit i / 1 % 10;tens i / 10 % 10;hundreds i / 100 % 10;if (…

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

无人机航迹规划:互联银行系统优化(Connected Banking System Optimizer,CBSO)求解无人机路径规划MATLAB

一、互联银行系统优化算法 互联银行系统优化&#xff08;Connected Banking System Optimizer&#xff0c;CBSO&#xff09;算法是2024年由Mehrdad Nemati等人提出的一种智能优化算法&#xff0c;其灵感来源于银行系统之间的连接和交易过程。在银行系统中&#xff0c;核心银行…

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面

【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客&#xff0c;通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…

css简介

一.css-网页的美容师 css也是一种标记语言&#xff0c;主要用于设置HTML页面中的文本内容(字体大小对齐方式)&#xff0c;图片外形&#xff08;宽高 边框样式 边距等&#xff09;以及版面的布局和外观显示样式。 二.css语法规范 css规则由两个主要的部分构成:选择器以及一条…

Postman如何流畅使用DeepSeek

上次写了一篇文章是用chatBox调用api的方式使用DeepSeek&#xff0c;但是实际只能请求少数几次就不再能给回响应。这回我干脆用最原生的方法Postman调用接口请求好了。 1. 通过下载安装Postman软件 postman下载(https://pan.quark.cn/s/c8d1c7d526f3)&#xff0c;包含7.0和10…

DC-6靶机渗透测试全过程

目录 前期准备 一、渗透测试 1.IP地址查询 2.端口信息搜寻 3.网页信息搜集 wappalyzer WPScan 反弹shell graham用户 反弹出jens的shell nmap提权 二、总结 前期准备 攻击机&#xff1a; kali windows11 靶机&#xff1a;DC-6靶机&#xff08;调至NAT模式&#xff0…

以若依移动端版为基础,实现uniapp的flowable流程管理

1.前言 此代码是若依移动端版为基础&#xff0c;实现flowable流程管理&#xff0c;支持H5、APP和微信小程序三端。其中&#xff0c;APP是在安卓在雷电模拟器环境下完成的&#xff0c;其他环境未测试&#xff0c;此文章中所提及的APP均指上述环境。移动端是需要配合若依前后端分…

C++ Primer 返回值和return语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

dma_ddr 的编写 通过mig控制ddr3

此外还有别的模块 本模块是 其中一个 timescale 1ns/1ps module dma_ctrl (input wire ui_clk , //100MHZ 用户时钟input wire ui_rst_n ,//写fifo的写端口 input wire wf_wr_clk , //由数据产生模块的时…

【15】思科AireOS:创建使用 PSK 认证的 WLAN

1. 概述 在 Cisco AireOS 无线局域网控制器(WLC)上,您可以配置基于预共享密钥(PSK)的 WLAN,以提供无线访问。PSK 认证是一种 WPA2/WPA3 个人模式下常用的认证方式,适用于家庭或小型企业环境。 本指南将详细介绍如何在 Cisco AireOS WLC 上配置 PSK 认证的 WLAN,并确保…

基于css实现正六边形的三种方案

方案一&#xff1a;通过旋转三个长方形生成正六边形 分析&#xff1a; 如下图所示&#xff0c;我们可以通过旋转三个长方形来得到一个正六边形。疑问&#xff1a; 1. 长方形的宽高分别是多少&#xff1f; 设正六边形的边长是100&#xff0c;基于一些数学常识&#xff0c;可以…

Python用PyMC3马尔可夫链蒙特卡罗MCMC对疾病症状数据贝叶斯推断

全文链接&#xff1a;https://tecdat.cn/?p39937 本文聚焦于马尔可夫链蒙特卡罗&#xff08;MCMC&#xff09;方法在贝叶斯推断中的Python实现。通过介绍MCMC的基础原理、在贝叶斯推断中的应用步骤&#xff0c;展示了其在解决复杂分布采样问题上的强大能力。同时&#xff0c;借…

linux--关于makefile

makefile文件 可以指定编译顺序&#xff0c;这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名&#xff1a;makefile 或者 Makefile 必须是这俩&#xff0c;系统才能识别 规则的书写语法如下&#xff1a; 一个makefile内可以有多个规则 目标:依赖a 依…

何须付费免费它不香吗

聊一聊 又是一年开学季。 开学了发一些应时期的小软件。 今天给大家分享一款学校班级课程表工具。 这款工具可以投放在学校电子大屏上。 支持学校的白板软件。 软件介绍 学校班级课程表 工具界面清爽&#xff0c;信息能一目了然。 虽然看感觉功能简单&#xff0c;但每个…