FinOS AI 上线实录。一个把「企业经营与风险研判」做成开源 AI 工作台的真实记录用一句话让 AI 做全库体检修掉 11 类真实缺陷再从代码走到一个别人能点开的在线应用。写在前面为什么值得记录现在聊「AI 写代码」的文章十个里有九个停在「你看它给我生成了一个页面」。生成页面这事坦率的讲早就不稀奇了。真正难的地方在别处。你把这个东西推到线上要让一堆不认识的人能点开、能用、敢用问题就全冒出来了。尤其是 FinOS AI 要干的活是企业财务、授信尽调、风险判断这种「错一次代价很高」的场景。写错一行代码、页面丑一点没人会死。但要是一个风险结论引错了资料或者一家公司的数据漏给了另一家公司那是要出事的。所以这篇我不聊怎么把功能写出来我想聊聊怎么让它不出错。一个系统从「能跑」走到「值得托付」中间隔着的最后那一公里到底长什么样。具体来说就三件事。被一句话触发的全仓库体检一轮界面可用性的打磨还有把它真的发布成一个别人能点开的在线应用。技术读者能看懂只想弄明白这玩意能干嘛的普通朋友也能看懂。我尽量说人话。一、这次开发是在哪做的COSMO Code先说场地不然后面几章容易看迷糊。COSMO Code是卡奥斯 COSMOPlat 开源社区做的一个AI 智能开发平台。COSMOPlat 你可能没听过它是海尔旗下的工业互联网平台。一句话0 代码5 分钟AI 帮你搓出能跑的应用。说实话我一开始是有点怀疑的。「0 代码 5 分钟」这种话过去几年被喊烂了多数最后都是个玩具。但这次我用下来感受是真不一样。传统方式是你先在本机把 Node、Python、数据库装一遍环境折腾半天再打开编辑器敲代码。COSMO Code 不是这套逻辑你直接用中文把需求讲清楚AI 去生成代码、修 bug、迭代功能你就在对话里一句一句把它盘明白。开发要用的东西平台都给你备好了。独立 VM本机一个依赖都不用装。Web 终端构建、启服务、查日志全在浏览器里。文件管理器仓库文件直接看直接改不用另开 IDE。跑起来就自动分你一个公网链接域名证书都不用操心。而对我这篇文章影响最大的一点是后面三章讲的破事全都发生在这一个平台里。排错在它的对话窗口里。发布在它的控制台里。UI 优化还是在它的仓库里改完、构建、生效。从读代码到改代码再到上线我本地一个依赖都没装过。二、FinOS AI 是什么先把这个项目本身说清楚。FinOS AI 是一个面向企业经营与风险研判的开源金融服务 Agent版本 2.2.1MIT 协议代码全在 GitHub 上。用大白话讲它干的事是把散在 PDF、Word、Excel、各种制度文件和行业研究里的信息整理成一条能核验、能追溯的判断链路。为什么要有这么个东西。传统的企业尽调或者风险排查流程大概是这样。人先把资料翻一遍手动摘出关键事实再对着制度规则一条条比对写出一份风险清单最后交给负责人复核。资料在文档、表格、邮件之间来回搬搬到最后结论往往有个说不清的地方就是「你凭什么这么判断」。FinOS AI 想改的就是这个说不清。它给每个重要结论立了三条规矩。这个结论基于什么资料和事实证据要可回溯命中了哪条规则为什么这事构成风险规则要可解释谁核验过下一步该谁处理责任要可追踪。它的完整链路是这样的。边界也得说清楚。它不是个人记账软件也不替代授信、投资、法律、审计、合规任何一个负责人。系统提供的是信息分析和决策辅助不构成任何专业意见。这条底线产品里每一次交互都在重复声明。三、产品长什么样FinOS AI 的工作台是围绕企业金融这条主线做的。下面四张图都是真实跑起来的截图不是设计稿。1. 企业经营与风险决策台点进去的第一眼就是它。四个指标摆在那儿企业项目、研判资料、风险信号、平均完整度工作区是个什么状态一眼看清楚。中间那块 AI Readiness 面板标题写的是「建立真实研判链路」其实就是给了条最短的上手路径创建项目、接入模型、上传资料三步走完AI 才有东西可依才会开始给你干活。这里有个细节我挺想说的。截图里所有数字都是 0。这不是我截图截早了也不是 bug是刻意做的产品底线。系统不预置任何示例数据。没有企业没有资料没有风险没有结论。一切都得你自己录进去或者基于真实资料生成。我第一次看到那个空仪表盘的时候还愣了一下后来想明白了一个处理风险的系统预置一堆假数据给你看那才是灾难。2. 使用指引怕你不会用产品内置了一份交互式指引。3. 部署与合规准备这一页我第一次点开的时候有点意外。因为它很诚实。它明明白白把「开箱单机体验模式」和「企业生产模式」拆开讲了。前者适合本机自己评估但它不等同于企业身份源也不做共享设备的隔离。后者才需要接 SSO、五级权限、生产数据库和审计留存。页面底下还列了个「企业上线控制项」一句话提醒部署的人应用层做了组织、权限、审计这些控制并不自动等于一个通过了监管认证的 SaaS。这年头肯把这种话写在自己产品页面上的不多。4. 企业金融 Agent 中心四个职责明确的 Agent 在这儿编排。资料理解 Agent把文档读成结构化的事实。规则匹配 Agent做确定性的规则命中。风险研判 Agent生成风险清单。流程辅助 Agent把结论推给下一个处理人。这一页同样是零数据的诚实。没配置的时候它显示「研究链路尚未就绪」然后给你「配置模型 / 创建项目」的引导而不是伪造几条好看的运行记录糊弄你。四、排错实录我给 AI 发了一句话好重头戏来了。这也是我觉得「AI 辅助开发」真正有价值的场景。4.1 那句提示词我在 COSMO Code 的对话窗口里就发了一句话。看看这个项目是干什么的有没有 bug没了。没指定文件没给报错没限定范围。就是最普通的一句大白话跟随口问同事一样。下面这张是它当时的界面。4.2 AI 的「全身体检」发现了什么我以为它大概会泛泛回几句类似「这是个 Next.js 加 FastAPI 的项目结构挺清晰」这种场面话。结果它真把整个仓库读了一遍。从认证模块一路查到数据库迁移脚本最后给我摆出了 11 类真实缺陷。为了照顾两类读者每一项我都写成两段。一段大白话不懂技术的也能看明白。一段技术要点给要动手的人看。① Refresh Token 轮换缺陷续期后没真把旧钥匙作废登录凭证你就当它是一张会过期的门禁卡。到期该系统作废旧卡、发新卡但原来这版实现只记了一笔「旧卡被重复刷过」并没有真的把整串卡作废。卡要是被偷了小偷能一直刷下去。技术上refresh 轮换之后新的 jti 没持久化重放检测只记了事件没吊销令牌家族。② 跨租户数据越权一个「空值兜底」可能读错公司不同公司的数据必须彼此隔离这是底线。但一个不起眼的「取不到就返回空值兜底」逻辑可能让 A 公司读到 B 公司的快照。这种事出一回信任就没了。技术上企业快照去掉了空串回退规则创建补上了组织授权校验require_owned_resource。③ IPv6 的 SSRF 校验既漏放也误伤系统允许你自己填「自定义模型接口地址」。为了防有人借这个口子去探内网、摸云元数据必须做安全校验。原来那版 IPv6 判断既可能被绕过又会把合法地址误拒。技术上base_url-guard 现在完整处理 IPv6拒绝链路本地和保留地址同时不再误杀合法字面量。④ providerName 没做白名单一个特殊字符串就能让接口 500供应商类型不做白名单校验你传进去某些「特殊名字」程序会读到不该读的属性直接崩成 500。技术上PROVIDER_PRESETS[type] ?? custom 会命中原型链比如 constructor 这种已经补了白名单和非字符串输入兜底。⑤ save_strategies 返回值恒为 null还没落库就取编号新增一条记录你得先拿到它的编号才能接着往下走。但这段代码在记录还没真正写进数据库的时候就伸手去取编号拿回来的永远是空。技术上改成 flush 之后再取 id顺手修了 autoflushFalse 下的取值时机。⑥ Alembic 索引表名写错索引静默地没建建索引的脚本把表名写错了。偏偏脚本又写着「发现表不存在就跳过」于是它不报错、悄悄跳过关键索引根本没建起来。平时看不出来数据一多查询就慢。技术上修正了 governance_audit_logs 和 enterprise_rule_revisions 两个表名。⑦ 分页 limit 没有下界传个负数就能一次拉全表列表接口本该是「每页最多 100 条」。但有人传个负数进来比如 -1在 SQLite 里就等于「不限制」一次把整张表拉出来。技术上统一了 MAX_LIST_N 下界避免 LIMIT -1 全表扫描。⑧ SSE 流式调用没超时、没取消用户关了页面连接还在AI 流式回答的时候用户要是中途把页面关了后台那个请求还在傻等连接一个接一个堆着堆久了能把服务器拖垮。技术上给非流式分支补了 AbortSignal.timeout给流式分支接上 cancel顺便避免了错误分支二次 send。⑨ 密钥掩码只遮 1 位等于半公开展示 API Key 的时候本该只露头尾。原来对 9 到 11 位的密钥只藏了中间 1 位形同虚设。技术上maskApiKey 收缩了可见字符范围。⑩ 删除项目产生孤儿数据一个项目删掉了它底下挂的资料、风险、任务却没跟着删留下了一堆「没有归属」的记录在库里飘着。技术上删除时级联清理子资源。⑪ README 里的 Windows 安装命令写错文档里给 Windows 用户的安装命令是错的照着敲走不通。技术上修正了 README 里的 Windows 虚拟环境命令。4.3 修复、回归测试与一份「诚实清单」查出问题其实只是第一步。AI 接着就把这些都修了。而且它没只顾着修还给几个关键缺陷补上了回归测试比如「令牌重组之后不得再能刷新」「快照不得跨租户泄漏」确保同类的问题不会再犯。但真正让我有点意外的是接下来这一步。它没有拍着胸脯说「已经完美了」。在同一轮对话里它主动列了一份清单标题大概意思是「仍然存在、但我判断不属于阻塞性的加固项」。它自己招了这么几条。CSRF 的双提交校验当时其实没生效门控用的 Cookie 从来没签发过只有 SameSiteLax 在兜底。限流只取 X-Forwarded-For 最左边的值这个值可能被伪造的头绕过。生产环境还在跑 init_db 建表补列没完全交给 Alembic 迁移。生产的 /docs 和 /openapi.json 还敞着。模型配置的读写没加锁写盘也不是原子的极端并发下可能丢配置。我更想说的是后面这件事。这份「没修完的清单」紧接着就被它自己一条条关掉了。下一轮提交专门做了安全加固X-Forwarded-For 改成从右往左取第一个非可信代理地址CSRF 门控改用真实签发的 Cookie非本地环境关掉接口文档模型配置按用户串行化读写并原子落盘。这就是我觉得 AI 辅助开发最该有的样子。不只是能写而是能查、能认、能闭环。先说清楚哪些修了、哪些没修、为什么再一条条关掉。光这一条就比市面上大部分「AI 帮你写了个 demo」的演示值钱多了。五、让它真正跑起来守护进程和发布申请代码没问题了下一步是让它在线可访问。在 COSMO Code 的控制台里这一步要两个动作顺序还不能反。5.1 创建守护进程应用需要一个看门人保证服务一直活着挂了能自动爬起来。这叫守护进程在平台的「添加守护进程」里配置。关键配置就这几项。配置项取值说明start.sh 路径workspace 中的启动脚本内置的 start.sh 固定端口、幂等启动、限制堆内存防 OOM检测端口3000Web 服务端口后端 API 为 8300检查间隔3 分钟周期性探活失败重试3 次连续失败后重启启动超时60 秒超时判定为启动失败顺带一提项目里新加的 start.sh 和 stop.sh就是为这一步准备的。幂等启动、生产构建、限制堆内存、用 ss 提取 PID 来停止省得内存溢出和端口打架。顺序上有个事得注意守护进程是发布的前置条件。没有它服务不稳定在线发布申请那一步根本走不下去。5.2 申请应用发布看门人就位服务稳定在线了才能提交发布申请。表单要填的东西不少。网站名称、分类、URL、封面图、一句话描述、详细描述、核心亮点、使用方法最后勾上同意《用户协议》。提交完等管理员审核。审核通过之后这个应用就有了一个真实可访问的地址。在线体验 https://3000-4e7b136bf689da92.code.cosmoplat.cn到这一步一个从「本地能跑」到「别人能点开」的闭环才算真的闭上。六、最后一公里深色主题下的下拉框上线之前还有一类特别容易被忽视、但特别影响体验的问题。界面细节。产品的整体视觉是深色主题但表单里的下拉框用的是浏览器原生的 select。在深色背景下原生下拉一展开选项是浅色底加浅色字你不把鼠标悬上去基本看不清。要是数据为空下拉更是「一片空白」用户根本分不清是没数据还是页面坏了。用户的反馈也很直接。修复分两步走最后的下拉 UI 跟平台深色风格完全统一了。先说治标这一步先保证能看清。在全局样式里给 html、select、option 设 color-scheme: dark再显式指定选项的背景和文字颜色杜绝「文字要悬停才看得见」。同时给治理页、风险页的空下拉补上占位项没数据的时候就禁用然后提示「暂无项目 / 成员」。再说治本这一步统一观感。新写了一个平台自研的下拉组件 Select基于 Radix 的 DropdownMenu 做的外观跟表单控件完全一致弹出层用平台自己的深色令牌。但这里有个取舍。为了不破坏表单的原生语义它保留了一个 sr-only 的原生 select专门承载 name、required 这些表单行为。也就是说视觉焕然一新但提交逻辑和必填校验一点没动。然后 7 处原生 select一次性全换掉。这体现的是一种挺成熟的工程取舍。既要好看也不能为了好看把表单的原生行为给牺牲掉。用一个藏起来的原生控件兜住语义用一个自定义组件承接外观各干各的活。七、技术底座与安全边界撑起上面这一切的是这么一套技术栈。层技术前端Next.js 15、React 19、TypeScriptstrict、Tailwind CSS、Zustand、Framer Motion前端安全短期 Access Token仅驻留内存、HttpOnly Refresh Cookie、AES-256-GCM 凭据存储后端FastAPI、SQLAlchemy 2、Pydantic v2、Uvicorn文档处理Wordmammoth、PDFpdf-parse、图片视觉 OCR、Excel/CSV 表格结构、证据行号与坐标数据SQLite开发、PostgreSQL 16生产、Redis 7可选可降级部署Docker Compose、nginx、独立 Next.js 运行产物安全上有几条控制我想单独拎出来说。因为它直接关系到你敢不敢把真实的企业资料喂进去。密钥不落前端。模型 API Key 在服务端以 AES-256-GCM 加密保存返回浏览器的时候只给一个掩码。拒绝弱密钥启动。生产环境如果没配置、配得太短、或者还在用示例占位密钥直接拒绝启动而不是「降级运行」。这点我很喜欢宁可起不来也不要带着一个假密钥裸奔。出站访问受控。Webhook、模型 Base URL 这些出站地址拒绝本机、内网、保留地址和自动重定向防的是 SSRF。令牌最小暴露。Access Token 15 分钟而且只驻留内存Refresh Token 走 HttpOnly Cookie支持轮换和吊销。八、结语为什么这件事值得记录FinOS AI 的价值不在于它是「又一个 AI 应用」。它有意思的地方在于把三件现在很难凑到一起的事放在了同一个东西里。真实的场景。它不是在演示一个玩具 demo而是在处理企业财务、授信尽调、风险研判这类严肃业务。可核验的 AI。每个结论都能回溯到资料、事实、规则和复核人AI 的输出是可被追问的。诚实的工程态度。没有预置数据不编造结论不夸大能力连「哪些没修、为什么没修」都明明白白写出来。而这次开发里最打动我的反而是那句轻描淡写的提示词「看看这个项目是干什么的有没有 bug」。它没有什么魔法。背后是 AI 把整个仓库从头读到尾把 11 类真实缺陷一项项摆到台面上再修掉、再补上回归测试这样一个笨功夫的过程。顺带再说一句这一整套动作读代码、改代码、构建、发布全程都在 COSMO Code 这一个云端平台里完成我本地没装过任何依赖。代码写出来只是个起点。能不能查、敢不敢认、会不会闭环才决定一个系统值不值得托付。如果你也想体验一下欢迎去在线地址逛逛或者从 GitHub 把源码拉下来自己托管跑一遍。在线体验 https://3000-4e7b136bf689da92.code.cosmoplat.cn开源仓库 https://github.com/Leterhong/FinOS-AIFinOS AI 提供信息分析与决策辅助不构成投资、授信、法律、审计或合规意见。