命令行 (CLI)

TensorSharp.Cli 是用于本地提示词、多模态实验、提示词检查、JSONL 批处理工作流、交互式 REPL 与内置基准测试的控制台宿主。构建后二进制位于 TensorSharp.Cli/bin/...

约 30 秒快速开始

请在 TensorSharp 仓库根目录执行,并先按平台安装 .NET 10 SDK。已验证的快速开始会构建原生 GGML 后端,并运行仓库基准已验证的 gemma-4-E4B-it-Q8_0.gguf(7.48 GiB)。复制并运行这些命令约需 30 秒;模型下载与首次 restore/构建耗时更长,取决于网络速度与机器性能。原生源码构建还需要 Git、网络访问、CMake 与可用的 C++ 工具链。

Linux + NVIDIA

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
echo "请用一段话说明本地推理。" > prompt.txt
dotnet run --project TensorSharp.Cli -c Release --no-build -- --model models/gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --max-tokens 128 --backend ggml_cuda

Windows PowerShell + NVIDIA

$env:TENSORSHARP_GGML_NATIVE_ENABLE_CUDA = 'ON'
dotnet build TensorSharp.slnx -c Release -p:TensorSharpSkipMlxNative=true
curl.exe --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
Set-Content -Encoding utf8 prompt.txt "请用一段话说明本地推理。"
dotnet run --project TensorSharp.Cli -c Release --no-build -- --model models\gemma-4-E4B-it-Q8_0.gguf --input prompt.txt --max-tokens 128 --backend ggml_cuda

省略 --input 时,CLI 会退回内置的 What is 1+1? 提示词;若要进行自定义的单次文本推理,请把提示词保存到文件并通过 --input 传入。--prompt 仅用于 Qwen-Image-Edit 的编辑指令。

在其他原生后端上运行 Gemma 4 E4B

Apple Silicon 请省略 CUDA 环境变量并使用 ggml_metal;受支持的 Windows/Linux Vulkan GPU 请改为请求 TENSORSHARP_GGML_NATIVE_ENABLE_VULKAN=ON 并使用 ggml_vulkanggml_cpu 运行原生 CPU 内核,无需 GPU。同一仓库还提供内存占用更低的 gemma-4-E4B-it-Q4_K_M.gguf。纯文本不需要 mmproj;只有图像、视频或音频输入才需要通过 --mmproj 添加匹配的 mmproj-gemma-4-E4B-it-Q8_0.gguf。完整平台语法见快速开始

示例

请在仓库根目录运行这些源码命令。替换示例路径,并选择构建所支持的原生后端。

# 文本推理(macOS)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --output result.txt \
    --max-tokens 200 --backend ggml_metal

# Windows/Linux + NVIDIA GPU 上的文本推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --output result.txt \
    --max-tokens 200 --backend ggml_cuda

# 在任意 Vulkan GPU(AMD / Intel / NVIDIA)上的文本推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --output result.txt \
    --max-tokens 200 --backend ggml_vulkan

# 多 GPU 主机:先列出可见的 Vulkan 设备,再按索引选择
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- --list-gpus
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --max-tokens 200 \
    --backend ggml_vulkan --gpu-device 1

# 交互式逐轮聊天(REPL),带 KV 缓存复用与斜杠命令
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal --interactive
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal -i \
    --system "You are a terse assistant." --temperature 0.7 --top-p 0.9 --think

# DSpark 块级投机解码(DeepSeek V4):--model 指向分片 GGUF 的第一片,
# --draft-model 指向独立的 DSpark 草稿器。需要贪心采样。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <DeepSeek-V4-Flash-...-00001-of-00005.gguf> --backend ggml_cuda \
    --draft-model <DSpark-drafter.gguf> --input prompt.txt --max-tokens 200 --temperature 0

# GLM 5.x:--model 指向第一个分片,同一组的其余分片由 GgufFile 自行找到。
# 权重会按层切分到所有可见 GPU,自报的 1M 上下文则按权重落盘后剩余的显存缩定。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <GLM-5.2-UD-IQ2_XXS-00001-of-00006.gguf> --backend ggml_cuda \
    --input prompt.txt --max-tokens 200 --think

# GLM-5.3(非 Flash)与 GLM-5.2 是同一套 79 块 glm-dsa 结构 —— 256 个路由专家取
# top-8 外加一个共享专家、带 lightning indexer 的 MLA —— 因此它走 GLM-5.2 的加载
# 路径,不需要新代码也不需要新参数,只有文件不同。unsloth/GLM-5.3-GGUF 每个量化
# 各占一个子目录,每个都是多分片的一组(UD-Q2_K_XL 为七个分片、236.4 GiB);它仅
# 文本:该仓库任何量化都没有发布 mmproj,在 glm-dsa 上传 --mmproj 只会告警并忽略。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <UD-Q2_K_XL/GLM-5.3-UD-Q2_K_XL-00001-of-00007.gguf> --backend ggml_cuda \
    --input prompt.txt --max-tokens 200 --think

多模态

# 图像推理(Gemma 4、Qwen 3.5-family)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --image photo.png --max-tokens 200 --backend ggml_metal

# 视频推理(Gemma 4)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --video clip.mp4 --max-tokens 200 --backend ggml_metal

# 音频推理(Gemma 4)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --audio speech.wav --max-tokens 200 --backend ggml_metal

# PDF 文档问答(--input 是问题;扫描件/纯图像 PDF 需要视觉模型 +
# --mmproj,含文本的 PDF 可使用任意模型)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --pdf report.pdf --input question.txt \
    --max-tokens 400 --backend ggml_metal

推理、工具与采样

# 思考 / 推理模式
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --max-tokens 400 --backend ggml_metal --think

# 工具调用
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --max-tokens 300 --backend ggml_metal \
    --tools tools.json

# 带采样参数(CLI 默认为贪心解码)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --max-tokens 200 --backend ggml_metal \
    --temperature 0.7 --top-p 0.9 --top-k 40 --repeat-penalty 1.2 --seed 42

图像编辑(Qwen-Image-Edit)

# 提示词 + 输入图像 -> 编辑后的图像。VAE + Qwen2.5-VL 文本编码器伴随文件
# 会在 DiT GGUF 旁解析(或用 --qwen-image-vae / --qwen-image-vl /
# --qwen-image-mmproj 指定)。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <qwen-image-edit-DiT.gguf> --image input.png \
    --prompt "Make the sky a dramatic sunset." --output edited.png \
    --backend ggml_cuda --diffusion-steps 30 --cfg 2.5 --diffusion-seed 0

视频生成

MiniMax-H3同一个打包潜变量里同时去噪视频与原生 32 kHz 立体声音轨,所以声音和画面来自同一次前向。它经过 CFG 蒸馏,因此必须传 --cfg 1.0(更高的取值会被直接拒绝),默认 20 步,而 4–8 步是它的快速工作点:

# 文本 -> H.264 MP4 外加一个旁挂 WAV。写出 fox.mp4 与 fox.wav。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <minimax_h3_fl2va_pruned-Q4_K.gguf> --backend ggml_metal \
    --prompt "a red fox trotting through falling snow, cinematic" \
    --width 640 --height 384 --video-frames 22 --diffusion-steps 8 --cfg 1.0 \
    --output fox.mp4

# 让一张照片动起来:在 FL2VA 权重上,这张图像就是首帧。
# 再加 --end-image 可以把尾帧也钉住(--video-mode fl2v)。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <minimax_h3_fl2va_pruned-Q4_K.gguf> --backend ggml_metal \
    --image portrait.jpg --video-mode i2v \
    --prompt "the person turns toward the camera and smiles" \
    --width 640 --height 384 --video-frames 22 --diffusion-steps 8 --cfg 1.0 \
    --output animated.mp4

# 参考:保留主体,围绕它构建一个新场景。需要 Ref2VA 权重,
# 最多九个 --ref-image;--ref-video / --ref-audio 则接受片段与音轨。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <minimax_h3_ref2va_pruned-Q4_K.gguf> --backend ggml_metal \
    --ref-image person.jpg --ref-image bottle.png --video-mode ref \
    --prompt "she holds the bottle up to the light on a rooftop at golden hour" \
    --width 640 --height 384 --video-frames 22 --diffusion-steps 20 --cfg 1.0 \
    --output rooftop.mp4
💡

i2v / fl2v 需要 fl2va 权重,ref 需要 ref2va —— 它们是两个不同的文件而不是开关,用错时报错信息会直接点名另一个文件。宽高向上取整到 32 的倍数,帧数向上对齐到 17k+5 网格(5、22、39、56、73、90……),帧率固定为 24。音轨作为旁挂 .wav 写在 MP4 旁边而不是混流进去,因为混流需要一个不一定装了的编码器:ffmpeg -i fox.mp4 -i fox.wav -c:v copy -c:a aac fox_with_audio.mp4 可以把两者合并。--no-audio 则完全跳过音频 VAE。→ H3 需要的四个文件

Wan 2.1 / 2.2 只生成视频,而在那里,--model 指向哪个权重决定了整体耗时:

# 提示词 -> H.264 MP4。UMT5-XXL 文本编码器与视频 VAE 会在 DiT GGUF
# 旁边自动解析(也可用 --video-text-encoder / --video-vae 指定)。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <Wan2.2-TI2V-5B-Q8_0.gguf> \
    --prompt "A red fox trotting through falling snow, cinematic" \
    --video-frames 81 --fps 24 --output out.mp4 --backend ggml_cuda

# 图像 -> 视频:图像作为首帧,提示词驱动运动
# (仅 Wan 2.2 TI2V-5B 与 A14B I2V 支持)。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <Wan2.2-TI2V-5B-Q8_0.gguf> --image first_frame.png \
    --prompt "the camera pushes in as the waves rise" \
    --video-frames 81 --fps 24 --flow-shift 5.0 --output out.mp4 --backend ggml_cuda

# 快车道:把 --model 指向一个步数蒸馏权重。命令的其他部分完全不变;
# 仅凭文件名,这次运行就会切换为 4 次无引导前向。
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <Wan2_2-TI2V-5B-Turbo-Q8_0.gguf> --image first_frame.png \
    --prompt "the camera pushes in as the waves rise" \
    --video-frames 121 --fps 24 --output out.mp4 --backend ggml_metal

步数蒸馏是最大的一个提速杠杆,而且它不是一个开关。基础的 Wan2.2-TI2V-5B 走官方配方 50 步 × 2 次 CFG = 100 次 DiT 前向;蒸馏后的 Turbo / Lightning / FastWan 权重在训练时就不使用引导,只需 4 次。TensorSharp 会从 DiT 文件名识别它(turbodistilllightninglightx2vfastwan-dmd,或显式的 …-4steps-… / …8step…,取值 1–16),并在加载时打印 step-distilled checkpoint detected -> 4 steps, guidance off。在 M5 Pro 上、1088×832 × 121 帧的同一个请求,基础权重约需 3 h 30 m,Turbo 只需 17 m 30 s--diffusion-steps / --cfg 可覆盖识别到的取值。→ 去哪里下载 · 实测数据

DiffusionGemma 与检查

# DiffusionGemma 文本扩散生成
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <diffusion-gemma.gguf> --input prompt.txt --backend ggml_metal \
    --max-tokens 256 --diffusion-steps 48 --diffusion-seed 0

# 检查渲染后的提示词与分词,但不运行推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input prompt.txt --dump-prompt

批处理与基准测试

# 批处理(JSONL)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --input-jsonl requests.jsonl \
    --output results.txt --backend ggml_metal

# 带 KV 缓存复用的多轮对话模拟(与 Web UI 行为一致)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --multi-turn-jsonl chat.jsonl \
    --backend ggml_metal --max-tokens 200

# 吞吐基准:best-of-N 的 prefill 与 decode 计时
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal \
    --benchmark --bench-prefill 256 --bench-decode 128 --bench-runs 3

JSONL 格式为每行一个 JSON 对象:

{"id": "q1", "messages": [{"role": "user", "content": "What is 2+3?"}], "max_tokens": 50}
{"id": "q2", "messages": [{"role": "user", "content": "Write a haiku."}], "max_tokens": 100, "temperature": 0.8}

配置文件(--config

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

# 使用该文件,但本次运行覆盖后端
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --config config/cli-basic.json --backend ggml_cpu

键名与下方长选项名相同(可带或不带前缀 --)。字符串/数字展开为 --key valuetrue 展开为裸开关 --key,数组展开为重复的标志。

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

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

{
  "variables": { "modelRoot": "C:/models", "hf": "https://huggingface.co" },
  "backend": "ggml_cuda",
  "max-tokens": 256,
  "temperature": 0.7,
  "model": {
    "path": "${modelRoot}/Qwen3.5-9B-Q8_0.gguf",
    "urls": [ "${hf}/unsloth/Qwen3.5-9B-GGUF/resolve/main/Qwen3.5-9B-Q8_0.gguf" ]
  }
}

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

命令行选项

不带任何参数运行 CLI —— 或使用 --help(也支持 -h-?/?)—— 会打印完整的参数参考:逐项列出说明、默认值、取值范围与示例,并在日志与模型机制启动之前退出。未知参数会被忽略,因此请准确复制选项名,否则拼写错误也可能看起来执行成功。

输入 / 输出

选项说明
--model <path>GGUF 模型文件路径(必需)。
--input <path>包含用户提示词的文本文件。单次文本提示词只能来自文件;--prompt 保留用于 Qwen-Image-Edit 的编辑指令。
--pdf <path>单次模式的 PDF 文档输入。含文本的 PDF 会完整提取并内联文本;扫描件/纯图像 PDF 会光栅化为页面图像,并需要视觉模型 + --mmproj--input 变为针对文档的问题;TS_PDF_MAX_PAGES 限制读取页数(默认:全部)。
--input-jsonl <path>含批量请求的 JSONL 文件(每行一个 JSON)。
--multi-turn-jsonl <path>用于带 KV 缓存复用的多轮对话模拟的 JSONL 文件。
--output <path>将生成文本写入此文件。
--image / --video / --audio <path>用于视觉 / 视频 / 音频推理的媒体文件(音频需要 Gemma 4 的音频编码器)。
--mmproj <path>多模态投影器 GGUF 路径。建议显式传入;自动检测只识别少数旧式伴随文件名。

运行时

选项说明
--max-tokens <N>最大生成 token 数(默认:100)。
--backend <type>计算后端:cpucudamlxggml_cpuggml_metalggml_cudaggml_vulkan(默认:ggml_cpu)。
--gpu-device <N>ggml_vulkan 后端在多 GPU 主机上使用的 Vulkan 设备索引(默认:0;环境变量 TS_GGML_VULKAN_DEVICE)。
--list-gpus列出 ggml-vulkan 可见的 Vulkan 设备(索引 + 显卡名称)后退出。
--help打印完整参数参考(逐项列出说明、默认值、取值范围与示例)后退出;不带任何参数启动 CLI 时也会显示。
--kv-cache-dtype <type>KV 缓存精度:f32f16q8_0q4_0(默认:自动,由后端/模型选择;覆盖 KV_CACHE_DTYPE 环境变量)。块量化档位需要原生 GGML flash-attention 路径;q4_0(约为 f32 占用的 1/7)面向 128K–256K 的超长上下文。
--n-cpu-moe <N> / -ncmoe <N>把前 N 层的路由 MoE 专家权重留在系统内存中并在 CPU 上做乘法;注意力、归一化、路由器与共享专家仍留在加速器上。传 all 表示所有层。默认 0 —— 但 GPU 后端上的 DeepSeek V4 例外,它会自动卸载“刚好能放进可见显存”的最少层数。GLM 5.x 上,驻留主机的专家直接从 GGUF 映射中取用、不做私有拷贝(设 TS_GLM_MOE_MMAP=0 改为拷贝),并且这个开关能与 --tp 组合——驻留主机的层保留完整专家,由 rank 0 求值。它是让原本装不下的权重能加载起来的手段,而不是提速开关:GLM-5.2 上 --n-cpu-moe 30 把 pp2048 从 915.9 拉到 94.7 t/s,但把加载器能定下的上下文从 342,272 抬到 646,400 token。环境变量:TS_N_CPU_MOE
--cpu-moe / -cmoe--n-cpu-moe all 的简写(环境变量 TS_CPU_MOE)。
--cpu-moe-threads <N>主机侧专家矩阵乘的工作线程数(默认为本进程实际可用并行度减一)。不要超过 cgroup 的 CPU 配额 —— ggml 的线程池在栅栏处自旋,超订会让吞吐直接崩塌。环境变量:TS_CPU_MOE_THREADS
--interactive / -i启动交互式 REPL(见下文)。
--system <text> / --system-file <path>从文本或文件设定会话的系统提示。仅交互式 REPL 与 DiffusionGemma 扩散模式使用它;普通单次文本模式会忽略系统提示。
--think启用思考 / 推理模式(思维链)。
--tools <path>含工具 / 函数定义的 JSON 文件。
--skills-dir <path> · --skill <name>Agent Skills:面向模型的说明文件夹所在目录,以及本次运行要选中哪些。模型所需的其余内容通过 CLI 自己应答的内置工具取回——完整参数见下方 Agent Skills
--code-exec启用 TensorSharp 内置智能体代码工具。默认关闭;完整说明见智能体工作与代码执行
--spec · --spec-type <name> · --draft-model <path>投机解码:由草稿器提议接下来的若干 token,主干用一次批量前向完成验证。默认关闭,且必须在模型加载之前出现在命令行上 —— 完整参数见下方的投机解码
--dump-prompt渲染提示词 + 分词后退出(不生成)。
--tp <N>多 GPU 度 —— 在单个进程内把模型跑在 N 张 GPU 上(默认:1)。需要 --backend cudaggml_cudaggml_vulkan;用 TENSORSHARP_TP_DEVICES 指定使用哪几张卡。在多数架构上它是张量并行:每一层都被切分到各 rank 上。在走整模型执行器的架构上它另有含义 —— 在 Qwen 3.8 Flash Next 上是按层切分(每张 GPU 拿一段连续的完整层,不切分任何权重;买的是容量而不是速度 —— 贪心输出与吞吐都不变,只是权重不必再挤进一张卡,TS_Q4E_LAYER_SPLIT=20,28 可覆盖均衡结果),在 DeepSeek V4 Flash 上只是限制其自动按层切分使用几张卡。GLM 5.x 不传该参数时使用自动按层切分;在 GGML GPU 后端上,GLM-5.2GLM-5.3GLM-5.3-Flash 都用该参数启用仅支持本地单进程的原生张量并行 —— 在 GLM-5.3(非 Flash)上请把它读作一种被接受的模式、KV 缓存按 rank 复制,而不是一份已验证的配置,因为它从未留下过 --tp N>1 的运行记录。整个 GLM 5.x 家族都会在模型构建之前直接拒绝 --tp-node-id--tp-peers。两种模式都不支持的架构会在 stderr 上打印提示并只用一张 GPU。→ TP 与按层切分
--tp-node-id <N>多节点分布式张量并行中本节点的 0 起始编号。需与 --tp-peers 一起使用。
--tp-peers <list>集群中所有节点的 host:port 列表,逗号分隔(例如 192.168.1.10:9500,192.168.1.11:9500)。所有节点必须完全一致;端口没有默认值,且需在节点之间可达。
--config <path>从 JSON 配置文件读取参数(命令行参数会覆盖它)。支持 ${变量} 与模型自动下载。可重复。

采样

CLI 默认为贪心解码:temperature 0、top-k 0、top-p 1.0、min-p 0、关闭惩罚、seed -1(与默认值匹配 Ollama 的服务端不同)。传入以下参数可启用采样;这些参数也会带入交互式 REPL。

选项说明
--temperature <f>采样温度(默认 0 = 贪心)。
--top-k <N>Top-K 过滤(默认 0 = 禁用)。
--top-p <f>核采样阈值(默认 1.0 = 禁用)。
--min-p <f>最小概率过滤(默认 0 = 禁用)。
--repeat-penalty <f>重复惩罚(默认 1.0 = 无)。
--penalty-last-n <N>重复 / 存在 / 频率惩罚考虑最近多少个 token(默认 64;0 关闭历史惩罚,-1 使用全部历史)。
--presence-penalty <f> / --frequency-penalty <f>存在 / 频率惩罚(默认 0 = 禁用)。
--seed <N>随机种子(默认 -1 = 非确定性)。
--stop <string>停止序列(可重复)。

投机解码

默认关闭。草稿器提议接下来的若干 token,主干用一次批量前向完成验证;每个真正输出的 token 仍然取自主干的某一行,并由本次运行自己的采样器抽出,因此这纯粹是一条提速路径 —— 输出序列与普通解码得到的完全一致。它在 --input--input-jsonl--multi-turn-jsonl--interactive 上都会生效,而且这些参数必须在模型加载之前出现在命令行上:--spec 正是让 glm-dsa 把约 3 GiB 的 NextN 层调入显存的那个开关(这同时也会挤占上下文的空间),而 --spec-draft 在加载时就决定了原生计算图缓存的大小。→ MTP / NextN · DSpark · docs/speculative_decoding.md

选项说明
--spec / --no-spec开启 / 关闭投机解码 —— 对内嵌在主干 checkpoint 里的草稿器(GLM-5.2、GLM-5.3、Qwen 3.6 NextN),这是显式的开启开关,因为加载它们会把额外权重调入显存;用 --draft-model 指定的草稿器无需它即可生效,而 --no-spec 同样可以将其否决。在草稿块借用主干 LM head 的权重上(其中包括 GLM-5.2 与 GLM-5.3 —— 它们位于 blk.78 的完整 NextN 块自己并不带 nextn.shared_head_head.weight),--tp N>1 下不可用,投机只在不传 --tp 的默认按层切分下生效。默认关闭;环境变量 TS_SPEC(或 TS_MTP_SPEC;glm-dsa 还认 TS_GLM_MTP=1/0,它会覆盖前两者)。
--spec-type <name>用哪种投机算法起草。auto(默认)使用权重自带的草稿器 —— 逐 token 的 NextN/MTP 头(GLM-5.2、GLM-5.3、Qwen 3.6、Gemma 4 的独立 assistant GGUF),或块级草稿器(DeepSeek V4 DSpark、Muse-Glimmer DFlash)。draft-headblock 用于显式钉住其中之一。ngram 完全不需要训练权重:它在上下文里回找最近几个 token 曾经出现过的位置,把当时的后续内容提议出来,因此对任何权重都可用。环境变量:TS_SPEC_TYPE
--spec-draft <N>每个投机步最多起草的 token 数。它同时在加载时决定原生计算图缓存的大小,因此必须与 --spec 写在同一条命令行上。取值 1–64,默认 8 —— 块级草稿器则默认取自己训练时的块大小,并会把取值压到该块大小(DSpark 为 5);环境变量 TS_SPEC_DRAFT(或 TS_MTP_DRAFT)。
--spec-pmin <f>低于该置信度就停止起草。这个数代表什么由算法自己定义,所以各算法各有默认值而不共用一个:逐 token 头为 0.15(其 top-10 logits 上的 top-1 概率),块级草稿器为 0.35累积前缀概率,因此同一个数字要严格得多),n-gram 为 0(在那里它改为缩放所需的匹配长度)。调低会起草更远、回滚更多;调高则更早退回普通 decode。取值 0.0–1.0;0 也被接受,表示完全不设门限。环境变量 TS_SPEC_PMIN
--draft-model <path>所有以独立文件发布的草稿器共用的 GGUF 参数 —— DeepSeek V4 的 DSpark 支持模块、Muse-Glimmer 的 DFlash、Gemma 4 的 gemma4-assistant 草稿头。由文件自身的 general.architecture 决定加载方式(操作者从不需要选择机制),而指定这个文件本身就是请求:它自己就会启用投机,无需 --spec(显式的 --no-spec 可将其否决)。块级草稿器必须在模型分层切分之前就驻留,且 DSpark 只存在于 --backend cudaggml_cuda 上。Qwen 3.6、GLM-5.2 与 GLM-5.3 把 NextN 块嵌在主干 GGUF 内,不需要这个参数 —— GLM-5.3 在 blk.78 上带的是完整的一块,没有额外文件要下载 —— 但在 Qwen 3.6 上只有保留了该块的 GGUF 才算数,请用像 unsloth/Qwen3.6-35B-A3B-MTP-GGUF 这样保留 MTP 的导出;官方仓库用同样的文件名发布的版本已经把这个块剥掉了。环境变量:TS_DSV4_DSPARKTS_SPEC_DRAFT_MODEL。→ DSpark

--spec-type ngram 在完全不带草稿器的权重上也能跑。它靠把上下文原样引用回来起草,因此在答案本就大半写在提示词里的场景上最强:摘要、改写、翻译、重复性结构化输出与 agent 循环。在 Qwen3.5-9B(Q8_0、ggml_metal、M5 Pro)上实测 45.2 tok/s,对比普通解码的 31.4(1.44×),且输出逐字节一致

DiffusionGemma、基准测试与日志

选项说明
--diffusion-steps <N>DiffusionGemma 每块去噪步数(默认:48)。
--diffusion-seed <N>DiffusionGemma 确定性采样器种子(默认:0)。
--diffusion-blocks <N>块自回归画布数量(0--max-tokens 推导)。
--image <path> / --prompt <text> / --output <path>Qwen-Image-Edit:输入图像、编辑指令与输出 PNG(默认 edited.png)。复用 --diffusion-steps / --diffusion-seed
--cfg <F>Qwen-Image-Edit true-CFG 引导尺度(省略则自动取值:2.5,加载 Lightning LoRA 时为 1.0;<= 1 关闭负向分支)。
--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)。它作为运行期 F32 旁路挂在每个目标投影旁边 —— 量化后的基础权重原封不动,不会被合并 —— 并从文件名自动推导去噪步数(…-4steps-… / …8step…,取值 1–16),同时把 CFG 切换为 1.0 并固定 timestep shift 为 3。这会把默认的 30 步 / CFG 2.5(60 次 DiT 前向)降到 4–8 次。它要求整模或融合分块的 CUDA 前向路径:在没有旁路的路径上模型会直接抛错,而不是输出噪声。环境变量:TS_QWEN_IMAGE_LORA
--width <px> / --height <px>Qwen-Image-Edit 的固定输出尺寸(默认 0 = 自动:源图尺寸,并按显存上限收敛)。
--offload-cpu把 Qwen-Image-Edit 的 DiT 权重从内存流式读取,而不是常驻显存:每步更慢,但小显存卡也能做原生约 1 MP 的编辑。默认自动 —— 仅当目标分辨率放不下常驻权重时才启用。
--benchmark运行合成的 prefill/decode 吞吐基准。
--bench-prefill / --bench-decode / --bench-runs <N>合成的 prefill 长度、decode 长度与运行次数。
--bench-kvcache / --bench-kv-turns <N>多轮 KV 缓存复用基准(带缓存 vs 强制重置)。
--warmup-runs <N>计时前丢弃的前向次数(默认:0)。
--log-level <lvl>tracedebuginfowarningerrorcriticaloff
--log-dir <path> / --log-file <0|1> / --log-console <0|1>JSON 行文件日志的目录与开关。

视频生成(MiniMax-H3 · Wan 2.1 / 2.2)

以下参数在 --model 为视频生成 DiT(MiniMax-H3 或 Wan)时生效。--prompt 提供文本,--image 提供条件帧,--output 指定 MP4 文件名(默认 video.mp4;若扩展名写成 .png,则改为把各帧写成 PNG)。除非用 --diffusion-steps / --cfg 覆盖,去噪步数与引导强度都来自模型自身的配方。

选项说明
--video-mode <mode>在拥有多种条件模式的模型上,决定如何解释传入的图像。默认:根据你传了什么自动推断。MiniMax-H3 接受 t2v(纯文本)、i2v(图像就是首帧,会被驱动起来)、fl2v(首帧与尾帧)与 ref(图像是场景里的身份/外观参考)。i2v/fl2v 需要 fl2va 权重,ref 需要 ref2va —— 它们是不同的文件而不是开关。在 ref2va 上,单独的 --image 会被当作一个参考,因此只会附带一张图的客户端无需改动即可工作。
--width <px> / --height <px>输出画布。MiniMax-H3 会把每个维度向上取整到 32 的倍数(VAE 的 16× 空间比乘以 2×2 的 patch),默认 640×384 —— 这是模型卡自身的工作点,也是人脸还能保持连贯的最小尺寸;只传其中一个时,另一个按条件图像的宽高比推出。Wan 则对齐到它自己的 VAE 网格,并默认取官方配方的面积:TI2V-5B 为 1280×704,其余为 832×480。参考图像永远不会决定画布尺寸。
--video-frames <N>输出帧数,会对齐到模型自身的时间网格 —— Wan 为 4k+1,MiniMax-H3 为 17k+5;在模型允许时 1 表示只出一张静态图。默认取模型自身的值(33,Wan2.2-TI2V 为 49;MiniMax-H3 为 22)。帧数同时决定注意力开销与 VAE 解码耗时,是仅次于权重选择的第二大杠杆。
--fps <N>保存的 MP4 的播放帧率(默认 16,Wan2.2-TI2V 为 24 —— 即模型的训练帧率)。它只改变播放速度,不改变计算量。以固定帧率训练的模型(MiniMax-H3,24 fps)会覆盖任何其他取值。
--end-image <file>尾帧条件图像,用于接受它的模型(MiniMax-H3 的首尾帧模式)。与 --image 一起使用时,片段会被引导为从这两帧开始并结束。
--ref-image <file>参考条件模型(MiniMax-H3 Ref2VA)的参考图像:主体被保留,而镜头、背景与构图来自提示词。可重复,最多 9 个;提示词按位置以 <Picture 1><Picture 2>…… 引用它们。参考图只会被缩小并保持自身宽高比,因此输出尺寸仍由 --width/--height 决定。去噪开销是线性而且平坦的 —— 在 RTX 3080 Laptop 上(640×384、22 帧,从一个参考到八个参考),每个参考每步约 626 ms。但超过大约四个之后,主导开销就不再是去噪器,而是文本那一遍:每个参考会给提示词加上约 250 个视觉占位 token,并要穿过 Qwen3-VL 的全部 50 层做 prefill —— 所以在削减步数之前,先考虑用更少、更好的参考。
--ref-video <path>参考视频片段,可重复;提示词中以 <Video 1><Video 2>…… 引用。既接受视频文件,也接受一个帧目录;两种情况都会被重采样到模型自身的 24 fps 与画布。参考片段是 H3 代价最高的一类输入:一段 22 帧、448×320 的片段会在输出本身所需的 1680 个 token 之上再加 980 个条件 token,而且 VAE 必须先把这 22 帧全部编码完,第一步去噪才能开始。要给它配音轨请用 --ref-video-audio
--ref-video-audio <file>同一位置的参考视频配对的音轨 —— 第一个对应第一个 --ref-video,依此类推。之所以与 --ref-video 分开,是因为容器里的音轨无法通过帧解码器读取。想要一段无声的参考片段就省略它。支持 WAV、MP3 或 Ogg。
--ref-audio <file>独立的参考音轨,可重复;提示词中以 <Audio 1><Audio 2>…… 引用。会被重采样到音频 VAE 的 32 kHz 立体声,并截断到所生成片段的时长。
--no-audio在与视频联合生成音轨的模型(MiniMax-H3)上跳过音频解码,只要画面时可省下音频 VAE 的时间与显存。纯视频模型会忽略它。
--flow-shift <F>FlowMatch timestep shift(默认 0 = 模型官方配方:Wan 2.2 为 5.0,A14B T2V 为 12.0;Wan 2.1 中 1.3B 模型的视频运行为 8.0,其余 ≤ 480p 为 3.0、更高为 5.0;MiniMax-H3 为 12.0)。在带联合音频流的模型上,该 shift 只作用于视频流。
--sampler <name>unipc(Wan 官方采样器;多步预测-校正,在相同步数下质量更好)或 euler。默认取模型自身的值 —— Wan 为 unipc。它是 Wan 家族的旋钮:MiniMax-H3 走自己的 flow-match 调度,会忽略它。
--negative-prompt <text>无分类器引导使用的负向提示词(默认为模型官方的负向提示词)。在 --cfg 1.0 下不会被用到,因为根本不跑负向分支 —— 所以它对步数蒸馏的 Wan 权重、以及 CFG 蒸馏的 MiniMax-H3 都没有作用。
--cfg-cache-stride <N>引导缓存:每 N 步才跑一次无条件 CFG 分支,其余步复用缓存的引导方向(前三步与最后一步始终重算)。50 步时,2 只跑 100 次前向中的 77 次(快 1.30×),3 跑 70 次(1.43×)。默认 0 = 关闭。它是一种近似 —— 需要对齐参考样本时请保持关闭;另外在 --cfg 1.0 下它没有意义,因为根本没有无条件分支可缓存。
--diffusion-steps <N> / --cfg <F>覆盖配方或自动识别到的蒸馏取值。在基础 Wan 权重上用 30 步替代 50 步,观感非常接近而开销少 1.7×。MiniMax-H3 经过 CFG 蒸馏:默认 20 步,任何高于 1.0--cfg 都会被拒绝,而 4–8 步是它的快速工作点。
--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 仍被接受。需要哪个 VAE 由 DiT 自己决定,而不是由你指定。
--video-text-encoder <path>文本编码器 GGUF —— Wan 用 UMT5-XXL,MiniMax-H3 用 Qwen3-VL-32B。默认在同目录扫描。也可写作 --video-te;环境变量 TS_VIDEO_TEXT_ENCODER,旧写法 --wan-te 仍可用。H3 的编码器不附带分词器 —— 请把 vocab.jsonmerges.txt 放在它旁边,或用 TS_VIDEO_TOKENIZER 指向存放它们的目录。
--video-dit2 <path>双专家模型的第二个扩散专家(Wan 2.2 A14B 的 high/low noise 一对)。默认按文件名在第一个专家旁边自动解析。环境变量:TS_VIDEO_DIT2;旧写法 --wan-dit2 仍被接受。
--audio-vae <path>与视频联合生成音轨的模型所用的音频 VAE(minimax_h3_audio_vae_fp32.safetensors)。不传它这类模型照样能跑并产出视频,只是没有声音。环境变量:TS_VIDEO_AUDIO_VAE

