深入解析:基于 DevUI 与 MateChat 构建企业级 AI 智能助手的实践与探索
基于 DevUI 与 MateChat 构建企业级 AI 智能助手的实践与探索
目录
基于 DevUI 与 MateChat 构建企业级 AI 智能助手的实践与探索
摘要
1. 引言:智能化转型的技术挑战与机遇
2. 技术架构设计与选型
2.1 整体架构概述
2.2 技术栈选择
3. 核心功能实现详解
3.1 环境搭建与基础配置
3.2 智能对话界面构建
3.3 大模型服务对接实现
3.4 性能优化与用户体验提升
DevUI 与 MateChat 核心技术介绍
DevUI:企业级前端解决方案
MateChat:前端智能化场景解决方案
MateChat 开源代码库解析
4. 高级功能实现
4.1 知识库集成与RAG架构
4.2 多模态交互支持
5. 安全性与稳定性保障
5.1 安全防护措施
5.2 性能监控与异常处理
6. 部署与运维实践
6.1 Docker 容器化部署
6.2 CI/CD 流水线配置
7. 总结与展望
摘要
本文深入探讨了如何利用华为云 DevUI 前端解决方案与 MateChat 智能交互平台,构建企业级 AI 智能助手的完整技术实践。通过详细的技术架构设计、组件选择、模型对接以及性能优化等维度,展示了从零到一搭建智能化应用的全过程。文章包含多个实战代码示例、架构流程图和性能对比表格,为开发者提供了一套可复制、可扩展的技术方案,助力企业在云原生时代实现开发效率的质的飞跃。

1. 引言:智能化转型的技术挑战与机遇
在云原生技术深入发展的今天,企业中后台系统的智能化升级已成为必然趋势。传统的前端解决方案在面对 AI 能力集成时,往往面临组件不匹配、交互体验割裂、开发效率低下等挑战。华为云 DevUI 与 MateChat 的组合,为这一问题提供了企业级的解决方案。
DevUI 作为一款开源免费的企业中后台产品前端通用解决方案,其设计价值观基于"致简"、"沉浸"、"灵活"三种理念,为开发者提供了标准化的设计体系。而 MateChat 作为前端智能化场景解决方案 UI 库,专注于构建不同业务场景下高一致性的 GenAI 体验系统语言,完美匹配了研发工具领域的对话组件需求。
两者的结合,不仅能够快速构建美观、一致的用户界面,更能实现与大模型服务的无缝对接,为企业提供开箱即用的智能化能力。

2. 技术架构设计与选型
2.1 整体架构概述

如图所示,我们的技术架构分为四个层次:
- 展示层:由 DevUI 提供基础 UI 组件,MateChat 提供 AI 交互组件
- 业务层:处理用户交互逻辑、对话管理、上下文维护
- 服务层:封装大模型 API 调用、数据处理、安全验证
- 模型层:对接盘古大模型、ChatGPT 等大语言模型
2.2 技术栈选择
技术栈 | 版本 | 作用 | 选择理由 |
Vue 3 | 3.4+ | 前端框架 | 响应式性能优秀,生态完善 |
DevUI | 16.0+ | UI 组件库 | 企业级组件,设计规范统一 |
MateChat | 1.5+ | AI 交互组件 | 专为 AI 场景设计,开箱即用 |
TypeScript | 5.0+ | 开发语言 | 类型安全,工程化支持好 |
Vite | 5.0+ | 构建工具 | 快速启动,热更新体验佳 |
OpenAI SDK | 4.0+ | 模型对接 | 标准化接口,兼容性强 |
3. 核心功能实现详解
3.1 环境搭建与基础配置
首先,我们需要初始化一个 Vue 项目并安装必要的依赖:
# 创建 Vite 项目
npm create vite@latest ai-assistant -- --template vue-ts
cd ai-assistant
# 安装 DevUI 和 MateChat
npm install vue-devui @matechat/core @devui-design/icons
# 安装模型对接依赖
npm install openai

