OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  lmstudio-subagents:通过本地模型子智能体降低付费 API Token 消耗

lmstudio-subagents:通过本地模型子智能体降低付费 API Token 消耗

 
  gateway ·  2026-02-24 07:45:43 · 2 次点击  · 0 条评论  

名称: 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


LM Studio 模型

在质量满足要求时,将任务分流至本地模型。基础 URL:http://127.0.0.1:1234。认证方式:Authorization: Bearer lmstudio。instance_id = loaded_instances[].id(同一模型可能有多个实例,例如 keykey:2)。

关键术语

  • model:来自 GET models 响应中的 key;用于聊天和可选的加载操作。
  • lm_studio_api_url:默认 http://127.0.0.1:1234(路径为 /api/v1/...)。
  • response_id / previous_response_id:聊天返回 response_id;在状态保持对话中,将其作为 previous_response_id 传入。
  • instance_id:用于卸载操作,仅使用 GET /api/v1/models 响应中对应模型的 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

完整工作流

步骤 0:预检

GET /api/v1/models;若非 200 状态码或连接错误,表示服务器未就绪。

exec command:"curl -s -o /dev/null -w '%{http_code}' -H 'Authorization: Bearer lmstudio' http://127.0.0.1:1234/api/v1/models"

步骤 1:列出模型并选择

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 以便后续可选卸载。

步骤 2:模型选择

从 GET 响应中选取 key;作为 model 参数用于聊天(可选加载)。约束条件:视觉任务 -> capabilities.vision;嵌入任务 -> type=embedding;上下文长度 -> max_context_length。优先选择已加载的模型(loaded_instances 非空),速度优先选较小模型/推理优先选较大模型;备选主模型。如果不确定,使用该 key 的第一个加载实例,或适合任务的最小已加载模型。可选 POST 加载;否则首次聊天时即时加载。

步骤 3:加载模型(可选)

可选:POST /api/v1/models/load { model, context_length?, ... }。或运行 scripts/load.mjs <model>。即时加载:首次聊天时加载;显式加载仅用于特定选项。

步骤 4:验证加载状态(可选)

如果显式加载:GET models,确认 loaded_instances。如果即时加载:无需验证;首次聊天返回 model_instance_id、stats.model_load_time_seconds。

步骤 5:调用 API

从技能文件夹运行: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=。Curl:POST /api/v1/chat,请求体包含 model、input、store、temperature、max_output_tokens;可选 previous_response_id。解析:output (type message) -> content;response_id、model_instance_id、stats。脚本输出 content、model_instance_id、response_id、usage。

步骤 6:卸载(可选)

对于使用的模型 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>\"}'"

步骤 7:验证卸载(可选)

卸载后,确认该模型 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 并重新运行。

错误处理

  • 脚本在临时故障时重试(2-3 次,带退避)。
  • 模型未找到 -> 从 GET 响应中选择另一个模型。
  • API/服务器错误 -> GET models,检查 URL。
  • 无效输出 -> 重试。
  • 内存不足 -> 卸载或选择更小模型。
  • 卸载失败 -> instance_id 必须完全来自 GET /api/v1/models 中该模型的 loaded_instances[].id(除非匹配,否则不要使用模型 key)。

复制粘贴

<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"

LM Studio API 详情

辅助函数/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:冒烟测试(加载、聊天、卸载一个模型)。

注意事项

  • 需 LM Studio 0.4+。
  • 即时加载(首次聊天时加载;stats 中包含 model_load_time_seconds);状态保持(response_id / previous_response_id)。
2 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor