WWW.YOUINFO.SITE
标签聚合 社区

/tag/社区

LinuxDo 最新话题 · 2026-06-11 22:42:04+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 前言 本教程的环境基于 jdk8 + langchain4j 0.35 教程源码放在这里了: github.com GitHub - worenbudaoni/rag-study-helper: 一个学习检索增强生成的全流程助手 一个学习检索增强生成的全流程助手 文章内容 因为内容比较多,我会从下面三个文章进行讲解,后续发布后会贴出来,这节讲: 接入飞书WIKI文档 RAG实现全流程 : 【开源、教程】RAG全流程实现(java+完整代码):第一弹 接入飞书WIKI文档 : 【开源、教程】RAG全流程实现(java+完整代码):第二弹 接口限流:令牌桶 + AOP 强烈建议先看完第一弹,不然后面代码有可能看不懂 实现逻辑 后面会有图文讲解的,这里就相当于大概介绍一下,看个大概就好,有不了解的不要先去搜,我后文都会讲,如果讲漏了麻烦评论一下,我改正 飞书开发者平台 : 1、去飞书开发者平台创建一个应用 2、给应用赋予权限(权限管理 菜单) 3、给应用赋予机器人能力(添加应用能力 菜单) 4、发布(版本管理与发布 菜单) 5、获取应用的app-id、app-secret(凭证和基础信息 菜单) 飞书app : 1、创建一个群聊 2、把机器人给拉进去 3、点击左边菜单的更多找到知识库,新建知识库(下面统一称为 WIKI) 4、添加群聊(机器人)为管理员:点 WIKI 进去会打开一个网站,左下角有个设置点进去,在成员设置->角色与权限->管理员,添加管理员,搜索我们刚才创建的有机器人的群聊并添加 5、在页面的连接处找到space-id,如: https://kcnvw23rzo5r.feishu.cn/wiki/settings/666666(666666就是我们要的space-id) 项目 : 1、创建一个job,用来定时获取文档(下面为job启动后的流程) 2、通过app-id、app-secret获取tenant_access_token和expire 3、通过tenant_access_token和space-id获取文档信息(名字、更新时间、documentToken 等等) 4、通过documentToken去获取文档的内容(字符串) 5、走 【开源、教程】RAG全流程实现(java+完整代码):第一弹 的入库流程 一、飞书开发者平台 app-id、app-secret 是啥 app-id :应用的唯一标识 app-secret :应用的密钥,在创建应用时由平台生成,可用于获取app_access_token 1、飞书开放平台创建企业应用 开发者后台 - 飞书开放平台 这里注意的是创建好应用后需要审核、启用,所以企业级的应用权限在领导手上,我们可以创建一个个人版的飞书账号来做实验 2、给应用赋予权限 (权限管理菜单) 直接复制我的也行 { "scopes": { "tenant": [ "bitable:app:readonly", "docx:document:readonly", "drive:drive:readonly", "drive:file:readonly", "wiki:wiki:readonly" ], "user": [] } } 3、给应用赋予机器人能力 (添加应用能力菜单) 4、发布 (版本管理与发布菜单) 创建好后发布就行 5、获取应用的app-id、app-secret(凭证和基础信息菜单) 二、飞书app space-id是啥 就是飞书知识库(WIKI)所对应的空间ID,我们找到这个空间就可以找到下面的文档 打个比方就是图书馆的书架,书架有个唯一标识(小说),我们根据这个书架ID(小说)去找下面所有的书 1、创建一个群聊 2、把机器人给拉进去 3、点击左边菜单的更多找到知识库,新建知识库(下面统一称为 WIKI) 4、添加群聊(机器人)为管理员 点 WIKI 进去会打开一个网站,左下角有个设置点进去,在成员设置->角色与权限->管理员,添加管理员,搜索我们刚才创建的有机器人的群聊并添加 5、在页面的连接处找到space-id 如: https://kcnvw23rzo5r.feishu.cn/wiki/settings/666666(666666就是我们要的space-id) 三、项目 这里就不按照上面实现逻辑写的走了,我就按照代码里的讲解 1、job总览(步骤拆解在后面) FeishuSyncService.java // 没想加重框架,如果用xxl-job什么的,自己搬一下就行了 @Scheduled(cron = "${app.feishu.cron}") public void syncWiki() { log.info("Starting Feishu wiki sync for space: {}", spaceId); try { // 获取全部文档信息(通过app-id、app-secret、space-id) // 这里逻辑后面会讲 List<WikiNode> nodes = feishuClient.getWikiNodeTree(spaceId); log.info("Found {} nodes in wiki", nodes.size()); // 成功数量,跳过数量(如果数据存在了关系型数据库且没有更新就跳过),失败数量 int synced = 0, skipped = 0, failed = 0; for (WikiNode node : nodes) { // 后缀 String objType = node.getObjType(); // 文档令牌 用来获取 文档内容 String nodeToken = node.getNodeToken(); // 更新时间判断是否需要跳过 long updateTime = node.getUpdateTime(); // 是否入库 Documents doc = documentsMapper.selectOne( Wrappers.<Documents>lambdaQuery() .eq(Documents::getFeishuNodeToken, nodeToken) ); // 文档是否更新是否需要跳过,这个更新时间不在where条件里面是因为后续要继续用到这个数据 if (doc != null && doc.getFeishuUpdateTime() != null && doc.getFeishuUpdateTime() == updateTime) { skipped++; continue; } try { // 文档内容 String content; // 获取文件名 String fileName; switch (objType) { case "doc": case "docx": // 获取文档内容 // 这里逻辑就不讲了,我后面扔给飞书的文档,照着对接或者看我源码就好 content = feishuClient.getDocumentContent(node.getObjToken()); fileName = node.getNodeTitle() + "_文档"; break; case "sheet": content = feishuClient.getSheetContent(node.getObjToken()); fileName = node.getNodeTitle() + "_表格"; break; case "bitable": content = feishuClient.getBitableContent(node.getObjToken()); fileName = node.getNodeTitle() + "_多维表格"; break; default: skipped++; continue; } // 如果是更新,先删旧向量和映射记录 if (doc != null) { // 查询旧文档相关的向量映射 List<DocumentChunks> oldChunks = documentChunksMapper.selectList( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, doc.getId()) ); // 有两张表 // 第一张为文档库:记录文档标题、更新时间、创建人等信息 // 第二张为分片库:记录向量数据库插入后的向量ID // 向量ID List<String> vectorIds = oldChunks.stream() .map(DocumentChunks::getVectorId) .collect(Collectors.toList()); // 删除向量 embeddingStore.removeAll(vectorIds); // 删除映射记录 documentChunksMapper.delete( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, doc.getId()) ); // 删除文档 documentsMapper.deleteById(doc.getId()); } // RAG 入库流程 (第一篇文章中亦有记载(跟第一章代码有些许出入,看完第一章后,直接看源码更佳)) ingestionService.ingestFeishuDocument(fileName, content, nodeToken, updateTime, objType); synced++; log.info(" Synced: {} ({})", node.getNodeTitle(), nodeToken); } catch (Exception e) { log.error(" Failed to sync node: {} ({})", node.getNodeTitle(), nodeToken, e); failed++; } } // 清理远程已删除的文档 // 这里的逻辑是 // 第一次job执行:查询飞书wiki给了 A、B、C 三个文档入库 // 后面有人在wiki中删了 C 文档 // 第二次job执行:只有查询出 A、B 两个文档 // 这时就要去数据库中和向量库中删除多余的 C 文档 List<String> remoteTokens = nodes.stream() .map(WikiNode::getNodeToken) .collect(Collectors.toList()); if (!remoteTokens.isEmpty()) { // MySQL 查出本地多出的记录,只遍历需要删除的 List<Documents> toRemove = documentsMapper.selectList( Wrappers.<Documents>lambdaQuery() .isNotNull(Documents::getFeishuNodeToken) .notIn(Documents::getFeishuNodeToken, remoteTokens) ); for (Documents removed : toRemove) { log.info("Document removed remotely, cleaning up: {} ({})", removed.getDocumentName(), removed.getFeishuNodeToken()); List<DocumentChunks> chunks = documentChunksMapper.selectList( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, removed.getId()) ); List<String> vectorIds = chunks.stream() .map(DocumentChunks::getVectorId) .collect(Collectors.toList()); // 向量数据库 删 embeddingStore.removeAll(vectorIds); // 关系型数据库 分片库 删 documentChunksMapper.delete( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, removed.getId()) ); // 关系型数据库 文档库 删 documentsMapper.deleteById(removed.getId()); } } log.info("Feishu wiki sync complete: synced={}, skipped={}, failed={}", synced, skipped, failed); } catch (Exception e) { log.error("Feishu wiki sync failed", e); } } 2、递归获取知识库所有文档节点 FeishuClient.java 这里其实没什么特别好讲的点,就是参考飞书文档,然后请求并解析 我在源码里也标记了文档的地址,所以这里放一个总体的查询地址 开发文档 - 飞书开放平台 /** * 获取 tenant_access_token(内部自动缓存和刷新) */ public synchronized String getAccessToken() throws IOException { if (cachedToken != null && System.currentTimeMillis() < tokenExpireAt) { return cachedToken; } String json = "{\"app_id\":\"" + appId + "\",\"app_secret\":\"" + appSecret + "\"}"; // https://open.feishu.cn/document/server-docs/authentication-management/access-token/tenant_access_token_internal Request request = new Request.Builder() .url(baseUrl + "/open-apis/auth/v3/tenant_access_token/internal") .post(RequestBody.create(JSON, json)) .build(); try (Response resp = httpClient.newCall(request).execute()) { JsonNode body = objectMapper.readTree(resp.body().string()); if (body.get("code").asInt() != 0) { throw new IOException("Failed to get access token: " + body); } cachedToken = body.get("tenant_access_token").asText(); // tenant_access_token 的最大有效期是 2 小时 // 7200 是秒 int expire = body.get("expire").asInt(7200); // 防御性编程 免得刚好过期 由于网络延时 造成接口调用失败 tokenExpireAt = System.currentTimeMillis() + (expire - 60) * 1000L; return cachedToken; } } /** * 递归获取知识库所有文档节点。 */ public List<WikiNode> getWikiNodeTree(String spaceId) throws IOException { List<WikiNode> allNodes = new ArrayList<>(); collectNodes(spaceId, null, allNodes); return allNodes; } private void collectNodes(String spaceId, String parentNodeToken, List<WikiNode> result) throws IOException { List<WikiNode> currentLevelNodes = new ArrayList<>(); String pageToken = null; do { // https://open.feishu.cn/document/server-docs/docs/wiki-v2/space-node/create StringBuilder url = new StringBuilder(baseUrl + "/open-apis/wiki/v2/spaces/" + spaceId + "/nodes"); if (parentNodeToken != null) { url.append("/").append(parentNodeToken).append("/children"); } url.append("?page_size=50"); if (pageToken != null) { url.append("&page_token=").append(pageToken); } Request request = new Request.Builder() .url(url.toString()) .header("Authorization", "Bearer " + getAccessToken()) .get() .build(); try (Response resp = httpClient.newCall(request).execute()) { JsonNode body = objectMapper.readTree(resp.body().string()); if (body.get("code").asInt() != 0) { log.error("Wiki API error for URL [{}]: {}", url, body); break; } JsonNode items = body.path("data").path("items"); for (JsonNode item : items) { WikiNode node = new WikiNode(); // 节点token node.setNodeToken(item.path("node_token").asText()); // 对应文档类型的token,可根据 obj_type 判断属于哪种文档类型。 node.setObjToken(item.path("obj_token").asText()); // 文档类型,对于快捷方式,该字段是对应的实体的obj_type。 // 可选值有: // doc:旧版文档 sheet:表格 mindnote:思维导图 bitable:多维表格 file:文件 docx:新版文档 slides:幻灯片 node.setObjType(item.path("obj_type").asText()); // 文档标题 node.setNodeTitle(item.path("title").asText()); node.setParentNodeToken(parentNodeToken); // 是否有子节点 node.setHasChild(item.path("has_child").asBoolean(false)); // 文档最近编辑时间 String editTime = item.path("obj_edit_time").asText(); node.setUpdateTime(Long.parseLong(editTime.isEmpty() ? "0" : editTime)); currentLevelNodes.add(node); } pageToken = body.path("data").path("page_token").asText(null); } } while (pageToken != null && !pageToken.isEmpty()); // Add all nodes from this level, then recurse into children result.addAll(currentLevelNodes); for (WikiNode node : currentLevelNodes) { if (node.isHasChild()) { collectNodes(spaceId, node.getNodeToken(), result); } } } 四、测试 1、导入文档 还是拿这个 补鸡稻 作为测试案例 2、配置 app-id、app-secret、space-id和sync-enable 我这里通过 jvm 运行参数注入,免得又把 apikey 给上传到 github 了 sync-enable 记得为 true,不然不注册 spring bean 3、运行时发现文档可以查询到,并且入库了 4、提问 5、测试结束,完结撒花 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 22:41:04+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 一个 Windows 小工具,可以读取本机 Claude Code 用量,并推送到 EDIFIER 花再 Halo PixelBar 点阵屏显示,支持手动推送、定时刷新、设备选择和界面化配置。 它可以在 Windows 上自动读取当前电脑的 Claude Code 登录凭证,查询 Claude 用量信息,然后渲染成 256x32 点阵画面,通过 HID 推送到 EDIFIER 花再 Halo PixelBar 显示。 界面: 效果图: 主要功能: 自动获取 Claude Code usage 信息 支持 5 小时、7 天、Sonnet 用量展示 支持 EDIFIER 花再 Halo PixelBar 点阵屏推送 支持手动推送一次 支持定时刷新,比如 5 / 10 / 30 分钟 支持选择设备 支持自定义显示文字、单位、布局、字体参数 支持推送前自动切换 WORK 场景 提供 GUI 可视化配置界面 附带源码和可直接运行的 exe 隐私说明: 工具只读取本机 Claude Code 的 OAuth 凭证,用于查询 usage API;不会上传 token,不会把 token 写入配置文件,也不会打包进 exe。项目是非官方工具,不属于 EDIFIER / Anthropic / Claude 官方项目。 项目地址: https://github.com/3441293738/claude-edifier-pixelbar-usage 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 22:32:57+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 最近做了一个自己在用的 YouTube 下载插件,开源出来。 项目地址: github.com GitHub - fengjunda888/youtube-download-extension: YouTube 视频下载 Chrome 扩展,基于… YouTube 视频下载 Chrome 扩展,基于 yt-dlp,支持合集、多任务、画质选择和下载进度 这个插件的特点: 基于 yt-dlp Chrome 插件形式 支持 Windows 和 macOS 支持先解析链接,再选择下载 支持单个视频、合集、多选、全选 支持画质选择 支持查看下载进度和任务状态 目前的使用方式是: 在 Chrome 加载 extension 目录 本地安装 Native Host 配好 yt-dlp 在插件里粘贴 YouTube 链接,先解析,再选择下载 Windows 安装比较直接: Install-NativeHost.bat macOS 也支持: Install-NativeHost.sh 说明一下: 这个工具不会绕过 YouTube 权限限制,会员、私有、区域限制之类的视频还是取决于 yt-dlp 和账号/网络环境。 欢迎试用,也欢迎提 issue / PR。 希望能给个star! 谢谢! LINUX DO 版主 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 21:43:35+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 上周累死累活的毕业论文论文终于是搞完了,于是就回顾了一下最头疼的地方。 我觉得最头疼的地方不是论文内容有多难改吧,毕竟现在大大家都用ai来写了基本上内容不用操什么心,反而是看来比较简单的改格式是真的烦人,特别是论文经过多次来回,容易出现一些特别细微的地方出现问题,然后被打回来,然后改完等导师看,又是一天过去了,但是捏,codex和claude貌似原始形态来做格式对照效果并不好,可能是我的使用方法有问题,总之就是还会让我发现一些地方,或者干脆就特别明显,演都不演了那种。唯一比较好用的就是team的pro,倒是真的还不错,但是实际上也会有一点小问题,而且修改时间动则1h以上。 所以基于以上问题我在L站搜索了一下,发现貌似没有特别好的解决方案,于是就比较针对性的vibe了一个skills来解决这个问题,发现效果意外的还不错,但是难免会有一些粗糙的地方,所以分享在这里,抛砖引玉,看看能不能集众人之力来完善这个方案qwq github: GitHub - ooyyh/templates-papers-matching · GitHub 如果帮到你了~请给我一个star~ 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 20:16:16+08:00 · tech

