首页 文章 精选 留言 我的

精选列表

搜索[star],共5479篇文章
优秀的个人博客,低调大师

开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?

作者 |敖小剑 来源 | 阿里巴巴云原生公众号 Dapr 是 2019 年 10 月微软开源的可移植、事件驱动分布式运行时,它使开发人员能够轻松地构建运行在云平台和边缘的弹性而微服务化的无状态和有状态的应用程序,从而降低基于微服务架构构建现代云原生应用的准入门槛。 在今年 2 月份刚刚发布了 v1.0 正式版本。虽然推出至今不过一年半时间,但 Dapr 发展势头十分迅猛,目前已经在 GitHub 上收获了 1.2w 星。阿里是 Dapr 开源项目的深度参与者和早期采用者,率先进行了生产落地,集团内部有十几个应用在使用 Dapr;目前已有 2 位 Dapr成员,是 Dapr 项目中除微软之外代码贡献最多的公司。 拉到文末可以了解 Dapr 入门教程体验方式 为什么阿里会选择Dapr? 在阿里巴巴,Java 使用非常广泛,不仅仅业务应用大量使用 Java,大量中间件和基础能力的服务器端也是使用 Java 开发。在过去十几年间,我们围绕 Java 建立了非常完备的生态体系,经历过各种严酷的考验。 而随着业务形态的日渐丰富,多语言的需求在不断的增加,如 nodejs / golang / c / c++ / rust 等。特别是在微服务流行之后,根据实际情况而选择使用不同的编程语言开发微服务成为趋势。但效仿 Java ,为每一种编程语言都打造一套功能完备的生态体系在成本上是不现实的。因此,需要一个成本可控的方案来解决多语言问题,让微服务开发能真正的实现“语言自由”。 随着云的采用,业务应用的形态也开始朝云原生方向发展,越来越多的业务应用(尤其是前台业务)开始拥抱 FaaS 和 Serverless 作为应用托管和资源调度的解决方案。而在 FaaS 和 Serverless 场景下,需要更轻量化的解决方案以满足快速启动和伸缩的需求 —— 传统类库模式下由于需要集成大量的 SDK,业务应用变得非常的臃肿。而在 Function 形态下更加的不协调,以 nodejs 为例:几百行的 nodejs Function 代码依然需要依赖多达几十兆的 node module。同时 FaaS 和 Serverless 也对多语言的支持提供了更高的要求。因此,在 FaaS 和 Serverless 这种新型形态下有必要提供有别于传统类库方式的、更轻量化的、支持多语言的解决方案。 显然,Servicemesh 倡导的 Sidecar 模式是解决上述问题的绝佳方案。在过去几年间,随着 Servicemesh 的发展和采用, Sidecar 模式已经得到充分验证:Sidecar 模式非常符合云原生的理念,特别是在多语言支持和应用轻量化方面具备天然优势。 我们非常认可 Bilgin Ibryam 在"Multi-Runtime Microservices Architecture"一文中提出的 Multiple Runtime / Mecha Runtime 的理念,尤其是他对分布式应用需求的分析,很符合我们的实际情况: 而 Dapr 是第一个实践 Multiple Runtime 理念的开源项目,我们从这个项目发布开始就密切关注它,因为 Dapr 可以很好的解决我们面临的问题:Sidecar 模式天然提供了对多语言的支持,各种客户端 SDK 被 Dapr Runtime 替代之后应用也得以轻量化。 此外,从长期战略的角度考虑,我们在 2020 年提出了"三位一体"的理念,即将“自研技术”、“开源项目”、“商业产品”形成统一的技术体系,最大化技术的价值。而当前的实际情况是三者有完全不同的产品和技术方案,导致当我们需要将某个产品在阿里内部、公有云、客户私有云等不同的平台上进行迁移时,或者是跨多个平台部署时,就会遇到非常大的挑战。Dapr 面向能力编程的理念,强调可移植性和可扩展性的标准 API,平台中立、无供应商锁定的设计,深深的吸引了我们。 “在阿里云,我们相信 Dapr 将引领微服务的发展。通过采用 Dapr,我们的客户现在可以以更快的速度来构建可移植和健壮的分布式系统。” —— 阿里云资深技术专家 李响 在 2020 年年中,我们开始基于 Dapr 项目进行了内部小规模的试点,在实际的落地过程中探索和验证 Dapr 的理念。我们也积极参与到 Dapr 开源项目的建设中,提交了大量的改进建议和代码。 下面我们将以 Dapr 在阿里的实际落地场景来具体说明 Dapr 是如何帮助我们解决上述问题的。 Dapr 在阿里的实践 1. 概况 目前 Dapr 在阿里巴巴内部还处于实验阶段。 我们的首要工作是为内部的中间件开发 Dapr 组件,使业务应用程序可以与这些中间件和实现它们的 Java 语言/ Java Client SDK 解耦。然后通过小规模的业务应用落地,在各种场景下的对 Dapr 进行验证,在验证完成之后计划继续部署较大规模的业务应用。 截止到 2021 年 3 月,Dapr 在阿里内部落地的场景主要集中在 2 个方面:多语言支持和云间迁移。 2. 多语言支持 1)Faas / Serverless 场景 背景:在阿里的电商系统中,存在大量活动和导购需求。 这些需求的特点是"短平快":需要快速开发、快速迭代、生命周期相对比较短。因此这类需求非常适合通过采用 FaaS 的方式来落地。 Faas 对多语言支持有强烈的诉求,肯定不会局限于 Java。而阿里内部大部分应用都是 Java 体系,对多语言的支持比较弱,尤其是新兴语言(如 Dart)或者小众语言(如 Rust)。 而从需求上说,采用 FaaS 的应用也同样需要和内部运行的服务以及各种中间件/基础设施进行通讯,因此 FaaS 平台迫切的需要解决多语言支持问题。 通过 Dapr ,我们很好的解决了 FaaS 的多语言问题,从而使得客户通过 FaaS 实现了开发效率的大幅提升。 2)多语言应用的接入 背景:阿里收购有大量的公司。 这些收购的公司有大量的应用,而这些应用中很多不是 Java 体系,在接入阿里的技术体系时,对多语言支持有明确的需求。 另外,由于业务创新的需要,有些应用对 nodejs 和 golang 有强烈诉求,还有一些应用则需要使用到 Dart 和 C++。 但目前这些语言的生态系统并没有像 Java 那么完善,尤其部分中间件和基础设施已经发展的非常成熟,进入维护状态,不太可能在现在重新开发所有语言的客户端:成本上代价很高,时间上也来不及。 通过 Dapr ,我们可以为这些应用提供多语言解决方案。 3)复杂的 Java 遗留系统 背景:基于 Java ClassLoader 机制而设计的复杂系统。 为了解决类冲突问题,隔绝不同的业务模块,阿里针对 Java 系统设计了基于 ClassLoader 机制的复杂系统,这些系统的设计往往非常复杂,应用也非常臃肿。 此外,部分业务团队为了能和现有的中间件进行互通,自行维护了一套多语言的中间件 SDK,而这些 SDK 本来应该由中间件团队维护并保持同步更新。这也带来了稳定性方面的隐患和风险。 我们期望将这些遗留的系统迁移到 Dapr 中,统一实现中间件 SDK 的维护和更新。比较特殊的是这里存在一个需求:最好能让业务开发团队尽量不做代码层面的调整,以减少迁移时对业务应用的冲击。 所以针对 Java 遗留系统,在迁往 Dapr 时,我们额外设计了一个 Java 适配层:将原来的 Java 调用适配到 Dapr 的客户端 API 上。 以上三种多语言的落地实践场景,如下图所示: 3. 云间迁移 背景:业务应用对外输出时有跨平台需求。 阿里的部分业务,如钉钉文档,原本是提供给阿里内部和外部用户直接使用的,此时钉钉文档只需要部署在阿里内部的业务集群里,直接访问阿里内部的生态体系。 但是随着 SaaS 业务的发展,以及部分信息安全敏感的用户对于数据安全的强烈诉求, 需要将钉钉文档部署到用户 VPC 下或者公有云下。 为此,我们需要将钉钉文档的系统从阿里内部迁移到公有云上进行部署,而钉钉文档使用的底层技术需要从阿里内部的技术体系迁移到使用开源技术或阿里云的商业化产品上。 借助 Dapr 的标准 API 和可扩展的组建模型,我们采取的策略是让用户不需要修改任何代码,直接通过 Dapr Runtime 屏蔽底层使用的中间件:部署在不同平台时,通过激活 Dapr 中的不同的 Component 来提供一致的能力。 以消息通讯威力,当应用需要访问消息系统时: 在阿里内部:通过 Rocketmq.yaml 激活 Rocketmq 组件。 在公有云上:通过 Kafka.yaml 激活 kafka 组件。 通过 Dapr 的可移植性,上层的钉钉文档应用现在可以和底层的基础设施(如消息系统)解耦,从而实现在不同的云平台之间平滑迁移: 最终帮助我们的业务团队实现了他们的业务目标:使 Dingtalk 在任何地方部署成为可能。 阿里的 Dapr 未来规划 未来我们将继续通过应用试点的方式对 Dapr 进行验证,包括: 适用场景 性能 稳定性 可移植性 同时我们将继续开发 Dapr 的组件,以集成更多的中间件和基础设施,包括内部产品和阿里云上支持的商业产品。其中对阿里云商业产品的集成代码,我们将在验证通过之后贡献给 Dapr 项目,从而为 Dapr 提供阿里云支持。这些项目预计将包括: Apache Dubbo 的 RPC 支持 Apache RocketMQ 的消息传递支持 Nacos 的动态配置支持 阿里云 RDS 的 MySQL 支持 阿里云缓存服务的 Redis 支持 作为 Multiple Runtime 架构的先驱者和 Dapr 项目的早期采用者,我们将继续和 Dapr 社区合作,在落地的过程中努力完善 Dapr 的功能、性能、稳定性等关键指标,和社区一起联手打造云原生时代的DistributedAPplicationRuntime!

优秀的个人博客,低调大师

爆了,已获8.5K star !轻量小巧的开源录屏神器来了!

macOS平台录屏工具长期存在两极分化,付费软件功能冗余、轻量工具能力单薄。QuickRecorder依托苹果原生录屏框架打造,体积小巧且覆盖多终端录制需求,本文拆解安装流程、核心功能、适用场景,对比主流录屏工具,方便不同创作者按需选用。 ![](https://developer.qcloudimg.com/http-save/yehe-11919542/1e34a27ecf4c4ae9c1c94922baeda6b1.png) ## **📌 一、核心优势速**览 ### **✨ 1.1 轻量化底层架构** 软件采用Swift原生开发,安装包体积不足4MB,直接调用系统ScreenCapture Kit接口,跳过第三方虚拟采集链路,4K高分辨率录制时硬件占用维持低位,低配Mac设备也能流畅运行。 ### **✨ 1.2 多维度录制模式** 内置多套录制方案,覆盖不同内容产出需求,支持电脑屏幕与移动设备同步捕获,无需额外投屏工具即可完成多端画面整合录制。 ### **✨ 1.3 免驱音频捕获** 原生支持系统音频回录,不用安装虚拟音频驱动,同步收录系统音效与人声讲解,音画同步延迟控制在毫秒区间,适配网课、游戏、线上会议录制。 ![](https://developer.qcloudimg.com/http-save/yehe-11919542/e34ff120f6fe0d727b3d34c98222921b.png) ## **📌 二、主流工具横向对**比 |工具名称|开源属性|安装体积|系统内录|移动设备录制|内置剪辑|Alpha通道输出| | --- | --- | --- | --- | --- | --- | --- | |QuickRecorder|开源免费|<4MB|原生免驱支持|支持iPhone/iPad直连|基础裁剪|支持HEVC透明通道| |OBS Studio|开源免费|百MB级|需额外驱动|仅支持投屏|无内置剪辑|不支持| |Mac自带QuickTime|系统内置|无额外占用|不支持系统声音|仅有线简单录制|极简修剪|不支持| |Loom|免费/付费订阅|数十MB|基础支持|不支持|轻度剪辑|不支持| ## **📌 三、安装部署教**程 ### **✨ 3.1 两种安装渠道** #### **💡 方式1:Homebrew命令行安**装 适合熟悉终端操作的使用者,一行指令自动完成部署 ``` brew install lihaoyun6/tap/quickrecorder ``` #### **💡 方式2:手动安装包部**署 前往项目Releases页面下载dmg安装包,拖拽至应用程序文件夹即可完成安装。 ### **✨ 3.2 权限配置步骤** 首次启动会触发权限申请,进入系统设置-安全性与隐私,依次开启屏幕录制、麦克风、辅助功能权限,重启软件后全部功能正常启用。 ### **✨ 3.3 系统适配门槛** 仅支持macOS 12.3及以上系统,macOS 14及以上版本可完整使用演讲者叠加特性,低版本仅提供摄像头悬浮窗口模式。 ![](https://developer.qcloudimg.com/http-save/yehe-11919542/aa064e989918d3e400c834e896c7ed9c.png) ## **📌 四、功能与适用场**景 ### **✨ 4.1 核心实用功能** 1. 录制增强组件:鼠标高亮、画面局部放大镜,教程类视频可突出操作重点 1. 演讲者叠加:录制时悬浮摄像头画面,网课、产品演示无需后期合成人像 1. 专业编码输出:HEVC高效压缩格式,同等画质下文件体积更小,支持带Alpha透明通道视频导出,适配后期合成工作流 1. 录制后快速剪辑:内置预览裁剪面板,录制完成直接修剪多余片段,无需启动第三方剪辑软件 1. 自定义快捷键:自定义启停、暂停、标记点位快捷键,提升录制操作效率 ### **✨ 4.2 适配使用场景** - 开发者:应用窗口单独录制,仅捕获目标软件界面,避免桌面隐私内容入镜,用于Bug复现、代码教学演示 - 内容创作者:多设备同录,Mac搭配iPhone画面同步录制,制作数码测评、移动端操作教程 - 讲师/办公人群:会议、网课完整音画留存,开启摄像头叠加,产出带真人出镜的教学视频 - 后期制作从业者:透明通道视频输出,无缝对接FCPX、iMovie做特效合成 ### **✨ 4.3 解决行业常见痛点** 1. 省去音频驱动安装步骤,新手无需配置虚拟声卡即可录制系统声音 1. 精准窗口/应用录制,不用手动框选区域,画面干净无多余干扰内容 1. 轻量化运行,长时间录制不会拖累IDE、剪辑软件等前台程序运行 1. 开源无广告、无时长限制,不存在水印、功能锁等使用门槛 ![](https://developer.qcloudimg.com/http-save/yehe-11919542/59210a9e23cd2ad44d9d5f4e9c5128a0.jpg) ## **📌 五、基础操作流**程 1. 启动软件,顶部菜单栏出现工具图标,点击展开操作面板 1. 按需选择录制模式:全屏、窗口、单一应用、区域、移动设备 1. 按需开启配套功能:鼠标高亮、摄像头叠加、双音轨录制 1. 调整分辨率、帧率、编码格式参数,点击录制按钮开始捕获 1. 录制结束自动弹出预览窗口,完成片段裁剪后导出本地文件 **这款轻量开源录屏工具平衡了体积、性能与完整功能,对开发者、讲师、内容创作群体都有适配价值。无需付费、无冗余组件,依托系统原生框架实现低占用录制,多终端捕获、免驱音频、专业编码等特性覆盖多数录屏需求,有Mac录屏需求的使用者可以尝试部署体验。** #Mac工具 #开源软件 #录屏工具 #开发者工具 #效率神器

优秀的个人博客,低调大师

🔥Star 6.3k 支持 AI 无代码工作流引擎 FlowLong 1.2.4 发布

开源地址:https://gitee.com/aizuda/flowlong 开源地址:https://github.com/aizuda/flowlong 官网文档:https://flowlong.aizuda.com 更新日志: feat: 新增 pom 管理版本号 feat: 新增跳转重新设置处理人测试用例 opt: 优化重新加载流程模型兼容错误数据 opt: 优化为草稿主办都为开始节点设定 opt: 优化支持动态修改设置新的审核人类型 opt: 优化浏览文件支持多层嵌套子流程关闭 opt: 优化支持拒绝驳回到子流程内部 opt: 优化检测模型审批节点配置错误细节 fixed: 修复解决反复退回拒绝到发起人异常问题 fixed: 修复删除流程实例未关联子流程问题 fixed: 修复路由子节点key获取失败问题 fixed: 修复获取下一个节点不存在子节点情况 fixed: 修复多个分支没有自己的子节点时报错问题 fixed: 修复直接退回到发起人节点修改为草稿状态 fixed: 修复子流程完成重启父流程动态修改模型失败问题 可视化流程审批效果如下:

优秀的个人博客,低调大师

🔥Star 6.2k 支持 AI 无代码工作流引擎 FlowLong 1.2.3 发布

开源地址:https://gitee.com/aizuda/flowlong 开源地址:https://github.com/aizuda/flowlong 官网文档:https://flowlong.aizuda.com 更新日志: opt: Spring SPEL 兼容错误配置 opt: 优化支持删除存在的流程定义及历史版本相关数据 opt: 优化认领任务创建人时间修改为认领人认领时间 opt: 优化驳回策略使用枚举消除魔法值 opt: 优化执行完任务数据传输对象线程变量释放 opt: 优化完善的AI审批逻辑 opt: 优化完善获取下一步执行节点逻辑 fixed: 修复 maven 模块名冲突 fixed: 修复用户多角色或签认领其它参与者未处理问题 fixed: 修复撤回到发起人唤醒任务未创建问题 AI审批 AI智能体根据参数配置等信息,智能路由决策,智能辅助审批。 核心思想:从“规则驱动”到“语义理解驱动” 传统工作流引擎:依赖于预定义的、结构化的规则。例如:“如果报销金额 < 1000元,则自动通过;否则,转交部门经理审批。” 它高效、准确,但僵化,无法处理规则之外的例外情况或需要复杂判断的场景。 智能审批(结合大模型):引入大模型的自然语言理解、上下文分析、知识推理和内容生成能力。它可以理解审批内容(如合同条款、报销事由、项目报告)的语义,而不仅仅是结构化的数据字段。 @Slf4j public class TestAiHandler implements FlowAiHandler { // 创建一个 AI 智能体处理用户 public static final FlowCreator aiUser = new FlowCreator("1", "AI 智能体"); @Override public AiResponse execute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel) { AiConfig aiConfig = nodeModel.getAiConfig(); // 1. 构建 Prompt 提示词 if (null != aiConfig) { System.out.println("AI Prompt Template: " + aiConfig.getPromptTemplate()); } System.out.println("handle 根据 callAi 识别处理具体逻辑:" + nodeModel.getCallAi()); // 2. 调用 AI 服务(此处为示例实现,实际需对接真实 AI API) try { // TODO: 对接实际的 AI 服务,如 OpenAI、Claude、文心一言等 // AiServiceResponse response = aiService.chat(prompt, aiConfig.getModelParams()); // 返回一个模拟的成功响应,包含决策、建议、置信度和指标 return AiResponse.builder() .status(AiStatus.SUCCESS) .decision("flk17631709068381") .advice("AI 审批建议:经分析,该申请符合相关规定,建议通过。") .confidence(0.95) .metrics(AiResponse.AiMetrics.builder() .modelName("default-model") .promptTokens(100L) .completionTokens(50L) .totalTimeMs(500L) .build()) .build(); } catch (Exception e) { log.error("AI processing failed: {}", e.getMessage(), e); return AiResponse.failure("AI 服务调用失败: " + e.getMessage()); } } /** * 处理 AI 响应结果 */ @Override public boolean processAiResponse(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, AiResponse aiResponse) { if (null == aiResponse) { return this.handleAiFallback(execution, nodeModel, "AI 处理器返回空响应"); } AiStatus status = aiResponse.getStatus(); // 1. 处理异步情况 if (aiResponse.isAsync()) { // 异步模式:流程挂起,等待回调 return true; } // 获取 AI 配置 AiConfig aiConfig = nodeModel.getAiConfig(); // 2. 合并 AI 提取的变量到执行参数 this.mergeAiVariables(execution, aiResponse, aiConfig); // 3. 检查置信度 double confidenceThreshold = 0.8; if (null != aiConfig) { confidenceThreshold = aiConfig.getConfidenceThresholdOrDefault(); } if (aiResponse.getConfidenceOrDefault() < confidenceThreshold) { return this.handleAiFallback(execution, nodeModel, "AI 置信度低: " + aiResponse.getConfidenceOrDefault() + ", 建议: " + aiResponse.getAdvice()); } // 4. 根据状态处理 switch (status) { case SUCCESS: return this.handleAiSuccess(execution, nodeModel, aiResponse); case LOW_CONFIDENCE: case FALLBACK: case FAILURE: case TIMEOUT: return this.handleAiFallback(execution, nodeModel, aiResponse.getErrorMessage()); default: return true; } } /** * AI 处理成功 */ protected boolean handleAiSuccess(Execution execution, NodeModel nodeModel, AiResponse aiResponse) { // 根据决策结果进行自动审批 List<FlwTask> flwTasks = execution.getFlwTasks(); for (FlwTask ft : flwTasks) { // 记录 AI 审批意见相关数据到任务变量(用于历史记录) Map<String, Object> args = execution.getArgs(); if (null != args) { // 审批意见 if (null != aiResponse.getAdvice()) { args.put("_ai_advice", aiResponse.getAdvice()); args.put("_ai_decision", aiResponse.getDecision()); args.put("_ai_confidence", aiResponse.getConfidenceOrDefault()); } // 记录指标数据 if (null != aiResponse.getMetrics()) { AiResponse.AiMetrics metrics = aiResponse.getMetrics(); args.put("_ai_model", metrics.getModelName()); args.put("_ai_tokens", metrics.getTotalTokens()); args.put("_ai_time_ms", metrics.getTotalTimeMs()); } } // AI 建议通过,自动完成任务 if (aiResponse.isPass()) { execution.getEngine().autoCompleteTask(ft.getId(), args, aiUser); } // AI 建议拒绝,自动拒绝任务 if (aiResponse.isReject()) { execution.getEngine().autoRejectTask(ft, args, aiUser); } } // 其他决策结果,不自动处理,等待人工介入 return true; } /** * AI 降级处理 */ protected boolean handleAiFallback(Execution execution, NodeModel nodeModel, String reason) { AiConfig aiConfig = nodeModel.getAiConfig(); if (null == aiConfig) { return true; } String fallbackStrategy = aiConfig.getFallbackStrategyOrDefault(); if (AiFallbackStrategy.MANUAL.eq(fallbackStrategy)) { return true; } // 记录降级原因 Map<String, Object> args = execution.getArgs(); if (null != args) { args.put("_ai_fallback", true); args.put("_ai_fallback_reason", reason); } List<FlwTask> flwTasks = execution.getFlwTasks(); for (FlwTask ft : flwTasks) { if (AiFallbackStrategy.DEFAULT_PASS.eq(fallbackStrategy)) { // 默认通过 execution.getEngine().autoCompleteTask(ft.getId(), args, aiUser); } else if (AiFallbackStrategy.DEFAULT_REJECT.eq(fallbackStrategy)) { // 默认拒绝 execution.getEngine().autoRejectTask(ft, args, aiUser); } } return true; } @Override public String decideRoute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) { // 默认实现:返回 null,表示不由 AI 决定路由 System.out.println("AI Decision: " + args.get("content")); // 这里模拟决策返回 审批 A 所在分支 return "flk17631709068381"; } @Override public List<String> decideInclusiveRoutes(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) { // 默认实现:返回 null,表示不由 AI 决定包容分支 return null; } @Override public boolean onAsyncComplete(FlowLongContext flowLongContext, String asyncToken, AiResponse aiResponse) { // 异步回调处理 log.info("AI async complete, token={}, status={}", asyncToken, aiResponse.getStatus()); // TODO: 根据 asyncToken 找到对应的任务,并恢复流程执行 // 1. 根据 asyncToken 查询挂起的任务 // 2. 根据 aiResponse 结果决定是自动完成还是转人工 // 3. 恢复流程执行 return true; } }

优秀的个人博客,低调大师

近 80k star,这个强大的 Open WebUI 自托管 AI 项目不能错过

Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,完全支持离线运行。它支持多种 LLM(大型语言模型)运行器,如 Ollama 和 OpenAI 兼容 API,并内置了用于 RAG 的推理引擎,使其成为一个强大的 AI 部署解决方案。 更多信息,请查看我们的Open WebUI 文档。 Open WebUI 的关键特性⭐ 🚀轻松设置:使用 Docker 或 Kubernetes(kubectl、kustomize 或 helm)无缝安装,支持:ollama和:cuda标签的镜像,体验无忧。 🤝Ollama/OpenAI API 集成:轻松集成 OpenAI 兼容 API,与 Ollama 模型一起进行多样化的对话。自定义 OpenAI API URL,连接到LMStudio、GroqCloud、Mistral、OpenRouter 等。 🛡️细粒度权限和用户组:管理员可以创建详细的用户角色和权限,确保安全的用户环境。这种细粒度的控制不仅增强了安全性,还能为用户带来定制化的体验,培养用户的归属感和责任感。 📱响应式设计:在桌面电脑、笔记本电脑和移动设备上享受无缝体验。 📱移动设备上的渐进式 Web 应用(PWA):通过我们的 PWA 在移动设备上享受类似原生应用的体验,提供离线访问 localhost 和无缝用户界面。 ✒️🔢完整支持 Markdown 和 LaTeX:通过全面支持 Markdown 和 LaTeX,提升你的 LLM 体验,实现更丰富的交互。 🎤📹免提语音/视频通话:通过集成的免提语音和视频通话功能,体验无缝沟通,让聊天环境更加动态和互动。 🛠️模型构建器:通过 Web UI 轻松创建 Ollama 模型。通过Open WebUI 社区集成,创建和添加自定义角色/代理、自定义聊天元素以及轻松导入模型。 🐍原生 Python 函数调用工具:通过在工具工作区中内置代码编辑器支持,增强你的 LLM。通过添加纯 Python 函数,实现与 LLM 的无缝集成。 📚本地 RAG 集成:借助开创性的检索增强生成(RAG)支持,开启聊天互动的未来。你可以直接在聊天中加载文档,或通过#命令在查询前访问文档库中的文件。 🔍RAG 的网络搜索:使用SearXNG、Google PSE、Brave Search、serpstack、serper、Serply、DuckDuckGo、TavilySearch、SearchApi和Bing等提供商进行网络搜索,并将结果直接注入到聊天体验中。 🌐网络浏览功能:通过在#命令后跟上 URL,将网站无缝集成到聊天体验中。此功能允许你将网络内容直接融入对话中,提升互动的丰富度和深度。 🎨图像生成集成:通过使用 AUTOMATIC1111 API 或 ComfyUI(本地)以及 OpenAI 的 DALL-E(外部)等选项,无缝融入图像生成能力,为你的聊天体验增添动态视觉内容。 ⚙️多模型对话:轻松与多种模型同时互动,发挥它们的独特优势,获得最佳响应。通过并行使用多种模型,提升你的体验。 🔐基于角色的访问控制(RBAC):通过限制权限确保安全访问;只有授权人员可以访问你的 Ollama,模型创建/拉取权限仅限管理员。 🌐🌍**多语言支持*/:通过我们的国际化(i18n)支持,用你偏好的语言体验 Open WebUI。加入我们,共同扩展支持的语言!我们正在积极寻找贡献者! 🧩管道、Open WebUI 插件支持:通过Pipelines 插件框架,将自定义逻辑和 Python 库无缝集成到 Open WebUI 中。启动你的 Pipelines 实例,将 OpenAI URL 设置为 Pipelines URL,探索无限可能。示例包括函数调用、用户速率限制以控制访问、使用 Langfuse 等工具进行使用情况监控、通过 LibreTranslate 进行实时翻译以支持多语言、有毒信息过滤等。 🌟持续更新:我们致力于通过定期更新、修复和新功能来改进 Open WebUI。 想了解更多关于 Open WebUI 的特性吗?请查看我们的Open WebUI 文档,获取全面的概述! 🔗还要查看 Open WebUI 社区! 别忘了探索我们的姊妹项目Open WebUI 社区,在这里你可以发现、下载和探索定制化的 Modelfiles。Open WebUI 社区为通过 Open WebUI 增强你的聊天互动提供了广泛的可能性!🚀

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册