服务器与 Web UI

TensorSharp.Server 是一个 ASP.NET Core 应用,托管单个 GGUF 模型,并在同一端口上暴露浏览器聊天 UI 以及兼容 Ollama 和 OpenAI 的 REST API。连续批处理引擎负责并发。

启动服务器

约 30 秒快速开始(Gemma 4 E4B)

按平台安装 .NET 10 SDK、Git、CMake 与 curl,然后在终端粘贴下面的命令。复制并运行这些命令约需 30 秒;7.48 GiB 的模型下载与首次还原/构建耗时更长,取决于网络速度与机器性能。它会通过原生 GGML 桥接托管仓库基准已验证的 Gemma 4 E4B Q8_0,使用推荐的公开 ggml-org 文件。下面的代码块面向 Linux + NVIDIA(CUDA 构建还需要 CUDA Toolkit):

git clone https://github.com/zhongkaifu/TensorSharp.git
cd TensorSharp
TENSORSHARP_GGML_NATIVE_ENABLE_CUDA=ON dotnet build TensorSharp.slnx -c Release -p:TensorSharpSkipMlxNative=true
curl --create-dirs --fail -L "https://huggingface.co/ggml-org/gemma-4-E4B-it-GGUF/resolve/main/gemma-4-E4B-it-Q8_0.gguf?download=true" -o models/gemma-4-E4B-it-Q8_0.gguf
dotnet run --project TensorSharp.Server.Host -c Release --no-build -- --model models/gemma-4-E4B-it-Q8_0.gguf --backend ggml_cuda

Apple Silicon 请省略 CUDA 环境变量并使用 ggml_metal;受支持的 Windows/Linux Vulkan GPU 请改为请求 TENSORSHARP_GGML_NATIVE_ENABLE_VULKAN=ON 并使用 ggml_vulkan;没有受支持的 GPU 时可省略该环境变量并使用 ggml_cpu。占用内存更低的 gemma-4-E4B-it-Q4_K_M.gguf 位于同一仓库。纯文本不需要投影器;图像、视频或音频还需匹配的 mmproj-gemma-4-E4B-it-Q8_0.gguf,并通过 --mmproj 传入。Windows PowerShell 与完整平台语法见快速开始

在第二个终端中验证 OpenAI 兼容端点:

curl -s http://localhost:5000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"gemma-4-E4B-it-Q8_0.gguf","messages":[{"role":"user","content":"Reply with one short hello."}],"max_tokens":32}'

API 基址是 http://localhost:5000。内置 wwwroot/ 存在且启用时,GET / 会返回其中的 index.html 聊天界面。稳定的纯文本存活检查是 GET /health;只有未启用 Web UI 的无界面部署才会让根路径 / 回退为同一个健康响应。

📌

推理必须在启动时传入 --model。服务器只托管启动时指定的 GGUF,以及可选且必须显式传入的 --mmproj;它不会扫描模型目录或自动探测投影器。/api/models/load 只能用其他受支持后端重新加载同一启动组合。无模型进程不能在运行时选择 GGUF。默认监听地址是 http://0.0.0.0:5000--port--host--urls(环境变量 PORT / HOST / ASPNETCORE_URLS)可以改变它。

🔐

服务端没有内置 API Key 身份验证或 TLS,并监听所有网络接口。本机使用时请依靠主机防火墙;需要远程访问时应置于带身份验证的 HTTPS 反向代理之后,不要把 5000 端口直接暴露给不可信网络。

已构建的源码目录

构建完成后,从仓库根目录运行这些命令。它们会调用 TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll;该输出目录也包含复制好的原生库与 wwwroot/Releases 页面也附带面向受支持平台的自包含 CLI 与服务器压缩包。

# Apple Silicon / Metal
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_metal

# NVIDIA / GGML CUDA
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_cuda

# AMD、Intel 或 NVIDIA / Vulkan;先查看设备索引
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --list-gpus
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_vulkan --gpu-device 1

# 多模态:投影器始终显式指定
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --mmproj ./models/mmproj.gguf --backend ggml_cuda

服务器级默认采样

默认值会填补请求未提供的任何字段。你显式配置过的参数还会覆盖客户端为其发来的值 —— 很多聊天客户端(如 VS Code Copilot Chat)会把 temperature/top_p 硬编码进每一次请求。加上 --sampling-precedence request 可把控制权交还给客户端。

dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --model ./models/model.gguf --backend ggml_metal \
    --temperature 0.7 --top-p 0.9 --top-k 40 --repeat-penalty 1.1 \
    --presence-penalty 0.0 --frequency-penalty 0.0 --seed 42 \
    --stop "</s>" --stop "<|endoftext|>"

Web UI 功能

打开 http://localhost:5000/。浏览器界面支持:

Agentic Work 与代码执行

在能够完整往返工具调用的模型家族上,服务器可让单个模型在进程内执行「生成 → 工具 → 再生成」循环。Agent Skills 可以在不执行脚本的情况下被发现与读取;运维者需另行传入 --skills-allow-exec 才允许运行技能自带脚本。--code-exec 则显式开启由宿主处理的 read_fileedit_filewrite_fileapply_patch 与沙箱化 shell 工具。Web UI 聊天会话会在各轮之间保留私有工作区;无状态 API 请求各自获得隔离的请求工作区,并在结束后删除。

🔒

执行类工具在运维者开启前保持关闭,但一旦开启,系统不会再逐条命令弹出审批。沙箱模式默认是 required,无法安全隔离时直接拒绝:macOS 使用 Seatbelt,Linux 要求 bubblewrap 0.12.0 或更新版本。Windows Job Object 只能约束后代进程,不能隔离文件系统或网络,因此技能脚本需要显式选择更弱的沙箱模式,而模型生成的命令需要 --code-exec-unconfined。这是 agentic 工具循环,并非多智能体编排。完整参数、模型家族限制、工作区生命周期与安全边界见 Agentic Work、Skills 与沙箱

视频生成:网页界面能设什么,什么只能靠 API

托管一个视频生成模型(MiniMax-H3 或 Wan),网页界面就变成了一个视频生成器。这些接口判断的是 IVideoGenerationModel 接缝而不是架构字符串,因此其他模型会返回 400The loaded model is not a video-generation model.。有必要清楚地知道浏览器实际控制了请求中多小的一部分:一次视频任务可能跑几分钟,也可能跑几小时,而浏览器在任务开始后无法再改变这一点。

# MiniMax-H3:画面与它的 32 kHz 立体声音轨在同一个潜变量里一起去噪
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll \
    --model ./models/minimax_h3_fl2va_pruned-Q4_K.gguf --backend ggml_cuda \
    --video-width 640 --video-height 384 --video-steps 20 --video-frames 22

# 同样的几何参数,换另一个权重:用身份 / 外观参考生成一个新场景
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll \
    --model ./models/minimax_h3_ref2va_pruned-Q4_K.gguf --backend ggml_cuda \
    --video-width 640 --video-height 384 --video-steps 20 --video-frames 22

FL2VA 与 Ref2VA 是两个权重文件,而不是两档设置:加载哪一个决定了附上的图像被当作关键帧还是参考,/api/models 报给浏览器的也正是这一点。config/minimax-h3-fl2va.jsonconfig/minimax-h3-ref2va.json 带的是同一套几何参数,并会在首次运行时下载去噪器、共享的 Qwen3-VL-32B 文本编码器与两个 VAE —— 但不包括分词器,因为它不是一个命令行参数:请把上游 MiniMaxAI/MiniMax-H3 仓库 processor/ 目录下的 vocab.jsonmerges.txt 放到编码器旁边,或让 TS_VIDEO_TOKENIZER 指向存放它们的目录。

⏱️

浏览器发送的是提示词,外加所加载模型声明支持的条件输入 —— 首帧、尾帧,或最多 maxReferenceImages 张参考图,以及随附的参考片段与音轨 —— 这份请求体是按 GET /api/models 返回的 video 能力对象拼出来的,而不是靠架构名去猜。帧数、fps、分辨率、去噪步数、seed、flow shift、采样器、负向提示词与引导缓存都没有在界面上暴露:它们来自启动参数或模型自身的配方。引导则根本没有对应的启动参数 —— 服务端完全没有 --cfg —— 只能在请求里设置,而 MiniMax-H3 会拒绝任何大于 1.0 的取值,因为它出厂就是 CFG 蒸馏过的。若要按请求设置这些值,请直接调用 POST /api/video-generate/v1/videos/generations

进程在启动时就已决定的部分:

