artcraft_router深度解析:ArtCraft路由层如何调度6家供应商的生成请求

📅 发布时间:2026/10/10 12:59:05
artcraft_router深度解析:ArtCraft路由层如何调度6家供应商的生成请求
artcraft_router深度解析ArtCraft路由层如何调度6家供应商的生成请求【免费下载链接】artcraftArtCraft is an intentional crafting engine for artists, designers, and filmmakers项目地址: https://gitcode.com/GitHub_Trending/ar/artcraftArtCraft 是一款面向艺术家、设计师和电影制作人的 AI 创作 IDE而artcraft_router正是它的路由中枢一个用 Rust 编写的生成请求路由层负责把用户在界面里点击的一次生成精准调度到 ArtCraft 自研、Midjourney、Fal、GmiCloud、Grok、Kinovi、World Labs 等 6 家 AI 供应商背后覆盖图像、视频、音频、3D 模型与 3D 世界五大生成类型。路由层是什么一次生成的交通指挥中心普通用户只看到选择模型 → 填写提示词 → 生成三步但背后要回答三个问题问题路由层的回答请求发给谁由RouterProvider决定供应商模型认不认这些参数由参数校验与失配缓解策略处理要花多少钱、失败了算什么错由两阶段成本估算与统一错误体系兜底路由层位于 crates/api_clients/artcraft/artcraft_router/与各个供应商客户端 crate 平级是连接业务请求与供应商 API的防腐层。7 个路由目标供应商枚举一览所有可路由的供应商都集中在一个枚举里见 router_provider.rspub enum RouterProvider { Artcraft, // ArtCraft 自研模型FLUX、GPT Image、Nano Banana、Seedream… Midjourney, // 直连 Midjourney 官方 Fal, // Fal.ai 聚合平台同一模型的第二条通道 GmiCloud, // GMI Cloud GrokApi, // Grok Imagine / Grok Video KinoviWeb, // Kinovi 订阅通道Midjourney、Seedream、Seedance WorldLabs, // World Labs Marble 3D 世界生成 } 关键设计同一个模型可以有多条供应通道。比如 Midjourney 7 既能走 ArtCraft 自己的网关也能走 Kinovi 订阅通道GPT Image 既能走 ArtCraft也能走 Fal。用户无需关心差异路由层统一收敛。目录结构五大模块各司其职artcraft_router/src/ ├── api/ # 路由层的统一类型供应商、模型、分辨率、宽高比… ├── client/ # 供应商客户端的聚合与构建 ├── errors/ # 跨供应商错误归一化 ├── generate/ # 五类生成的调度核心 │ ├── generate_image/ # 图像生成16 个模型 │ ├── generate_video/ # 视频生成25 个模型 │ ├── generate_audio/ # 音乐/音效生成 │ ├── generate_mesh/ # 3D 模型生成 │ └── generate_splat/ # 3D 世界Gaussian Splat生成 └── utils/ # 媒体下载等工具模型清单本身也是枚举router_image_model.rs 定义了 FLUX、GPT Image、Nano Banana、Seedream、Midjourney 等 20 余个图像模型视频、音频、3D 模型各有对应枚举全部带 serde 序列化可直接在前后端之间传递。核心调度build2() 如何分发一个请求调度的心脏是每个生成类型里的 RequestBuilder。以图像为例generate_image_request_builder.rs 收集了模型、供应商、提示词、参考图、分辨率、宽高比、质量、批量数等全部参数然后调用build2()pub fn build2(self) - ResultImageGenerationDraftOrRequest, ArtcraftRouterError { match (self.provider, self.model) { (RouterProvider::Artcraft, RouterImageModel::Flux1Dev) build_artcraft_flux_1_dev(self), (RouterProvider::Fal, RouterImageModel::GptImage2) build_fal_gpt_image_2(self), (RouterProvider::KinoviWeb, RouterImageModel::Midjourney8) build_kinovi_midjourney_8(self), ... _ self.unsupported_provider_and_model(), // 未组合 明确报错 } }这个(供应商, 模型)二元组匹配表就是整个路由层的路由表每个组合一个专属构建函数参数校验、定价、发送逻辑互不干扰未注册的组合直接报错而不是静默猜测避免把请求发到错误的地方视频、音频、3D 模型、Splat 世界全部复用同一模式视频侧见 generate_video_request_builder.rs。两阶段流水线先估算后发送build2()的返回值是一个二选一的结构image_generation_draft_or_request.rs分支含义适用场景Request立即可发送的完整请求供应商直接接收媒体 token无需预处理如 ArtCraft 通道Draft尚未就绪的草稿供应商需要先下载并转传媒体文件如 Kinovi 通道完整生命周期如下RequestBuilder │ build2() ▼ DraftOrRequest ├─ Draft ──► estimate_cost() ← 发送前给出报价 │ finalize(context) ← 上传媒体、解析 token │ └─► Request ──► estimate_cost() ──► send_request() └─ Request ────────────────────────────┬──────────────────────────┘ ▼ GenerateXxxResponse 这个设计的用户价值价格在扣费前可见。Draft 阶段的estimate_cost()用规划中的分辨率、时长、批量数即可出价不必真的调用供应商 API——界面里生成前显示的价格就来自这里。参数失配缓解策略优雅降级而不是直接失败用户选了720p 5 秒 批量 4但某供应商模型只支持到 1080p×8 秒怎么办路由层没有硬编码报错而是引入了失配缓解策略request_mismatch_mitigation_strategy.rsPayMoreUpgrade向上升级参数多付一点也要成功PayLessDowngrade向下降级参数省钱优先ErrorOut宁可失败也不妥协。配套的reject_unsupported_option见 reject_unsupported.rs在ErrorOut下报错、其他策略下静默丢弃不支持的选项。此外还有GenerationModeMismatchStrategy当只支持文生图的模型收到参考图时可以选择中止生成AbortGeneration或忽略参考图继续GenerateAnyway。⚖️ 策略化而不是写死让同一份请求在不同业务场景下行为可配。供应商客户端聚合MultiRouterClient所有供应商客户端由构建器按需装配multi_router_client_builder.rsMultiRouterClientBuilder::new() .set_artcraft_client(...) .set_kinovi_web_client(...) .build(); // 未设置的供应商 不可用调用时明确报 ClientNotConfiguredmulti_router_client.rs 把 7 个客户端收进一个结构体每个都是Option——没配置凭据的供应商不会被误用router_client.rs 再提供单供应商或聚合两种形态的统一取值入口业务代码无需感知差别。依赖关系也可以从 Cargo.toml 看出路由层依赖全部 7 个供应商客户端 crate是名副其实的调度总入口。统一错误体系把各家报错翻译成同一种语言各供应商的错误格式五花八门路由层用 artcraft_router_error.rs 归一化pub enum ArtcraftRouterError { Client(...), // 客户端未配置/参数不支持 Download(...), // 媒体转传失败 UnsupportedModel(...), // 模型未注册 InvalidInput(...), // 非法输入 Provider(...), // 供应商业务错误 ProviderBillingError(...),// 供应商计费错误欠费/需订阅 } 亮点是计费错误的自动识别Midjourney 的需要订阅、Fal 的欠费、Kinovi 的计费错误、ArtCraft 的 402 Payment Required都会被FromProviderError统一提升为ProviderBillingError前端据此弹出充值/订阅引导而不是显示一条生涩的 API 报错。扩展一个新供应商要做什么官方在 AGENTS.md 里写明了五步扩展流程在providers/{供应商}/{模型}/下建模块build.rs参数规划、cost.rs定价、request.rs发送需要媒体预处理的再加draft.rs在供应商mod.rs注册模块在 Draft / Request 两个枚举中加变体在 RequestBuilder 的build2()分发表中加一行(Provider, Model)匹配补全build与cost的单元测试。这种表驱动 每组合一文件的布局让 6 家供应商、60 个模型的代码互不污染新增一条通道只需在路由表里加一行。总结路由层给创作者的三重保障能力用户感知(供应商, 模型)精确分发选哪个模型都走对通道不浪费积分Draft 两阶段 成本预估算生成前看到准确报价扣费心里有数失配缓解 统一错误参数不兼容时优雅降级报错清晰可懂artcraft_router用约 600 个源文件把调用谁、怎么传参、花多少钱、出错怎么办四件事全部收敛在一层。对创作者而言这正是 ArtCraft 能把 60 个模型装进同一个界面的底气——你只管创作调度交给路由层。延伸阅读路由层总入口lib.rs视频生成两阶段设计文档AGENTS.md开发环境搭建dev_setup.md完整模型目录README.md【免费下载链接】artcraftArtCraft is an intentional crafting engine for artists, designers, and filmmakers项目地址: https://gitcode.com/GitHub_Trending/ar/artcraft创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考