社区萌新,最近在社区逛了一圈,发现有多个帖子,在用 Claude Code 的时候,还得自己折腾远程接入的方案,甚至还有专门开源的桥接插件。 但我自己的场景中,Qoder CLI 自带的远程场景就很稳定,不知道是不是很多人没注意到? 我现在的用法很简单:开发机上开个 tmux session,Qoder CLI 跑在里面,进程是持久化的。然后不管是用 Web 端还是手机,连上去就是同一个会话,上下文完全不断。 体验上就是——你在工位上开着跑,路上用手机继续看、继续操作,到家里打开浏览器还是那个现场,上班的电脑都可以放在公司了。说实话这个能力挺顺手的,尤其是跑长任务的时候,不用担心断连丢上下文。但感觉官方也没怎么宣传,社区讨论也不多 有同样场景的其他方案的可以聊聊,看看大家还有什么黑科技。 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 19:19:29+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 GitHub - Hittopu/okfa-one-keyboard-for-all: okfa - one keyboard for all · GitHub 可以实现mac/windows的键盘一键切换成另外一台windows的键盘,可以实现在工位偶尔在另一台电脑上输入nvidia-smi的方便操作,也间接的实现了(mac键盘打瓦) 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 18:16:07+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 我做了一个开源小工具:M2M 它可以把网易云、QQ 音乐、酷狗、酷我的公开歌单迁移到 Apple Music。 在线体验: https://m2m.xinyu017722.workers.dev/ GitHub: GitHub - cunyu-wxy/M2M · GitHub 目前支持: 粘贴歌单链接自动识别平台 解析歌名、歌手、专辑和顺序 浏览器内连接 Apple Music 自动创建 Apple Music 歌单并导入歌曲 显示导入成功、失败和失败原因 不需要注册账号 后端不保存 Apple ID 或个人资料库数据 支持 Cloudflare Workers 自部署 这个项目的定位比较明确:中文音乐平台 → Apple Music。 目前还有一些限制,比如 Apple Music 匹配可能不准,酷狗部分分享页只能拿到预览曲目。如果你有解析失败的歌单链接,欢迎提 issue 或 PR,如果大家感兴趣欢迎多多fork哦。 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 17:40:46+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 项目地址 背景 阿里云百炼最近搞活动,每个模型给 1000 万免费 tokens,至少18 个模型,包含qwen3.7,qwen3.6 系列模型。但问题来了:单个模型额度用完就停了,手动切换模型id太麻烦。于是写了个本地反代,自动在模型池里轮换,客户端无感知。 做了什么 一个基于 Hono.js 的反向代理服务: - 客户端只配一个代理地址 + 一个 key - 真实 API Key 和模型池都在服务端隐藏 - 当前模型额度耗尽 → 自动切换下一个模型 - 当前账号所有模型用完 → 自动切换下一个账号(支持多 `DASHSCOPE_API_KEYS`) - 兼容 Anthropic 和 OpenAI 协议,Claude Code CLI、Pi CLI、OpenAI SDK 都能直接用 - 数据都在本地,隐私很安全 自动切换机制 - 单个模型额度耗尽时,代理自动切换到下一个模型,客户端无需修改任何配置 - 配置多个 `DASHSCOPE_API_KEYS` 可支持多账号,当前账号所有模型额度用尽后自动切换到下一个账号 - 所有切换过程对客户端透明,通过统一的 `PROXY_API_KEY` 访问即可 当前配置的模型 ID: qwen3.7-max-2026-06-08 qwen3.7-plus-2026-05-26 qwen3.7-plus qwen3.7-max-preview qwen3.7-max qwen3.7-max-2026-05-20 glm-5.1 kimi-k2.6 qwen3.7-max-2026-05-17 deepseek-v4-flash deepseek-v4-pro qwen3.6-27b qwen3.6-max-preview qwen3.6-flash qwen3.6-35b-a3b qwen3.6-flash-2026-04-16 qwen3.6-plus qwen3.6-plus-2026-04-02 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 10:20:14+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 CainFlow 项目背景 没找到比较好用的调用API进行生图的节点式的工具,很多在线的画布都不支持设置API,还有一些个人制作的软件感觉操作手感怪怪的 有一些是体积大,有一些是卡顿,索性使唤AI开发了一个。 项目简介 CainFlow 是一款受 ComfyUI 启发的轻量级节点式的调用API的绘图工具。前端用的js和css,后端用python 作用: 支持google和openai两种API格式的图片生成或者对话 有图片对比 良好的历史记录功能 有自动重试功能 完成后可以有音效提示 节点式操作 可以搭建属于自己的工作流 有一定的视频生成能力(测试的比较少) 好看的界面,粉色主题 本地保存工作流与历史数据,默认不依赖云端托管 内置工作流管理、媒体恢复、下载、更新和日志能力 提供 Windows 和macos两个版本 项目本身还有很多可以打磨和优化的空间,欢迎感兴趣的大佬一起探讨、指正。 项目开源地址: GitHub - RingoCaviar/CainFlow: 节点式简易本地API请求画图工具 · GitHub Readme已添加友链 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 09:45:28+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 不知道各位佬有没有听过这样一个概念 上班“ 摸鱼时间 ”换来的钱 才是“ 赚 ”的 剩余的全是等价交换。 于是我就想,怎么才能记录记录我“ 赚 ”的钱呢? Codex启动~ 经过多轮友好协商讨论,于是乎: GitHub - ChengX3/MoYuMei: MoYuMei 一款macOS上的摸鱼统计工具 每秒计算薪资 按照摸鱼/搬砖状态计算到底今天“赚”多少钱 · GitHub 展示区域: 看完图图后简单说一些有哪些设计在里面吧 1.想测试?但懒得设置摸鱼/搬砖软件? 简单!内置了一些常见的软件名单 可以在设置页面一键复用(会根据你本地电脑是否安装 才会真正导入) 2.主界面的FUCK是什么意思?你骂我? 真不是啊!这个FUCK按钮是加班模式的开启,毕竟谁加班不想说上一句FUCK!呢? 我甚至还贴心的加入了 无偿 模式 3.原理是什么?老东西都交出来! 交!原理就是监控台前应用是什么,然后记录时间。剩下的就是算账啦 ------------人格分割线----------------- 好了不皮了,做这个其实很简单都是codex在做,我只需要说出我的想法以及协助他测试。相信大家也可以在AI的浪潮下多多验证自己的想法,比较现在做一款软件/网页/app门槛很低,说不定你随手Vibe的项目就是某些人需要的呢? PS:本项目仅限macOS用户测试使用,并非多端项目,请见谅 ** 学AI,上L站!** 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 00:36:32+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 我用 flutter 做了一个开源的语音生成 app,主要还是利用了目前小米免费的 mimo 语音生成模型并利用 ai 对需要生成的语音文字进行打标签和润色。当然需要填你自己的 MIMO 的 API,和用于润色这个文字的 AI 模型的 API。 开源官网: https://shenghui.cloudlark.net/ 开源仓库: https://github.com/FuKun0113/shenghui-ai-voice-studio 软件截图: 1 个帖子 - 1 位参与者 阅读完整话题