由什么决定设置项说明
--model(进程内固定)属于哪个家族,以及去噪前向次数最大的单项成本因素。MiniMax-H3 经过 CFG 蒸馏,每一步都只是一次无引导前向 —— 默认 20 步,快速工作点是 4–8 步。基础的 Wan2.2-TI2V-5B 走官方配方 50 步 × 2 次 CFG = 100 次 DiT 前向;步数蒸馏的 Turbo / Lightning / FastWan 权重会从文件名被识别出来,只跑 4 次无引导前向。在 M5 Pro 上、1088×832 × 121 帧的同一个请求,这就是约 3 h 30 m 与 17 m 30 s 的差别。→ H3 实测 · Wan 实测 · 下载
--video-width N / --video-height N默认输出尺寸服务端最主要的画质杠杆,因为网页界面自己不发送尺寸:不设它们,每段视频都按模型默认尺寸生成。MiniMax-H3 的推荐起点是 640×384;只给出宽高之一时,H3 会按条件图像的宽高比推出另一个。别名:--width / --height
--video-steps N默认去噪步数分辨率之后第二重要的质量/耗时取舍。MiniMax-H3 默认 20 步;4–8 步是快速工作点,16–24 步明显更干净,超过约 30 步收益很小。请求中的 steps 会覆盖它。
--video-mode <mode>默认条件模式为未带 videoMode 的请求钉住 t2v / i2v / fl2v / ref。不传它,每个请求会按自身携带的内容推断模式,通常这才是你想要的;只提供单一模式的部署才需要钉住它。
--video-frames N默认帧数这是服务端范围的默认值,不是上限:请求里带 frames 就会覆盖它。数值会对齐到模型自身的时间网格 —— Wan 为 4k+1,MiniMax-H3 为 17k+5。不传该参数时按模型配方来 —— Wan2.2-TI2V 为 49 帧,其余 Wan 权重为 33 帧,MiniMax-H3 为 22 帧。
--fps N默认播放帧率同样是默认值,可被请求中的 fps 独立覆盖。不传时配方给出 Wan2.2-TI2V 24 fps、其余 16 fps;MiniMax-H3 以固定 24 fps 训练,会覆盖任何其他取值。fps 只改变播放速度,不改变计算量。
--audio-vae <path>是否会返回音轨只对与视频联合生成音频的模型有意义(minimax_h3_audio_vae_fp32.safetensors)。不传它,MiniMax-H3 照样能跑并产出视频,只是没有声音 —— 而 /api/models 上的 supportsAudio 会报 false
请求本身(仅 API)其余全部widthheightframesstepscfgcfg2seedfpsflowShiftsamplernegativePromptcfgCacheStridevideoModegenerateAudioendImagereferenceImagesreferenceVideosreferenceAudiosreferenceVideoAudios

Web UI 形态的接口按上述 JSON 字段名接收参数;同一个请求体在 /api/video-generate(返回一个 MP4)与 /api/video-generate/stream(SSE 去噪进度)上都可用。视频生成在进程内串行执行,同一时刻只跑一个任务:

curl -s http://localhost:5000/api/video-generate \
  -H "Content-Type: application/json" \
  -d '{
        "prompt": "a red fox trotting through falling snow, cinematic",
        "width": 640, "height": 384,
        "frames": 22, "fps": 24,
        "steps": 8, "cfg": 1.0, "seed": 42,
        "videoMode": "t2v",
        "generateAudio": true
      }'

返回体是 { ok, url, audioUrl, width, height, frames, fps, seed, codec, elapsedSeconds }audioUrl 指向旁挂的 WAV,当模型没有产出音轨时为 null。Wan 使用同样的请求体,只是换成它自己的旋钮 —— "flowShift": 5.0"sampler": "unipc""negativePrompt""cfgCacheStride": 2 —— 这些 MiniMax-H3 一个都用不上,因为它在 "cfg": 1.0 下无引导运行。

"image" 字段可直接携带 base64 条件帧(允许带 data:…;base64, 前缀);"imagePath""endImage" 以及每一个 reference* 条目都是 Web UI 使用的形式,必须引用 /api/upload 已经返回过的文件 —— 任何解析到上传目录之外的路径都会被拒绝。OpenAI 形态的 POST /v1/videos/generations 接收同样的参数,但尺寸写作 "size": "832x480"、负向提示词写作 "negative_prompt"。完整的请求/响应结构见 HTTP API 页。