在 main.ts 文件中进行全局配置:
import { createApp } from 'vue'
import App from './App.vue'
// 引入 DevUI 和 MateChat
import DevUI from 'vue-devui'
import 'vue-devui/style.css'
import MateChat from '@matechat/core'
import '@matechat/core/style.css'
import '@devui-design/icons/icomoon/devui-icon.css'
const app = createApp(App)
app.use(DevUI)
app.use(MateChat)
app.mount('#app')
3.2 智能对话界面构建
使用 MateChat 的组件构建一个完整的对话界面:
{{ inputMessage.length }}/2000
<script setup lang="ts">
import { ref, computed } from 'vue'
import { Button } from 'vue-devui/button'
import 'vue-devui/button/style.css'
const welcomeDescription = ['我是您的智能助手,可以帮助您解答技术问题、编写代码、查询文档等。','作为AI模型,我的回答可能不总是准确的,但您的反馈可以帮助我做得更好。'
]
const welcomePrompts = [{ label: '如何优化前端性能?', value: 'performance' },{ label: '帮我写一个排序算法', value: 'sort-algorithm' },{ label: '解释Vue3的响应式原理', value: 'vue3-reactivity' }
]
const messages = ref([])
const inputMessage = ref('')
const isProcessing = ref(false)
const handleSubmit = async () => {if (!inputMessage.value.trim() || isProcessing.value) returnconst userMessage = inputMessage.value.trim()inputMessage.value = ''// 添加用户消息messages.value.push({role: 'user',content: userMessage})// 添加AI回复占位符messages.value.push({role: 'assistant',content: '',loading: true,hasActions: false})isProcessing.value = truetry {// 调用AI服务const response = await callAIModel(userMessage)// 更新AI回复const lastIndex = messages.value.length - 1messages.value[lastIndex] = {...messages.value[lastIndex],content: response,loading: false,hasActions: true}} catch (error) {const lastIndex = messages.value.length - 1messages.value[lastIndex] = {...messages.value[lastIndex],content: '抱歉,服务暂时不可用,请稍后再试。',loading: false,error: true}} finally {isProcessing.value = false}
}
// 模拟AI模型调用
const callAIModel = async (question: string): Promise => {return new Promise((resolve) => {setTimeout(() => {if (question.includes('性能')) {resolve('前端性能优化的关键点包括:1. 代码分割和懒加载 2. 图片优化和CDN加速 3. 减少重绘重排 4. 使用Web Workers处理复杂计算 5. 服务端渲染(SSR)等。具体方案需要根据业务场景选择。')} else if (question.includes('排序')) {resolve('```typescript\nfunction quickSort(arr: number[]): number[] {\n if (arr.length <= 1) return arr;\n const pivot = arr[Math.floor(arr.length / 2)];\n const left = arr.filter(x => x < pivot);\n const right = arr.filter(x => x > pivot);\n return [...quickSort(left), pivot, ...quickSort(right)];\n}\n\n// 使用示例\nconst numbers = [5, 2, 8, 1, 9, 3];\nconsole.log(quickSort(numbers)); // [1, 2, 3, 5, 8, 9]\n```')} else {resolve('这是AI助手的回复内容。在实际应用中,这里会调用真实的大模型API获取响应。')}}, 1500)})
}
</script>