在视频家族中,Wan 可运行于 ggml_cudaggml_vulkanggml_metalggml_cpucudacpu —— 它是唯一会直接拒绝 --backend mlx 的模型族。Wan 与 MiniMax-H3 都不支持 --tp。→ MiniMax-H3 实测数据 · Wan 后端耗时与成本模型

完整参考(含 --test--test-templates 与分块 prefill 正确性检查)见 API 参考 页。

Agent Skills(智能体技能)

一个技能就是一份 SKILL.md 加上脚本、参考文档与素材。CLI 先展示名称与描述;对于能调用工具的模型,即使显式选中技能,启动时也只放元数据,模型决定使用后再通过 skills_read 读取说明。无法完成工具往返的家族才会把选中技能正文内联。→ 功能概览 · 通过 HTTP 使用 · 在 C# 中使用 · 智能体架构

选项说明
--skills-dir <path>扫描 Agent Skills 的目录(可以是装着若干 SKILL.md 的文件夹,也可以是单个技能目录)。可重复;按给出的顺序扫描,最深三层。不传时使用二进制文件旁的 skills 目录,不存在则创建。传入的路径不存在会在启动时报错并点名该参数。环境变量:TS_SKILLS_DIR(以路径分隔符分隔的列表)。
--skill <name>SKILL.md 中的名称为本次运行选中技能。可重复。选中会展示其元数据并允许读取;能调用工具的模型仍按需读取正文。
--list-skills打印技能注册表——名称、描述、来源、随包文件、大小,以及任何加载告警或错误——然后退出。
--no-skills彻底关闭 Agent Skills:不扫描、不注入提示词块、不提供工具。环境变量:TS_NO_SKILLS(非 0 即视为开启)。
--skills-no-discovery不向模型展示未被选中的技能。不加时,所有已注册技能的名称与描述都会列出,好让模型自己发现你没想到要点名的那个;加上后,本次运行只看得到 --skill 选中的技能。
--skills-allow-exec声明 skills_run,允许模型运行选中技能自带的脚本。默认关闭;这仍是任意代码执行。路径检查、解释器白名单、清洗环境、关闭 stdin、60 秒期限与 stdout/stderr 各 32 KiB 上限始终生效;OS 隔离由 --skills-sandbox 决定。环境变量:TS_SKILLS_ALLOW_EXEC
--skills-sandbox <off|preferred|required>脚本隔离策略。默认 required,若无法约束写入、网络与主目录读取就拒绝;preferred 可在报告缺口后继续;off 只保留进程内限制。macOS 使用 Seatbelt,Linux 需要 bubblewrap 0.12+;Windows job object 无法约束文件或网络。环境变量:TS_SKILLS_SANDBOX
--skills-allow-network允许技能脚本联网;默认禁止,并与代码执行的联网权限彼此独立。环境变量:TS_SKILLS_ALLOW_NETWORK
--skills-max-rounds <n>内部模型 / 工具生成次数上限,范围 1–64。技能披露默认 8;提供 --code-exec 时自动提高到 24,但显式设置的值原样保留。环境变量:TS_SKILLS_MAX_ROUNDS
# 查看注册了哪些技能、来自哪里,以及是否有加载告警
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --skills-dir ~/skills --list-skills

