名称: lmstudio-subagents
描述: "通过将任务分流至本地 LM Studio 模型,减少对付费服务商的令牌消耗。适用场景:(1) 成本控制——在质量满足要求时,使用本地模型进行摘要、提取、分类、改写、初稿审阅、头脑风暴等任务;(2) 避免对高频率或重复性任务调用付费 API;(3) 无需额外模型配置——即时加载与 REST API 兼容现有 LM Studio 设置;(4) 纯本地或隐私敏感的工作。要求 LM Studio 0.4+ 并启动服务器(默认端口 :1234)。无需 CLI。"
元数据: {"openclaw":{"requires":{},"tags":["local-model","local-llm","lm-studio","token-management","privacy","subagents"]}}
许可证: MIT
在质量满足要求时,将任务分流至本地模型。基础 URL:http://127.0.0.1:1234。认证方式:Authorization: Bearer lmstudio。instance_id = loaded_instances[].id(同一模型可能有多个实例,例如 key 和 key:2)。
loaded_instances[].id 值。不要假定它等于模型 key;多实例情况下 ID 可能类似 key:2。LM Studio 文档:List (loaded_instances[].id), Unload (instance_id)。前置元数据中的触发器;以下为具体实现。
LM Studio 0.4+,服务器运行于 :1234 端口,模型已存储在磁盘;可通过 API 加载/卸载(支持即时加载);运行脚本需 Node(也可使用 curl)。
最简路径:列出模型,然后进行一次聊天。将 <model> 替换为 GET /api/v1/models 响应中的 key,<task> 替换为任务文本。
curl -s -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models
node scripts/lmstudio-api.mjs <model> '<task>' --temperature=0.5 --max-output-tokens=200
状态保持的多轮对话:将前一次脚本输出的 --previous-response-id=<id> 传入。或使用 --stateful 自动持久化 response_id。可选 --log <路径> 记录请求/响应。
node scripts/lmstudio-api.mjs <model> '第一轮...' --previous-response-id=$ID1
node scripts/lmstudio-api.mjs <model> '第二轮...' --previous-response-id=$ID2
GET
exec command:"curl -s -o /dev/null -w '%{http_code}' -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models"
GET /api/v1/models 列出模型。解析每个条目:key、type、loaded_instances、max_context_length、capabilities。如果某个模型的 loaded_instances.length > 0 且适合任务,则跳至步骤 5;否则选择一个 key 用于聊天(并可在步骤 3 可选加载)。根据任务选择:视觉任务 -> capabilities.vision;嵌入任务 -> type=embedding;上下文长度 -> max_context_length。优先选择已加载的模型;速度优先选较小模型,推理优先选较大模型。记录 loaded_instances[].id 以便后续可选卸载。
示例——列出模型:
exec command:"curl -s -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models"
解析 models[](key、type、loaded_instances、max_context_length、capabilities、params_string)。如果某模型 loaded_instances.length > 0 且适合任务,跳至步骤 5;否则选择 key 用于聊天(并可选加载)。记录 loaded_instances[].id 以便后续可选卸载。
从 GET 响应中选取 key;作为 model 参数用于聊天(可选加载)。约束条件:视觉任务 -> capabilities.vision;嵌入任务 -> type=embedding;上下文长度 -> max_context_length。优先选择已加载的模型(loaded_instances 非空),速度优先选较小模型/推理优先选较大模型;备选主模型。如果不确定,使用该 key 的第一个加载实例,或适合任务的最小已加载模型。可选 POST 加载;否则首次聊天时即时加载。
可选:POST /api/v1/models/load { model, context_length?, ... }。或运行 scripts/load.mjs <model>。即时加载:首次聊天时加载;显式加载仅用于特定选项。
如果显式加载:GET models,确认 loaded_instances。如果即时加载:无需验证;首次聊天返回 model_instance_id、stats.model_load_time_seconds。
从技能文件夹运行:node scripts/lmstudio-api.mjs <model> '<task>' [选项]。
exec command:"node scripts/lmstudio-api.mjs <model> '<task>' --temperature=0.7 --max-output-tokens=2000"
状态保持:添加 --previous-response-id=
对于使用的模型 key:GET /api/v1/models,然后针对该模型 每个 loaded_instances[].id,POST /api/v1/models/unload,请求体为 {"instance_id": "<该 id>"}。仅使用响应中的 id(不要发送模型 key,除非它完全等于该 id)。或运行 scripts/unload.mjs <model_key>(脚本执行 GET 然后卸载每个实例 id)。可选 --unload-after(默认关闭);使用 --keep 保持加载状态。仅卸载该模型的实例。即时加载+TTL 自动卸载;需要时显式卸载。
# 每个 instance_id 执行一次卸载;对该模型的每个 loaded_instances 中的 id 重复执行
exec command:"curl -s -X POST http://127.0.0.1:1234/api/v1/models/unload -H 'Content-Type: application/json' -H 'Authorization: Bearer lmstudio' -d '{\"instance_id\": \"<instance_id>\"}'"
卸载后,确认该模型 key 没有剩余实例。运行下面的 jq 检查;结果必须为 0。若非零,卸载该模型剩余的 instance_id(s) 并重新检查。不要从“模型对象存在”推断;模型对象仍存在,但 loaded_instances 数组为空。
exec command:"curl -s -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models | jq '.models[]|select(.key==\"<model_key>\")|.loaded_instances|length'"
期望输出 0。如果不是,卸载剩余的 instance_ids 并重新运行。
将 <model> 替换为 GET /api/v1/models 响应中的 key,<task> 替换为任务文本。可选按步骤 6 卸载(使用该 key 的 GET models 响应中的 instance_id)。
exec command:"curl -s -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models"
exec command:"node scripts/lmstudio-api.mjs <model> '<task>' --temperature=0.7 --max-output-tokens=2000"
辅助函数/API:见步骤 5。输出:content、model_instance_id、response_id、usage。认证:Bearer lmstudio。列表 GET /api/v1/models。加载 POST /api/v1/models/load(可选)。卸载 POST /api/v1/models/unload { instance_id }。
lmstudio-api.mjs:聊天;选项包括 --stateful、--unload-after、--keep、--log <路径>、--previous-response-id、--temperature、--max-output-tokens。load.mjs:按 key 加载模型。unload.mjs:按模型 key 卸载所有实例。test.mjs:冒烟测试(加载、聊天、卸载一个模型)。