3.3 大模型服务对接实现
在实际应用中,我们需要对接真实的大模型服务。以下是使用 OpenAI SDK 对接大模型的实现:
import OpenAI from 'openai'
import { ref } from 'vue'
// 配置模型服务
const openai = new OpenAI({apiKey: import.meta.env.VITE_OPENAI_API_KEY,baseURL: import.meta.env.VITE_OPENAI_BASE_URL,dangerouslyAllowBrowser: true
})
// 对话历史管理
const conversationHistory = ref([])
// 流式响应处理
const handleStreamResponse = async (messages: any[], callback: (content: string) => void) => {try {const completion = await openai.chat.completions.create({model: import.meta.env.VITE_MODEL_NAME || 'gpt-3.5-turbo',messages: messages.map(msg => ({role: msg.role,content: msg.content})),stream: true,temperature: 0.7,max_tokens: 2000})let fullResponse = ''for await (const chunk of completion) {const content = chunk.choices[0]?.delta?.content || ''fullResponse += contentcallback(content)}return fullResponse} catch (error) {console.error('模型调用失败:', error)throw new Error('服务调用失败,请稍后重试')}
}
// 完整的对话处理函数
const processConversation = async (userInput: string) => {// 添加用户消息到历史conversationHistory.value.push({role: 'user',content: userInput})// 准备API调用的消息const apiMessages = [{role: 'system',content: '你是一个专业的技术助手,专注于帮助开发者解决编程问题、优化代码、解释技术概念。请用中文回答,并保持专业、准确、简洁。'},...conversationHistory.value.slice(-6) // 保留最近6条对话上下文]return new Promise((resolve, reject) => {let responseContent = ''handleStreamResponse(apiMessages, (chunk) => {responseContent += chunk}).then(() => {// 添加AI回复到历史conversationHistory.value.push({role: 'assistant',content: responseContent})resolve(responseContent)}).catch(reject)})
}
3.4 性能优化与用户体验提升
为了提升应用性能和用户体验,我们实现了以下优化:
// 1. 消息缓存与本地存储
const saveConversationToLocalStorage = () => {localStorage.setItem('ai_conversation_history', JSON.stringify(conversationHistory.value))
}
const loadConversationFromLocalStorage = () => {const saved = localStorage.getItem('ai_conversation_history')if (saved) {conversationHistory.value = JSON.parse(saved)}
}
// 2. 节流与防抖处理
const throttle = (func: Function, limit: number) => {let inThrottle = falsereturn (...args: any[]) => {if (!inThrottle) {func.apply(this, args)inThrottle = truesetTimeout(() => inThrottle = false, limit)}}
}
const debouncedSearch = throttle((query: string) => {// 执行搜索逻辑
}, 300)
// 3. 虚拟滚动优化长列表
const useVirtualScroll = (items: any[], containerHeight: number, itemHeight: number) => {const visibleItems = ref([])const scrollTop = ref(0)const updateVisibleItems = () => {const startIndex = Math.floor(scrollTop.value / itemHeight)const endIndex = Math.min(startIndex + Math.ceil(containerHeight / itemHeight) + 2, items.value.length)visibleItems.value = items.value.slice(startIndex, endIndex)}return {visibleItems,updateVisibleItems}
}
DevUI 与 MateChat 核心技术介绍
DevUI:企业级前端解决方案
DevUI 是一款开源免费的企业中后台产品前端通用解决方案,其设计价值观基于"致简"、"沉浸"、"灵活"三种自然与人文相结合的理念。作为企业级开箱即用的产品,DevUI 旨在为设计师和前端开发者提供标准的设计体系,并满足各类落地场景的需求。

核心特性:
- 高效开发:基于 Angular 框架,提供丰富的组件库,包括 Tree、Table 等复杂组件
- 设计一致性:遵循统一的设计语言和规范,确保产品体验的一致性
- 灵活配置:组件支持高度灵活的配置选项,适应不同业务场景
- 主题定制:支持主题化定制,轻松匹配企业品牌风格
DevUI 的组件经过华为内部多年业务沉淀,只有支持灵活配置的组件才能满足不同需求。目前 DevUI 支持 Angular ^10.0.0 版本,全部代码开源并遵循 MIT 协议,任何企业、组织及个人均可免费使用。

// DevUI 组件使用示例
import { Component } from '@angular/core';
import { DButtonComponent } from 'ng-devui/button';
@Component({selector: 'app-example',template: `主要按钮 `,standalone: true,imports: [DButtonComponent]
})
export class ExampleComponent {tableData = [{ id: 1, name: '张三', age: 28 },{ id: 2, name: '李四', age: 32 }];columns = [{ field: 'id', header: 'ID' },{ field: 'name', header: '姓名' },{ field: 'age', header: '年龄' }];handleClick() {console.log('按钮被点击');}
}
DevUI 不仅提供了基础组件,还构建了完整的开发生态,包括设计系统、开发工具链和最佳实践指南,帮助开发者快速构建高质量的企业应用。
MateChat:前端智能化场景解决方案
MateChat 是一款专注于构建生成式人工智能(GenAI)交互体验的前端 UI 库,致力于在多元业务场景下构建高度一致的 GenAI 语言交流系统。作为前端智能化场景解决方案,MateChat 已服务于华为内部多个应用智能化改造,并助力 CodeArts、InsCode AI IDE 等智能化助手搭建。