# 选中一个技能的一次性推理
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal \
    --skills-dir ~/skills --skill pdf --input prompt.txt --max-tokens 600

# 两个技能,且关闭发现:模型只看得到这两个,别的都看不到
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_cuda --skills-dir ~/skills \
    --skill pdf --skill xlsx --skills-no-discovery --input prompt.txt

# 交互式,并允许执行脚本(自己的机器、自己的技能)
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal --skills-dir ~/skills \
    --skills-allow-exec -i

同样的参数拼写在配置文件"skills-dir": ["/srv/skills"])和 TensorSharp.Server 上都成立,因此一份配置文件可以同时驱动两个宿主。多个目录按优先级顺序扫描,安装目录排在最前;两个目录之间的重名会直接报错,而不是靠自动改名解决。在 REPL 里,/skills/skill <name> 对单次会话起同样的作用——见交互式 REPL 命令。可直接取用的开源技能:github.com/anthropics/skills;完整参考见 docs/agent_skills.md

🔒

技能属于不受信任的内容。模型点名的每条路径都经过词法、规范化与符号链接检查,一个技能不能读取另一个技能。脚本执行仍是运维的信任决定:默认要求沙箱,但 macOS 会开放共享的 /private/tmp,且无法保证清理故意脱离的子进程;Windows 必须改用 preferred 才会运行,因为 job object 无法约束文件或网络。不要在面向不可信用户的共享服务上为不可信技能开启它。

