在 Axum 应用中嵌入 mistral.rs:用 MistralRsServerRouterBuilder 将 LLM 推理 API 挂载进既有 Web 服务

在 Axum 应用中嵌入 mistral.rs:用 MistralRsServerRouterBuilder 将 LLM 推理 API 挂载进既有 Web 服务 在 Axum 应用中嵌入 mistral.rs用 MistralRsServerRouterBuilder 将 LLM 推理 API 挂载进既有 Web 服务【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs本篇技术指南讲解如何把 mistral.rs 的完整 HTTP 推理服务以子路径sub-path方式挂载进一个既有 Axum 应用使POST /v1/chat/completions等 OpenAI 兼容接口与业务路由共存于同一进程中。文中将围绕mistralrs-server-core提供的两个关键构造器MistralRsForServerBuilder与MistralRsServerRouterBuilder给出可直接复制的完整 Rust 代码并结合仓库源码逐项剖析 Builder 的全部可配置项、底层路由注册逻辑与自定义 Handler 的调用链帮助你在一小时内把文本生成、Embedding、工具调用、Agent 等能力集成进自己的 Web 后端。为什么需要把 mistral.rs 嵌入 Axum独立部署的mistralrs serve已经提供了完整的 OpenAI / Anthropic 兼容 API但在真实业务中你往往需要在同一进程中共享模型推理状态避免业务路由与推理服务之间的额外 HTTP 往返在自定义请求/响应格式下直接驱动模型而非局限于 OpenAI 形状的请求体复用既有 Axum 的中间件、鉴权、限流、观测体系让推理 API 与业务 API 走同一套治理设施。为此mistralrs-server-core把“创建推理引擎”与“生成 Axum Router”拆成了两个可组合的 Builder文档与源码给出了完全一致的模式先用MistralRsForServerBuilder构造引擎状态SharedMistralRsState再用MistralRsServerRouterBuilder从该状态生成一个 AxumRouter最后通过Router::nest挂到任意子路径下。对应的完整实现位于 mistralrs-server-core/src/mistralrs_for_server_builder.rs 与 mistralrs-server-core/src/mistralrs_server_router_builder.rs。两个核心构造器与共享状态类型MistralRsForServerBuilder引擎状态的生产者它负责完成设备初始化、模型加载、KV Cache 配置、PagedAttention 配置、ISQ 量化、调度器Scheduler配置等一系列工作最终产出// mistralrs-server-core/src/types.rs 中的类型别名 pub type SharedMistralRsState ArcMistralRs;SharedMistralRsState是整个嵌入方案的中枢它既被MistralRsServerRouterBuilder用来构造 Router也可以直接注入到你自己的 Axum Handler 中用于驱动底层推理请求。相关定义见 mistralrs-server-core/src/types.rs。MistralRsServerRouterBuilder路由的生产者它接收SharedMistralRsState返回一个配置好全部 API 路由、CORS、请求体上限、Agentic 默认参数的 AxumRouter。build()的返回类型就是axum::Router因此可以无缝参与Router::nest、Router::merge等标准组合操作。添加依赖在Cargo.toml中声明以下依赖[dependencies] anyhow 1 mistralrs-core 0.8 mistralrs-server-core 0.8 axum 0.8 tokio { version 1, features [full] }关键点这里不需要引入高层的mistralrscrate。因为MistralRsServerRouterBuilder直接接受来自mistralrs-core的ModelSelected枚举MistralRsForServerBuilder的内部实现如LoaderBuilder、MistralRsBuilder也全部基于mistralrs-core完成mistralrs-server-core只负责把它们组装成面向服务器的形态。这一点在文档中已明确说明也与源码中 mistralrs-server-core/src/mistralrs_for_server_builder.rs 的加载逻辑一致。将 mistral.rs 挂载到子路径完整代码以下代码完整来自 embed-in-axum.md并补充了逐步注释use axum::{Router, routing::get}; use mistralrs_core::{AutoDeviceMapParams, ModelDType, ModelSelected}; use mistralrs_server_core::{ mistralrs_for_server_builder::MistralRsForServerBuilder, mistralrs_server_router_builder::MistralRsServerRouterBuilder, }; #[tokio::main] async fn main() - anyhow::Result() { // 1. 声明要加载的模型这里是 Hugging Face 上的 Qwen3-4B let model ModelSelected::Plain { model_id: Qwen/Qwen3-4B.into(), tokenizer_json: None, arch: None, dtype: ModelDType::Auto, topology: None, organization: None, write_uqff: None, from_uqff: None, imatrix: None, calibration_file: None, max_seq_len: AutoDeviceMapParams::DEFAULT_MAX_SEQ_LEN, max_batch_size: AutoDeviceMapParams::DEFAULT_MAX_BATCH_SIZE, hf_cache_path: None, matformer_config_path: None, matformer_slice_name: None, }; // 2. 构建推理引擎状态SharedMistralRsState ArcMistralRs let shared_mistralrs MistralRsForServerBuilder::new() .with_model(model) .with_in_situ_quant(4.to_string()) // 就地量化到 4-bit省略则以未量化方式运行 .build() .await?; // 3. 从引擎状态构建完整的 Axum Router含全部 API 路由 let mistralrs_router MistralRsServerRouterBuilder::new() .with_mistralrs(shared_mistralrs) .build() .await?; // 4. 与自己的业务路由组合并挂载到 /ai 子路径 let app Router::new() .route(/, get(|| async { My app })) .nest(/ai, mistralrs_router); let listener tokio::net::TcpListener::bind(0.0.0.0:3000).await?; axum::serve(listener, app).await?; Ok(()) }挂载之后POST /ai/v1/chat/completions的行为与独立启动的 mistral.rs 服务器完全一致其余路由Embedding、模型列表、健康检查等也一并生效。ModelSelected::Plain 字段说明ModelSelected::Plain对应从 Hugging Face 直接加载的普通文本模型字段含义如下字段含义model_idHugging Face 仓库 ID如Qwen/Qwen3-4B或本地路径tokenizer_json自定义分词器 JSON 路径None时从模型仓库自动获取arch手动指定架构名None时自动探测dtype加载精度ModelDType::Auto表示按设备自动选择topology设备拓扑配置多卡/张量并行单卡可留NoneorganizationHF 组织名用于部分模型加载场景write_uqff/from_uqffUQFF统一量化文件格式的写出/读入路径imatrix校准数据矩阵文件路径用于部分量化方法calibration_file在线校准使用的校准数据集文件max_seq_len/max_batch_size最大序列长度与批大小默认取AutoDeviceMapParams的常量hf_cache_path覆盖 HF 缓存目录matformer_config_path/matformer_slice_nameMatFormer 模型如 Gemma 3N的配置相关字段关于 with_in_situ_quant 与 ISQwith_in_situ_quant(4)会对模型应用 ISQIn-Situ Quantization就地量化到 4-bit。ISQ 是 mistral.rs 内置的量化流程不需要预先转换权重文件加载后直接在内存中完成量化。量化位数的写法4、8等会在 mistralrs-core 的 isq_setting 中被解析成具体的量化策略。想了解 ISQ 的完整使用方式含在线校准、混合量化专家等进阶选项可参考 examples/python/isq.py 与 mistralrs-quant/src/isq_executor.rs。省略该调用即可按未量化精度运行显存充足时推理质量与速度通常更优。路由行为验证底层注册了哪些接口MistralRsServerRouterBuilder::build()最终调用init_routermistralrs-server-core/src/mistralrs_server_router_builder.rs一次性注册数十条路由全部集中在 mistralrs-server-core/src/route_registry.rsOpenAI 兼容POST /v1/chat/completions、POST /v1/completions、POST /v1/embeddings、GET /v1/models、POST /v1/images/generations、POST /v1/audio/speech、POST /v1/responses及其{response_id}查询/取消/删除、/v1/files文件管理、/v1/skills技能管理Anthropic 兼容POST /v1/messages、POST /v1/messages/count_tokensmistral.rs 特有/health、/、POST /re_isq、/calibration/start、/calibration/status、/calibration/apply、模型卸载/重载/状态/调优、系统信息与诊断、Session 管理等。此外 Router 还配置了fallback与method_not_allowed_fallback当请求路径落入/v1命名空间但路由不存在或方法错误时会根据请求头如anthropic-version自动返回 OpenAI 或 Anthropic 风格的错误 JSON——这一行为在 mistralrs_server_router_builder.rs 的测试模块 中有明确的单元测试覆盖。Builder 选项详解MistralRsServerRouterBuilder 的全部选项原文档列出的选项在源码中均有对应实现mistralrs-server-core/src/mistralrs_server_router_builder.rs并附有若干源码中额外暴露的方法方法作用默认行为with_mistralrs(SharedMistralRsState)注入推理引擎状态必填缺失时build()直接报错with_include_swagger_routes(bool)是否挂载 Swagger UI/docs与 OpenAPI 规范/api-doc/openapi.json仅在swagger-uifeature 开启时可用默认truewith_base_path(str)为 Swagger 路由设置前缀默认无前缀with_allowed_origins(VecString)限制 CORS 允许来源默认AllowOrigin::any()即允许所有来源with_max_body_limit(usize)请求体上限字节默认DEFAULT_MAX_BODY_LIMIT即 50 MiB50 * 1024 * 1024见源码第 68-74 行with_max_tool_rounds(usize)Agentic 循环的默认最大工具调用轮数可为None不限with_tool_dispatch_url(String)服务端工具执行的 POST 目标 URL默认无with_agent_permission(AgentPermission)Agent 工具的默认权限策略默认无权限限制with_code_execution_permission(CodeExecutionPermission)Python 代码执行的默认权限内部转换为AgentPermission见 源码 L234-L239默认无with_approval_broker(ApprovalBroker)注入审批代理配合 Agent 审批路由/v1/agent/approvals/{approval_id}使用默认空 Brokerwith_skills_dir(path)指定技能Skills存储目录默认SkillStore::default_root()with_observability_config(ObservabilityConfig)开启 Prometheus 指标并挂载/metrics默认关闭with_lora_adapter_api_config(LoraAdapterApiConfig)开启运行时 LoRA 适配器管理路由/v1/load_lora_adapter等默认从环境变量读取注意with_base_path只作用于 Swagger 路由前缀不影响业务 API 子路径——业务 API 的子路径由你调用Router::nest(/ai, ...)时自行决定。CORS 默认允许任意来源若你的应用直接暴露给浏览器前端建议显式调用with_allowed_origins收紧。MistralRsForServerBuilder 的引擎级选项原文档概括了引擎级选项源码mistralrs-server-core/src/mistralrs_for_server_builder.rs中的完整集合更为丰富按用途分组如下模型与加载with_model(ModelSelected)单模型模式指定模型with_model_id_override(id)覆盖对外暴露的 API 模型 IDwith_model_config(ModelConfig)/with_model_configs(VecModelConfig)/add_model(id, model)/add_model_with_alias(id, alias, model)多模型模式build()会自动检测models非空并走多模型构建路径见 build 方法每个ModelConfig还可单独指定chat_template、jinja_explicit、max_model_len、num_device_layers、in_situ_quant、encoder_cache_memory_byteswith_default_model_id(id)请求未指定模型时使用的默认模型with_chat_template(...)/with_jinja_explicit(...)自定义聊天模板JINJA 模板优先级最高会覆盖其他模板with_hf_config_overrides(HfConfigOverrides)递归合并 HFconfig.json覆盖项with_max_model_len(usize)运行时上下文长度with_token_source(TokenSource)HF 鉴权 Token 来源支持literal:、env:、path:、cache、none五种格式默认cache见 defaults 模块。量化与设备with_in_situ_quant(String)/with_in_situ_quant_optional(OptionString)ISQ 就地量化with_device(Device)显式指定 Candle 设备否则按with_cpu与 seed 自动初始化with_cpu(bool)强制纯 CPU 运行with_num_device_layers(VecString)手动指定各 GPU 设备层数ORD:NUM;...语法省略时走自动设备映射set_paged_attn(Optionbool)语义特殊——None表示按设备默认CUDA 默认启用、Metal 默认禁用、CPU 不支持Some(true)强制启用Some(false)强制禁用见 源码 L620-L632with_paged_attn_gpu_mem(usize)/with_paged_attn_gpu_mem_usage(f32)/with_paged_ctxt_len(usize)/with_paged_attn_block_size(usize)/with_paged_attn_cache_type(PagedCacheType)PagedAttention 的 KV Cache 显存预算MB、显存占用比例CUDA 默认 0.9、总上下文长度、块大小CUDA 默认 32、缓存类型三者优先级为pa-ctxt-lenpa-gpu-mem-usagepa-gpu-mem。调度与运行时with_max_seqs(usize)最大并发序列数默认 16X-LoRA 等非粒度索引模型会自动降为 1with_max_num_batched_tokens(NonZeroUsize)PagedAttention 调度器单步最大批处理 token 数with_max_prefill_chunk_tokens(NonZeroUsize)/with_max_decode_steps_before_prefill(NonZeroUsize)prefill 分块与 decode 步数调度参数with_no_kv_cache(bool)禁用 KV Cachewith_prefix_cache_n(usize)设备上前缀缓存条数默认 16超出部分按 LRU 驱逐到 CPUwith_seed(u64)随机种子保证采样可复现with_log(String)将请求与响应全量记录到文件with_disable_eos_stop(bool)禁用 EOS 停止生成到max_len为止。Agent / 搜索 / MCP / 执行环境with_enable_search(bool)与with_search_embedding_model(...)/with_search_callback(ArcSearchCallback)启用 OpenAIweb_search_options兼容的搜索默认加载 EmbeddingGemma 重排序模型with_mcp_config(McpClientConfig)为模型挂载 MCP 客户端使其能调用 MCP 工具with_code_exec_config(CodeExecutionConfig)/with_shell_config(ShellConfig)启用 Python 代码执行与 Shell 执行能力配合CodeExecutionPermission/AgentPermission控制权限with_mtp_config(MtpConfig)模型加载后附加 MTPMulti-Token Prediction投机解码草稿模型。可以看到MistralRsForServerBuilder几乎覆盖了 CLI 服务器mistralrs serve的全部能力——其默认值模块defaults甚至就是为 CLI 参数回退而设计的。这意味着通过嵌入式方案你可以在自己的应用里直接获得与独立服务器同等的推理调度与 Agent 能力。从自定义 Handler 直接调用模型当标准 OpenAI 请求形状无法满足业务需求时可以把SharedMistralRsState直接注入自己的 Axum Handler绕过MistralRsServerRouterBuilder生成的路由使用mistralrs-server-core暴露的低层工具函数。SharedMistralRsState本身就是ArcMistralRs天然满足 Axum 的State提取器要求——仓库为此专门提供了别名ExtractedMistralRsState StateSharedMistralRsStatemistralrs-server-core/src/types.rs服务器内部的chatcompletions处理器正是这样提取状态的见 mistralrs-server-core/src/chat_completion.rs。典型的低层调用链分为三步创建响应通道create_response_channel(Optionusize)返回(SenderResponse, ReceiverResponse)缓冲大小默认由DEFAULT_CHANNEL_BUFFER_SIZE决定mistralrs-server-core/src/handler_core.rs解析并校验请求parse_request把 OpenAI 兼容请求体转换为 mistral.rs 内部的Request。不同端点有各自的解析函数聊天补全chat_completion::parse_request(ChatCompletionRequest, ChatCompletionParseContext)其中ChatCompletionParseContext携带state、tx、tool_dispatch_url、Agent 审批回调、工具面tool surface与技能存储等上下文mistralrs-server-core/src/chat_completion.rs文本补全completions::parse_requestmistralrs-server-core/src/completions.rs图像生成、语音合成image_generation::parse_request、speech_generation::parse_request。发送请求send_request(state, request)或send_request_with_model(state, request, Some(model_id))将Request投递给模型流水线mistralrs-server-core/src/handler_core.rs随后在Receiver上循环等待Response可参考base_process_non_streaming_response的响应处理模式。对于流式输出types模块还提供了两个回调钩子OnChunkCallbackR可在每个流式 chunk 发送给客户端前做过滤/改写/记录OnDoneCallbackR在流结束后接收全部 chunk 用于统计与分析mistralrs-server-core/src/types.rs。一个包含自定义 OpenAPI 集成的完整示例可查阅mistralrs-server-corecrate 的顶层文档mistralrs-server-core/src/lib.rs。注意事项与版本约束ModelSelected是穷举字面量如上文代码所示ModelSelected::Plain要求列出每一个字段。当mistralrs-core新增字段时这段代码会编译失败——这是有意设计的用于强制开发者感知模型选择项的变更。以当前仓库为准的字段列表参见mistralrs-core的ModelSelected枚举定义feature 开关Swagger UI/docs、/api-doc/openapi.json依赖swagger-uifeature若你不需要文档界面可在依赖声明中关闭该 feature 或调用with_include_swagger_routes(false)版本匹配本文示例基于mistralrs-core 0.8与mistralrs-server-core 0.8两个 crate 建议保持同一主版本以免 Builder API 不一致请求体与并发上限默认 50 MiB 的请求体上限适合包含图片、文件内容的请求若你的业务会推送更大的 payload请用with_max_body_limit调高with_max_seqs默认 16高并发场景可适当上调但要注意与 KV Cache 显存预算with_paged_attn_gpu_mem等的平衡CORS 与鉴权嵌入式 Router 默认 CORS 全开放且不做鉴权务必在自己的外层 Router 上叠加认证中间件如 JWT、API Key 校验再决定是否通过with_allowed_origins收紧跨域来源。小结通过MistralRsForServerBuilderMistralRsServerRouterBuilder的组合mistral.rs 的完整推理能力可以以标准 AxumRouter的形态嵌入任意 Web 应用Router::nest挂载即获得 OpenAI/Anthropic 兼容 APISharedMistralRsState注入自定义 Handler 即获得底层请求驱动的灵活性而 Builder 上数十个配置项让你在模型加载、量化、PagedAttention、Agent 工具与执行权限等维度拥有与独立服务器一致的精细控制。对于希望把 LLM 服务化能力无缝并入既有 Rust 后端的团队这是当前仓库提供的最直接、最完整的集成路径。【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考