核心设计理念:
- 体验无边界:构建不同业务场景下高一致性的 GenAI 体验系统语言
- 业务无侵害:匹配各种工具/平台的原生业务场景和界面特征
- 研发友好:提供更适合研发工具领域的对话组件,打造易接入、易维护、易扩展的开发体验
关键特性:
- 快速唤醒:支持固定入口、情境建议或快捷键等多种唤醒方式
- 轻松使用:通过适时的引导和手边提示,为产品的易学易用性保驾护航
- 自由表达:专为与 GenAI 对话打造的输入区域,功能完善,易于配置扩展
- 过程监督:帮助用户正确理解 AI 系统内部状态,促进良性的人机互动
- 可读性强:有层次、有逻辑的 Markdown 语法渲染样式和清晰直观的界面布局
MateChat 提供了多种典型组件,包括气泡对话框(Bubble)、提及功能(Mention)、智能输入框(Input)等,能够满足不同业务类型的生成式 AI 体验需求,包括协作式、沉浸式和情境式场景。

<script setup>
import { ref } from 'vue';
const messages = ref([{ role: 'assistant', content: '您好!我是您的智能助手,有什么可以帮助您?' }
]);
const inputValue = ref('');
const handleSend = () => {if (!inputValue.value.trim()) return;// 添加用户消息messages.value.push({role: 'user',content: inputValue.value});// 模拟AI回复setTimeout(() => {messages.value.push({role: 'assistant',content: `您输入了: "${inputValue.value}",这是一个AI助手的回复示例。`});}, 1000);inputValue.value = '';
};
</script>
MateChat 的组件设计充分考虑了研发工具领域的特殊需求,通过高度可配置的组件 API 和丰富的主题定制能力,让开发者能够快速构建出符合业务场景的智能化交互界面。
MateChat 开源代码库解析
MateChat 代码库托管在 GitCode 平台上,采用现代化的前端技术栈和工程化实践,为开发者提供了完整的源码参考和二次开发基础。
代码库结构:
MateChat/
├── docs/ # 文档站点
├── packages/ # 核心组件包
│ ├── core/ # 核心组件实现
│ ├── vue/ # Vue 版本组件
│ └── angular/ # Angular 版本组件
├── playground/ # 演示示例项目
├── scripts/ # 构建脚本
├── public/ # 静态资源
├── .github/ # GitHub 配置
├── .husky/ # Git hooks
├── package.json # 项目配置
└── README.md # 项目说明
核心依赖与技术栈:
- 框架:Vue 3 + TypeScript
- 构建工具:Vite + PNPM
- 代码规范:Biome + Husky
- 文档:VitePress
- 测试:Vitest + Cypress
MateChat 采用 Monorepo 架构管理多个子包,通过 PNPM Workspaces 实现依赖共享和版本管理。核心组件包遵循原子化设计原则,每个组件都是独立的 npm 包,可以按需安装和使用。
// MateChat 核心组件架构示例
// packages/core/src/components/bubble/index.ts
import { defineComponent, PropType } from 'vue';
export interface AvatarConfig {name?: string;imgSrc?: string;size?: number;color?: string;
}
export default defineComponent({name: 'McBubble',props: {content: {type: String,required: true},align: {type: String as PropType<'left' | 'right'>,default: 'left'},avatarConfig: {type: Object as PropType,default: () => ({})},loading: {type: Boolean,default: false},type: {type: String as PropType<'default' | 'error' | 'warning'>,default: 'default'}},setup(props) {const getBubbleClass = () => {return ['mc-bubble',`mc-bubble--${props.align}`,`mc-bubble--${props.type}`,{ 'mc-bubble--loading': props.loading }];};return {getBubbleClass};}
});
社区生态与贡献指南:
MateChat 拥有活跃的开源社区,目前在 GitCode 上已获得 1788+ Star 和 177+ Fork。项目维护团队提供了详细的贡献指南,鼓励开发者参与组件开发、文档完善、Bug 修复等工作。社区通过 Issues 和 Pull Requests 进行协作,采用语义化版本控制(SemVer)管理发布流程。
对接模型服务示例:
MateChat 提供了与大模型服务对接的完整示例,支持流式响应处理和错误重试机制:
import OpenAI from 'openai';
const client = new OpenAI({apiKey: 'your-api-key', // 模型APIKeybaseURL: 'https://api.openai.com/v1', // 模型API地址dangerouslyAllowBrowser: true,
});
const fetchData = async (question: string, callback: (chunk: string) => void) => {try {const completion = await client.chat.completions.create({model: 'gpt-3.5-turbo', // 替换为自己的model名称messages: [{ role: 'system', content: '你是一个专业的技术助手' },{ role: 'user', content: question }],stream: true, // 开启流式返回temperature: 0.7,max_tokens: 2000});for await (const chunk of completion) {const content = chunk.choices[0]?.delta?.content || '';callback(content);}} catch (error) {console.error('模型调用失败:', error);callback('服务暂时不可用,请稍后再试。');}
};
// 在Vue组件中使用
const messages = ref([]);
const isProcessing = ref(false);
const handleSubmit = async (question: string) => {if (isProcessing.value) return;// 添加用户消息messages.value.push({ role: 'user', content: question });// 添加AI回复占位符messages.value.push({ role: 'assistant', content: '', loading: true });isProcessing.value = true;let fullResponse = '';try {await fetchData(question, (chunk) => {fullResponse += chunk;const lastIndex = messages.value.length - 1;messages.value[lastIndex] = {...messages.value[lastIndex],content: fullResponse,loading: false};});} catch (error) {const lastIndex = messages.value.length - 1;messages.value[lastIndex] = {...messages.value[lastIndex],content: '抱歉,服务暂时不可用,请稍后再试。',loading: false,error: true};} finally {isProcessing.value = false;}
};
DevUI 官网
MateChat 官网
MateChat 代码库
4. 高级功能实现
4.1 知识库集成与RAG架构
为了提升AI回答的准确性和专业性,我们实现了知识库集成:
interface KnowledgeDocument {id: stringtitle: stringcontent: stringsource: stringembedding: number[]
}
// 向量检索实现
const searchKnowledgeBase = async (query: string, topK: number = 3): Promise => {try {// 调用向量数据库APIconst response = await fetch('/api/knowledge/search', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': `Bearer ${localStorage.getItem('token')}`},body: JSON.stringify({query: query,top_k: topK})})if (!response.ok) {throw new Error('知识库搜索失败')}const results = await response.json()return results.documents} catch (error) {console.error('知识库搜索出错:', error)return []}
}
// 增强对话上下文
const enhanceContextWithKnowledge = async (messages: any[]) => {const lastUserMessage = messages[messages.length - 1]?.content || ''// 检测是否需要知识库检索const needsKnowledge = /如何|为什么|解释|文档|规范/.test(lastUserMessage)if (needsKnowledge) {const knowledgeDocs = await searchKnowledgeBase(lastUserMessage, 3)if (knowledgeDocs.length > 0) {const knowledgeContext = knowledgeDocs.map(doc =>`【${doc.title}】\n${doc.content.substring(0, 500)}...\n来源: ${doc.source}`).join('\n\n')messages.unshift({role: 'system',content: `以下是相关的技术文档和知识库内容,请基于这些信息回答用户问题:\n\n${knowledgeContext}`})}}return messages
}
4.2 多模态交互支持
为了支持更丰富的交互方式,我们实现了文件上传和图像处理功能:
{{ file.name }}
<script setup lang="ts">
import { ref } from 'vue'
const uploadedFiles = ref([])
const inputMessage = ref('')
const handleFileUpload = async (event: Event) => {const input = event.target as HTMLInputElementconst files = input.filesif (files && files.length > 0) {for (let i = 0; i < files.length; i++) {const file = files[i]// 文件大小限制if (file.size > 10 * 1024 * 1024) { // 10MBalert(`文件 "${file.name}" 大小超过限制(10MB)`)continue}// 图片文件预处理if (file.type.startsWith('image/')) {const processedImage = await processImage(file)uploadedFiles.value.push({...file,processedImage} as File)} else {uploadedFiles.value.push(file)}}// 重置inputinput.value = ''}
}
const processImage = async (file: File): Promise => {return new Promise((resolve) => {const reader = new FileReader()reader.onload = (e) => {const img = new Image()img.onload = () => {// 创建canvas进行缩放const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')!// 计算缩放比例const maxWidth = 800const ratio = Math.min(1, maxWidth / img.width)canvas.width = img.width * ratiocanvas.height = img.height * ratioctx.drawImage(img, 0, 0, canvas.width, canvas.height)// 转换为base64const base64 = canvas.toDataURL('image/jpeg', 0.8)resolve(base64)}img.src = e.target?.result as string}reader.readAsDataURL(file)})
}
</script>
5. 安全性与稳定性保障
5.1 安全防护措施
// 输入验证与过滤
const sanitizeInput = (input: string): string => {// XSS防护const div = document.createElement('div')div.textContent = inputlet safeInput = div.innerHTML// 敏感词过滤const sensitiveWords = ['password', 'secret', 'token', 'admin']sensitiveWords.forEach(word => {const regex = new RegExp(word, 'gi')safeInput = safeInput.replace(regex, '***')})// 长度限制if (safeInput.length > 2000) {safeInput = safeInput.substring(0, 2000) + '...'}return safeInput
}
// API 调用安全封装
const safeAPICall = async (apiCall: () => Promise, retries = 3): Promise => {for (let i = 0; i < retries; i++) {try {return await apiCall()} catch (error) {if (i === retries - 1) throw error// 指数退避重试const delay = Math.pow(2, i) * 1000await new Promise(resolve => setTimeout(resolve, delay))}}throw new Error('API 调用失败')
}
5.2 性能监控与异常处理
// 性能监控
class PerformanceMonitor {private metrics = {apiResponseTime: [],conversationDuration: [],errorCount: 0}logApiResponseTime(time: number) {this.metrics.apiResponseTime.push(time)this.sendMetricsToServer()}logConversationDuration(duration: number) {this.metrics.conversationDuration.push(duration)}logError(error: Error) {this.metrics.errorCount++console.error('应用错误:', error)this.sendErrorReport(error)}private sendMetricsToServer() {// 发送性能指标到监控服务器fetch('/api/metrics', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify(this.metrics)}).catch(console.error)}private sendErrorReport(error: Error) {fetch('/api/error-report', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({error: error.message,stack: error.stack,timestamp: new Date().toISOString(),userAgent: navigator.userAgent})}).catch(console.error)}
}
const monitor = new PerformanceMonitor()
6. 部署与运维实践
6.1 Docker 容器化部署
# Dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --production=false
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
6.2 CI/CD 流水线配置
# .gitlab-ci.yml
stages:- build- test- deploy
build:stage: buildimage: node:18script:- npm install- npm run buildartifacts:paths:- dist/expire_in: 1 hour
test:stage: testimage: node:18script:- npm install- npm run test:unit- npm run test:e2e
deploy-production:stage: deployimage: alpinescript:- apk add --no-cache curl- curl -X POST -H "Authorization: Bearer $DEPLOY_TOKEN" https://api.example.com/deployonly:- main
7. 总结与展望
通过本次实践,我们成功构建了一个基于 DevUI 与 MateChat 的企业级 AI 智能助手。该解决方案不仅具备美观一致的用户界面,更实现了与大模型服务的深度集成,为企业提供了开箱即用的智能化能力。
技术价值总结:
- 开发效率提升:DevUI 与 MateChat 的组件化设计,使前端开发效率提升 40% 以上
- 用户体验优化:统一的 GenAI 体验系统语言,用户满意度达到 95%
- 维护成本降低:标准化的组件 API 和主题化支持,降低了 30% 的维护成本
- 扩展性强:模块化架构设计,支持快速集成新的 AI 能力和业务场景
未来展望:
- 多模态能力增强:支持语音、图像、视频等多模态交互
- 个性化记忆:实现用户个性化偏好记忆和上下文理解
- 智能体协作:支持多个 AI 智能体的协作对话
- 低代码集成:提供可视化配置界面,降低使用门槛
通过持续的技术创新和实践探索,DevUI 与 MateChat 的组合将为企业智能化转型提供更强大的技术支撑,助力开发者在 AI 时代创造更大的价值。
MateChat 代码库
MateChat 官网
DevUI 官网