💡

开跑长任务之前,先估算规模。开销主要由 DiT token 数决定(latent_frames × (h/2) × (w/2)),而自注意力是 O(token²),因此帧数与帧面积的影响远大于步数。在 MiniMax-H3 上的顺序是分辨率、帧数、步数 —— 它本来就不用引导,没有蒸馏杠杆可拉。在 Wan 上:换用步数蒸馏权重、减少帧数、减小帧面积(但不要低于约 0.3 MP)、在基础权重上减少步数,最后是 "cfgCacheStride": 23(1.30× / 1.43×)。480p(约 0.4 MP)是 Wan 训练过的分辨率,属于真正的输出档位,而非降级模式。

配置文件(--config

可以用 --config 传入一个 JSON 文件,取代冗长的命令行;CLI 读取相同格式。命令行参数始终优先——先应用文件中的值,命令行上再次给出的参数会覆盖它们,因此可以在多台主机上复用同一个文件,只覆盖需要变化的部分。--config 可重复以叠加多个文件(后者优先)。允许注释与尾随逗号。

# 从文件读取全部参数;本次仅覆盖后端
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --config config/server-basic.json
dotnet TensorSharp.Server.Host/bin/TensorSharp.Server.Host.dll --config config/server-basic.json --backend ggml_cpu

键名与下方长选项名相同(可带或不带前缀 --)。字符串/数字展开为 --key valuetrue 展开为裸开关 --key,数组展开为重复的标志(如 "stop": ["</s>", "<|eot|>"])。

变量。"variables" 中定义一次共享值,用 ${name} 在任意字符串值中引用(未定义的名称回退到同名环境变量)。可以定义任意多个根路径——位于不同目录的模型各用一个。

自动下载。 任何文件参数都可以写成带本地 path 与一个或多个 urls 的对象。若 path 不存在,则从第一个可用 URL 下载(镜像按顺序尝试),保存到该路径,之后复用;进度打印到 stderr,可选的 sha256 用于校验。

{
  "variables": { "modelRoot": "C:/models", "repo": "https://huggingface.co/unsloth/gemma-4-E4B-it-GGUF/resolve/main" },
  "backend": "ggml_cuda",
  "max-tokens": 4096,
  "continuous-batching": true,
  "stop": ["</s>", "<|eot|>"],
  "model":  { "path": "${modelRoot}/gemma-4-E4B-it-Q8_0.gguf", "urls": [ "${repo}/gemma-4-E4B-it-Q8_0.gguf" ] },
  "mmproj": { "path": "${modelRoot}/gemma-4-E4B-mmproj-F16.gguf", "urls": [ "${repo}/mmproj-F16.gguf" ] }
}

开箱即用的示例见仓库 config/ 目录(cli-basic.jsonserver-basic.jsonvariables.jsonauto-download.jsonqwen-image-edit.json)——每个都使用真实、公开、无需授权的 URL,因此在全新机器上也能直接运行。完整说明见 config/README.md

服务器选项

选项说明
--model <path>要托管的 GGUF 文件(推理必需)。
--mmproj <path>显式多模态投影器 GGUF;只写文件名时相对于模型目录解析(传 none 可禁用)。需要 --model;不会自动扫描投影器。
--backend <type>默认后端:cpucudamlxggml_cpuggml_metalggml_cudaggml_vulkan
--tp <N>张量并行度 —— 把托管的模型切分到本机 N 张 GPU 上(默认:1;环境变量 TENSORSHARP_TP_DEGREE)。需要 --backend cudaggml_cudaggml_vulkan。→ 多 GPU 与多节点
--tp-node-id <N> / --tp-peers <list>加入多节点 TP 集群:本节点的 0 起始编号,以及所有节点共享且顺序一致的 host:port 列表。服务端只能是节点 0(负责采样并对外提供 HTTP 的 driver);其余节点运行 TensorSharp.Cli worker。
--gpu-device <N>ggml_vulkan 后端在多 GPU 主机上使用的 Vulkan 设备索引(默认:0;环境变量 TS_GGML_VULKAN_DEVICE)。
--list-gpus列出 ggml-vulkan 可见的 Vulkan 设备(索引 + 显卡名称)后退出。
--help打印完整参数说明后退出;不带任何参数时也会显示。推理始终需要启动参数 --model
--config <path>从 JSON 配置文件读取参数(命令行参数会覆盖它)。支持 ${变量} 与通过 { "path": ..., "urls": [...] } 自动下载模型。可重复。
--max-tokens <N>所有端点(Web UI、Ollama、OpenAI)的生成上限:请求未指定时用它填充,请求要求更多时按它截断(默认:20000,该默认值只填充、不截断)。
--temperature / --top-k / --top-p / --min-p采样值(默认 0.8 / 40 / 0.9 / 0)。
--repeat-penalty / --presence-penalty / --frequency-penalty / --seed惩罚与随机种子(默认 1.1 / 0 / 0 / -1)。
--stop <string>停止序列(可重复)。在 config 优先级下与逐请求的 stop 列表合并;在 request 下被其替换。
--sampling-precedence <config|request>当请求同时携带了你在上面配置过的采样参数时以谁为准:config(默认)保留你的取值,request 让客户端的取值优先。你未配置过的参数始终取请求中的值。环境变量:TENSORSHARP_SAMPLING_PRECEDENCE
--continuous-batching / --no-continuous-batching启用(默认)或禁用迭代级分页批处理。别名:--paged-batching
--spec / --no-spec启用 / 禁用 NextN / MTP 推测解码(默认关闭)—— 对内嵌在主干 checkpoint 里的草稿器,这是显式的开启开关,因为加载它们会把额外权重调入显存。只在模型确实带有 MTP/NextN 草稿头时生效。GLM-5.2 与 GLM-5.3 的草稿头本来就在主干 GGUF 里,没有额外文件要下载,但该参数仍必须在模型加载之前出现在命令行上:正是它让 glm-dsa 把 NextN 层调入显存(GLM-5.2 的 IQ2_XXS 下约 3 GiB),同时也挤掉了一部分上下文空间。在 --tp N>1 下它会被拒绝 —— 那时草稿块只能借用按列切分的主干 LM head —— 因此这两个版本上的投机只在不传 --tp 的默认按层切分下生效。→ MTP
--spec-draft <N>每个推测步草拟的最大 token 数(默认 8;块级草稿器默认取其训练块大小,并会把取值压到该块大小)。
--spec-pmin <f>保留某 token 所需的最低草稿置信度;0 表示完全不设门限。默认值取决于草稿器类型:逐 token 草稿头为 0.15,块级草稿器为 0.35(后者的门限是累积前缀概率,因此同一个数字要严格得多)。
--draft-model <path>所有以独立文件发布的草稿器共用的 GGUF 参数 —— DeepSeek V4 的 DSpark 支持模块、Muse-Glimmer 的 DFlash、Gemma 4 的 gemma4-assistant 草稿头。由文件自身的 general.architecture 决定加载方式,写出这个文件本身就会启用投机 —— 不需要再加 --spec(显式的 --no-spec 可将其否决)。Qwen 3.6、GLM-5.2 与 GLM-5.3 的 NextN 都位于主干 GGUF 中,不需要此参数 —— GLM-5.3 在 blk.78 上带的是完整的一块,由 --spec 负责启用;显式草稿无法激活时启动会失败。DSpark 在 cudaggml_cuda 后端上对单序列请求生效。每一行验证都用该请求自己的采样器,因此可与任意采样设置组合。环境变量:TS_DSV4_DSPARK。→ DSpark
--prefill-chunk-size <N>每个调度步的最大 prefill token 数(设置 TS_SCHED_PREFILL_CHUNK)。
--kv-cache-dtype <type>KV 缓存精度:f32f16q8_0q4_0(默认自动,由后端 / 模型选择;环境变量 KV_CACHE_DTYPE)。
--paged-kv / --no-paged-kv独立 PagedKvCacheManager 的旧兼容开关,不在当前服务请求路径上;活跃请求 KV 由引擎管理。
--paged-kv-block-size / --paged-kv-ram-mb / --paged-kv-ssd-dir / --paged-kv-ssd-mb旧的独立 paged-KV 调参。当前服务请求请使用下方 TS_SCHED_* 引擎设置。
--paged-kv-quant-bits <b>旧的独立 TurboQuant 设置;服务端参数接受 048(运行时环境变量与 CLI 还接受 2)。
--qwen-image-vae / --qwen-image-vl / --qwen-image-mmproj <path>覆盖解析到的 Qwen-Image-Edit 伴随 GGUF(VAE / Qwen2.5-VL 文本编码器 / mmproj)。
--qwen-image-lora <path>Qwen-Image-Edit Lightning 蒸馏 LoRA(.safetensors),作为运行期旁路挂在原封不动的量化基础权重旁边(合并)。它从文件名自动推导去噪步数并把 CFG 切换为 1.0,使默认的 60 次 DiT 前向降到 4–8 次。环境变量:TS_QWEN_IMAGE_LORA
--video-width <px> / --video-height <px>请求未带 width/height 时的默认输出尺寸。视频最主要的画质杠杆,因为网页界面自己不发送尺寸;MiniMax-H3 的推荐起点是 640×384,只给出宽高之一时 H3 会按条件图像的宽高比推出另一个。别名:--width / --height
--video-steps <N>请求未带 steps 时的默认去噪步数。MiniMax-H3 默认 20 步;4–8 步是快速工作点,16–24 步明显更干净,超过约 30 步收益很小。
--video-mode <mode>请求未带 videoMode 时的默认条件模式:t2vi2vfl2vref。不传它,每个请求会按自身携带的内容推断模式,通常这才是你想要的。
--video-frames <N>请求未带 frames 时的默认输出帧数,会对齐到模型自身的时间网格(Wan 为 4k+1,MiniMax-H3 为 17k+5)。模型默认 33,Wan2.2-TI2V 为 49,MiniMax-H3 为 22。请求值会覆盖它 —— 这是默认值,不是上限。
--fps <N>请求未带 fps 时的默认 MP4 播放帧率。模型默认 16,Wan2.2-TI2V 为 24。以固定帧率训练的模型(MiniMax-H3,24 fps)会覆盖任何其他取值。fps 只改变播放速度,不改变生成的计算量。
--video-vae <path>视频 VAE —— wan_2.1_vae.safetensors,TI2V-5B 用 Wan2.2_VAE.safetensors,MiniMax-H3 用 minimax_h3_video_vae_fp16.safetensors。默认在 DiT 同目录扫描,包含 VAE/ 子目录。环境变量:TS_VIDEO_VAE;旧写法 --wan-vae 仍被接受。
--video-text-encoder <path>文本编码器 GGUF —— Wan 用 UMT5-XXL,MiniMax-H3 用 Qwen3-VL-32B。默认在同目录扫描(环境变量 TS_VIDEO_TEXT_ENCODER;也可写作 --video-te,旧写法为 --wan-te)。当 Wan 2.2 A14B 的两个专家不在一起时,用 --video-dit2 / TS_VIDEO_DIT2 指定第二个 high/low noise 专家。
--audio-vae <path>与视频联合生成音轨的模型所用的音频 VAE(minimax_h3_audio_vae_fp32.safetensors)。不传它这类模型照样能跑并产出视频,只是没有声音。环境变量:TS_VIDEO_AUDIO_VAE

逐请求字段(temperaturetop_pseedstop ……)会填补所有你未在此配置的参数;对于你配置过的参数,除非以 --sampling-precedence request 启动,否则以你的取值为准。chat.start 日志会打印每个请求实际使用的采样参数。

环境变量

变量说明
BACKEND未传 --backend 时的默认后端(默认:macOS 上为 ggml_metal,其他平台为 ggml_cpu)。
MAX_TOKENS默认最大生成长度(默认:20000)。
MAX_CONTEXT硬性的上下文上限。不设时,自报的上下文只是上界:权重加载完之后引擎会去问各设备实际还剩多少显存,按「缓存加一整个 n_ubatch 计算图」能装下的大小定上下文,并打印它的选择(GLM-5.2 在 3× RTX PRO 6000 上:按层切分 342,272 token,--tp 3 91,136,--n-cpu-moe 30 646,400)。设了它,放得下就照办,放不下会带着数字直接报错,而不会被悄悄缩小。
TS_PDF_MAX_PAGES上传 PDF 时读取的页数上限,文本提取与页面图像渲染均遵循(默认:0 = 全部页面;CLI --pdf 同样遵循)。
VIDEO_SAMPLE_FPS / VIDEO_MAX_FRAMES每秒视频采样的帧数 / 可选的抽帧上限。
TS_FUSED_QKNORM_ROPEDirect cuda 后端上 Qwen 3.5/3.6 文本 prefill 的融合 QK-Norm + RoPE CUDA 内核(默认开启;0 关闭)。
TENSORSHARP_TEMPERATURE…_TOP_K…_TOP_P…_MIN_P当参数与请求体都未设置时的默认采样值。
TENSORSHARP_REPEAT_PENALTY…_PRESENCE_PENALTY…_FREQUENCY_PENALTY…_SEED默认惩罚与随机种子。
TENSORSHARP_LOG_LEVEL / …_LOG_DIR / …_LOG_FILE日志级别、目录与文件开关(CLI 同样遵循)。
DIFFUSION_STEPS / DIFFUSION_MAX_BATCHDiffusionGemma 每块去噪步数 / 批处理的最大并发扩散请求数。
TENSORSHARP_TP_DEGREE把托管模型切分到本机多少张 GPU 上(默认:1);服务端也支持 --tp N 参数。需要 --backend cudaggml_cudaggml_vulkan。→ 多 GPU 与多节点
TENSORSHARP_TP_DEVICES各 TP rank 使用的 GPU 序号,例如 0,2(默认 0..tp-1)。用于 GGML 后端。
TENSORSHARP_TP_NODE_ID / TENSORSHARP_TP_PEERS把张量并行扩展到多台机器:本节点的 0 起始编号,以及所有节点共用的逗号分隔 host:port 列表。两者必须同时设置。
TS_KV_CACHE_REDIS_URL / TS_KV_CACHE_REDIS_TTL_MINUTES把分页 KV 块持久化到 Redis,实现跨会话(乃至跨进程)复用,以及条目 TTL(分钟,默认 14400 = 不过期)。CLI:--redis-url / --paged-kv-redis-url / --paged-kv-redis-ttl
TS_RESPONSES_STORE_REDIS_URL用 Redis 而非进程内存承载 OpenAI Responses API 存储。CLI:--redis-url

服务器默认监听 http://0.0.0.0:5000--port--host--urls(或环境变量 PORT / HOST / ASPNETCORE_URLS)可以改变它,Docker Space 镜像设置的是 PORT=7860

连续批处理调参

调度器 / 引擎的旋钮在进程启动时读取。通过环境变量(或会被翻译成它们的 --continuous-batching 系列参数)设置。

变量说明
TS_SCHED_DISABLE_BATCHED1 强制逐序列 KV 交换,即使模型支持批处理(= --no-continuous-batching)。
TS_SCHED_MAX_BATCHED_TOKENS每步 token 预算(默认 4096)。
TS_SCHED_MAX_RUNNING_SEQS最大在飞序列数(默认 16)。
TS_SCHED_PREFILL_CHUNK存在活跃 decode 时每请求的 prefill 上限(默认 256);仅 prefill 时会用满完整 token 预算。
TS_SCHED_SOLO_PREFILL_CHUNK系统中最多一个序列时的 prefill 分块大小,会限制所有独占 prefill 分块(默认 8192)。
TS_SCHED_DECODE_QUANTUM切换序列前的 decode token 数(默认 256 = 块大小)。
TS_SCHED_NUM_BLOCKS / TS_SCHED_BLOCK_SIZE引擎池中的物理块数(默认 256) / 每块 token 数(默认 256)。
TS_SCHED_PREFIX_CACHE0 禁用跨请求的块哈希前缀共享。
TS_BATCHED_FUSED_DECODE原生槽位路径(DeepSeek V4、GLM 5.x)默认启用批处理融合解码:一张图、每个序列一个 token,整批只读一次权重——GLM-5.2 在 4 路并发下总解码吞吐 1.81 倍。设为 0 可切回串行融合 decode;TS_GLM_BATCHED_DECODE=0 也会让 GLM 原生侧拒绝批处理。批处理会改变 GEMM 形状,而 2-bit MoE 可能把这点差异放大成不同的专家选择。
TS_<FAMILY>_BATCHED=0逐模型的逃生口(如 TS_GEMMA4_BATCHED=0),回退到逐序列 KV 交换。

完整的环境变量面(MLX 调参、MTP 旋钮、扩散)见 API 参考 页与高级页。