智能体工作与代码执行

--code-exec 启用有界的单助手模型 / 工具循环。TensorSharp 声明并执行五个内置工具:read_fileedit_filewrite_fileshell 与原子化的 apply_patch;通过 --tools 提供的调用方工具仍回传调用方处理。这里没有子智能体运行时,也没有逐命令审批提示;下列启动参数就是运维授权。→ 智能体工作

选项说明
--code-exec提供全部五个内置工具。默认关闭;环境变量 TS_CODE_EXEC。没有持久工作区的直接调用方只能得到 shell,但 CLI 会话会保留工作区。
--code-exec-allow-install允许宿主代为执行 pip/npm 安装,写入会话共享环境。默认关闭;不会赋予生成命令联网权限。环境变量:TS_CODE_EXEC_ALLOW_INSTALL
--code-exec-packages <list>识别出的宿主安装器可装的软件包白名单,逗号分隔;空表示任意合法包。命令联网后它不再是出口边界。
--code-exec-install-domains <list> · --code-exec-install-index <url>安装器可访问的主机(默认 pypi.org,files.pythonhosted.org,registry.npmjs.org),以及运维指定的软件包索引。
--code-exec-allow-network赋予模型生成命令不受限的宿主 IP 网络访问,包括 LAN / loopback 与监听 socket。默认关闭,并与安装权限、--skills-allow-network 相互独立。环境变量:TS_CODE_EXEC_ALLOW_NETWORK
--code-exec-timeout <seconds> · --code-exec-max-output <bytes>单命令默认期限(120 秒;调用最多可请求 10 分钟)与从中间截断的输出上限(32768 字节)。
--code-exec-shell <path|name>覆盖自动检测到的 POSIX shell 或 PowerShell 程序。
--code-exec-temperature <0..2>可选的代码轮温度覆盖;只替换仍为默认值的温度。只要代码工具可运行,代码轮就会关闭内置的 1.1 重复惩罚,即使未设置此参数也是如此。
--code-exec-unconfined在 OS 隔离不足时仍显式运行。Windows 必须使用;切勿为不可信宿主用户开启。
--code-exec-languages已移除,启动时会直接拒绝。没有替代参数:shell 能访问每次重建的 PATH 上所有解释器,因此 TensorSharp 只报告已安装项,不再假装能实施语言白名单。
# 持久交互工作区;命令仍默认离线
dotnet run --project TensorSharp.Cli/TensorSharp.Cli.csproj -- \
    --model <model.gguf> --backend ggml_metal --code-exec -i

CLI 会在整段聊天中保留同一个工作区、当前目录、允许保留的导出环境状态与安装的软件包;技能脚本也与代码工具共用它。PATH 会在每次调用时刻意重建,因此靠修改 PATH 激活虚拟环境不会跨调用保留。每条命令仍是一个新的受约束进程。Linux bubblewrap 0.12+ 会约束写入、主目录读取、网络与后代进程;macOS Seatbelt 约束写入 / 主目录 / 网络,但会报告故意脱离的子进程可能比请求活得更久;Windows 只提供进程树限制,因此在 required 模式下拒绝执行。生成文件以本地路径报告。当前无法返回工具调用的模型——qwen4exp,以及不声明工具的 Mistral 3——不会得到代码工具。

交互式 REPL 命令

--interactive / -i 启动。任何不以 / 开头的内容都是一轮用户输入;输入 /help 查看列表。提示头显示当前模型、后端、架构、上下文长度、投影器、对话深度与待发送附件。生成时按 Ctrl+C 中断;在提示符处按 Ctrl+C 退出。

对话

命令说明
/help/?显示所有交互命令。
/exit/quit离开会话。
/reset/new清空对话历史与 KV 缓存。
/history · /save <file>打印对话 / 将记录写入文件。
/system <text>设置系统提示(空参数会清除它)。
/think on|off · /multiline on|off切换推理模式 / 多行输入。

Agent Skills

命令说明
/skills列出已注册的 Agent Skills,并标出本会话中哪些处于启用状态。
/skill <name>为本会话开启或关闭某个技能。与 /system 一样会重置对话——技能文本块位于提示词最前端。

模型与运行时

命令说明
/info/status显示已加载模型、后端、架构、上下文/词表大小、投影器、深度。
/model <path>在当前后端上加载另一个 .gguf(重置会话)。
/backend <name>在另一后端上重新加载当前模型。
/mmproj <path>加载或替换多模态投影器。别名:/projector

采样(实时)与上传(下一轮)

命令说明
/sampling/show打印当前采样配置。
/max · /temp · /topk · /topp · /minp设置回复长度 / 温度 / top-k / top-p / min-p。
/repeat · /presence · /frequency · /seed设置惩罚与随机种子。
/stop <text> · /clearstop添加 / 清除停止序列。
/image <path> · /audio · /video · /text为下一轮附加媒体或内联一个文本文件。
/clearattach丢弃待发送附件而不发送一轮。