
后端前端企业应用MCP 服务【免费下载链接】ever-gauzyEver® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co项目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy点击查看免费下载本文基于 ai-provider-gauzy-ai/README.md 与仓库源码剖析gauzy/plugin-ai-provider-gauzy-ai插件的设计定位它目前是一个注册到 Ever Gauzy AI Chat 引擎gauzy/plugin-ai-chat提供者注册表中的占位符placeholder。读完本文你将理解该插件如何把gauzy-ai提供者注册进AiProviderRegistry并呈现在 UI 中、为什么createModel会主动抛错、GAUZY_AI_API_KEY/GAUZY_AI_BASE_URL两个环境变量的真实归属以及 Gauzy AI 服务端路由代理的未来规划与 BYOK自带密钥机制的关系。插件定位一个看得见、用不了的占位提供者gauzy/plugin-ai-provider-gauzy-ai是 Ever Gauzy AI Chat 引擎gauzy/plugin-ai-chat的 AI 提供者插件。从 package.json 的描述可以看出它的真实状态registers the Gauzy AI provider placeholder with the gauzy/plugin-ai-chat provider registry (chat routing through Gauzy AI is not implemented yet)也就是说它目前并不提供任何真实的对话能力只承担两件事在插件启动bootstrap时把gauzy-ai这个提供者注册到 Chat 引擎的AiProviderRegistry使它在注册表和 UI设置页的提供者目录中可见明确宣告该提供者尚未实现——createModel会抛出异常且不暴露任何模型。这样做的设计意图是让 Ever Gauzy 的架构从第一天起就拥有 Gauzy AI 这个稳定的提供者 ID 与 UI 入口但避免把尚未实现的通道暴露给用户造成误用。在它真正落地之前应当改用直接提供者插件gauzy/plugin-ai-provider-anthropic、gauzy/plugin-ai-provider-openai、gauzy/plugin-ai-provider-openrouter、gauzy/plugin-ai-provider-vercel-gateway。注册链路从插件生命周期到静态注册表该插件的实现非常精简核心只有两个文件ai-provider-gauzy-ai.plugin.tsai-provider-gauzy-ai.provider.ts插件类一行定义即完成注册import { GauzyCorePlugin as Plugin } from gauzy/plugin; import { BaseAiProviderPlugin } from gauzy/plugin-ai-chat; import { gauzyAiProviderDefinition } from ./ai-provider-gauzy-ai.provider; Plugin({}) export class AiProviderGauzyAiPlugin extends BaseAiProviderPlugin { protected readonly definition gauzyAiProviderDefinition; }插件类继承自BaseAiProviderPlugin定义见 base-ai-provider.plugin.ts这个抽象基类为所有gauzy/plugin-ai-provider-*插件统一了生命周期行为onPluginBootstrap(): void | Promisevoid { AiProviderRegistry.register(this.definition); // ... } onPluginDestroy(): void | Promisevoid { AiProviderRegistry.unregister(this.definition.id); // ... }即启动时注册、销毁时注销插件作者只需要提供一份IAiChatProviderDefinition定义即可无需关心 Chat 模块的 Nest 依赖图。注册表进程级静态 MapAiProviderRegistry见 provider-registry.ts是一个静态注册表而非 Nest DI 注入这样提供者插件无需导入 Chat 模块的依赖图与后端插件通过扁平的plugins.ts列表组合的方式保持一致static register(definition: IAiChatProviderDefinition): void { ... } static unregister(id: string): void { ... } static get(id: string): IAiChatProviderDefinition | undefined { ... } static list(): IAiChatProviderDefinition[] { ... } // 按 order 升序排序register在 ID 已存在时会打出一条替换警告was already registered — replacinglist()按order字段升序排列未设置order的排在最后Chat 引擎在请求时读取该注册表来解析提供者。因此只要AiProviderGauzyAiPlugin出现在 Ever Gauzy 的插件组合列表后端plugins.ts中gauzy-ai就会出现在提供者目录与 UI 中——但它并不是一个可用的聊天提供者。提供者定义源码剖析字段逐一解读gauzyAiProviderDefinition 实现了 Chat 引擎定义的IAiChatProviderDefinition契约完整契约见 provider.types.ts其关键字段如下字段当前值含义idAiProviderEnum.GAUZY_AI即gauzy-ai注册表、UI 与 BYOK 凭证共用的稳定提供者 ID定义于 ai-chat.model.tslabelGauzy AIUI 中展示的人类可读名称apiKeyEnvVars[]空数组服务端 API Key 环境变量列表刻意留空chatCapablefalse明确标记不具备聊天能力独立于凭证是否存在的开关baseUrlEnvVarGAUZY_AI_BASE_URL可选的自定义 Gauzy AI API Base URL 环境变量models[]不暴露任何模型defaultModel无默认模型order10注册表升序排序时排在最前数值小优先websiteUrlhttps://gauzy.ai设置页展示的提供者主页apiKeysUrlhttps://app.gauzy.ai获取 API Key链接createModel总是抛错见下文刻意抛错设计为什么apiKeyEnvVars被刻意留空源码注释记录了一个重要的历史教训apiKeyEnvVars曾经是[GAUZY_AI_API_KEY]这会让该提供者把自己报告为configured: true已配置。但问题在于GAUZY_AI_API_KEY实际上属于另一个无关插件gauzy/plugin-integration-ai配置定义见 integration-ai/src/lib/config/gauzy-ai.ts该文件同时使用GAUZY_AI_GRAPHQL_ENDPOINT、GAUZY_AI_REST_ENDPOINT、GAUZY_AI_REQUEST_TIMEOUT、GAUZY_AI_API_KEY、GAUZY_AI_API_SECRET等变量。也就是说任何使用 integration-ai 集成的运维人员都会无意中让这个不可用的聊天提供者看起来可用。再加上order: 10注册表升序排序第一名它甚至可能赢得默认选择然后每一轮对话都因 not implemented yet 失败。因此源码明确注释只有在createModel真正返回真实模型的那次改动中才应恢复该环境变量。chatCapable: false能力与凭证是两个独立问题清空apiKeyEnvVars只能堵住环境变量这一条路。因为凭证解析是**租户优先tenant-first**的一个租户如果在 BYOK 设置页手动保存了 Gauzy AI 的密钥该提供者仍会被标记为configured、赢得默认选择排序第一随后每轮对话都失败。所以chatCapable被设计为独立于凭证的能力开关见 provider.types.ts 中对该字段的文档注释在createModel返回真实模型之前该字段必须保持false。createModel刻意抛错async createModel(_modelId: string, _credentials: IAiProviderCredentials): Promisenever { throw new Error( Chat via Gauzy AI is not implemented yet — configure another provider. See gauzy/plugin-ai-provider-gauzy-ai README. ); }createModel的返回类型是Promisenever——永远不返回只抛异常。这是占位符最直接的表现Chat 引擎一旦为该提供者创建模型就会收到明确的错误提示指引用户配置其他提供者。环境变量两个保留变量及其真实归属原文档给出的环境变量如下变量描述GAUZY_AI_API_KEY服务端级 Gauzy AI API Key为未来保留GAUZY_AI_BASE_URL可选的 Gauzy AI API 自定义 Base URL需要特别说明的是它们的真实归属GAUZY_AI_API_KEY当前实际被gauzy/plugin-integration-ai的配置读取见 integration-ai/src/lib/config/gauzy-ai.ts用于该集成而非本聊天提供者。本插件将其标记为reserved for future use为未来保留——这正是其apiKeyEnvVars被清空的原因。GAUZY_AI_BASE_URL被本插件声明为baseUrlEnvVar为将来指向自定义 Gauzy AI API 端点预留。也就是说现阶段不要为gauzy-ai提供者配置任何上游 API Key——它没有任何模型可调用配置了反而会在 UI 中造成已配置的假象。规划中的设计服务端代理路由原文档明确给出了该插件的未来设计Planned design当租户启用了 Gauzy AI 集成gauzy/plugin-integration-ai时gauzy-ai提供者的聊天请求将被代理到 Gauzy AI API。由 Gauzy AI 服务端统一负责上游提供者 API Key 的管理租户无需配置任何上游密钥模型选择与路由model selection and routing服务端侧的模型编排。这样做的收益是租户无需配置任何上游提供者密钥即可获得聊天能力密钥的保存、选择与路由全部收敛到服务端。BYOK 机制与代理路由的关系原文档同时强调BYOK自带密钥机制保持不变——租户通过/api/ai-chat/credentials接口对应 ai-provider-credential.controller.ts 的GET/PUT/POST /credentials端点按租户保存密钥用于直接提供者anthropic、openai、openrouter 等。凭证的保存与加密逻辑见 ai-provider-credential.service.ts每个(tenant, provider)一行、API Key 加密存储、isDefault标记聊天默认提供者、isVoiceDefault标记语音/听写默认提供者实体定义见 ai-provider-credential.entity.ts。凭证解析的优先级是租户优先先解析租户 BYOK 密钥其次才是服务端环境变量IAiProviderCredentials.source为tenant | environment | platform见 provider.types.ts。因此对于直接提供者租户密钥始终优先于服务端环境变量——这一优先级在 Gauzy AI 代理落地后也不会改变。当前应如何使用改用直接提供者在 Gauzy AI 聊天路由实现之前正确的使用方式是启用直接提供者插件gauzy/plugin-ai-provider-anthropicgauzy/plugin-ai-provider-openaigauzy/plugin-ai-provider-openroutergauzy/plugin-ai-provider-vercel-gateway它们各自实现自己的createModel通常惰性导入 ESM-only 的 Vercel AI SDK 提供者包见 provider.types.ts 中createModel的约定并可通过以下任一方式配置凭证租户 BYOK租户在 AI Chat 设置页保存自己的上游密钥经/api/ai-chat/credentials优先级最高服务端环境变量运维人员为整个实例设置服务端级 API Key。小结gauzy/plugin-ai-provider-gauzy-ai是 Ever Gauzy AI Chat 引擎中一个先占位、后实现的提供者插件它通过BaseAiProviderPlugin生命周期把gauzy-ai提供者注册进进程级AiProviderRegistry让其在 UI 中可见apiKeyEnvVars清空、chatCapable: false、createModel抛错三个机制共同确保它不会被误配置、误选为默认后导致每轮对话失败GAUZY_AI_API_KEY目前归属gauzy/plugin-integration-ai仅为该聊天提供者保留未来它将把租户聊天请求代理到 Gauzy AI 服务端统一管理上游密钥、模型选择与路由同时 BYOK 机制与租户密钥优先于环境变量的解析顺序保持不变。对开发者和运维人员而言现阶段的关键结论是把gauzy-ai提供者当作 UI 占位符看待实际对话请选择并配置一个直接提供者插件当createModel返回真实模型时同时会恢复GAUZY_AI_API_KEY环境变量它才会成为开箱即用的服务端路由通道。赞分享后端前端企业应用MCP 服务【免费下载链接】ever-gauzyEver® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co项目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy点击查看免费下载相关推荐Ever® Gauzy™ 嵌入式 AI Agent 聊天后端 gauzy/plugin-ai-chat 完全指南端点、安全模型与多提供商架构Ever® Gauzy™ 嵌入式 AI Agent 聊天后端 gauzy/plugin ai chat 完全指南端点、安全模型与多提供商架构 Ever® G后端前端企业应用MCP 服务flame_forge2d 物理引擎接入指南在 Flame 中使用 Forge2DBox2D构建真实物理世界flame_forge2d 物理引擎接入指南在 Flame 中使用 Forge2DBox2D构建真实物理世界 导读 本文围绕 flame_forge2d后端前端企业应用MCP 服务VidBee 免费视频下载工具实操从单条视频到自动追更频道的三种玩法VidBee 免费视频下载工具实操从单条视频到自动追更频道的三种玩法 VidBee 是一款免费开源的视频下载工具桌面端可以把 YouTube、TikTok、后端前端企业应用MCP 服务上一篇MathModelAgent License指南如何免费使用这款数学建模Agent个人与商用授权完整说明下一篇Ultimate Plumber安全加固限制命令执行权限的沙箱实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考