dsh-local-ai 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.es.md +9 -0
- package/README.hi.md +9 -0
- package/README.md +11 -0
- package/README.pt.md +9 -0
- package/README.zh.md +9 -0
- package/cordis.patch.yml +14 -2
- package/lib/index.js +644 -64
- package/lib/types/config.d.ts +40 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/config.js +92 -24
- package/lib/types/config.js.map +1 -1
- package/lib/types/index.d.ts +12 -9
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +22 -9
- package/lib/types/index.js.map +1 -1
- package/lib/types/openai-adapter.d.ts +37 -0
- package/lib/types/openai-adapter.d.ts.map +1 -0
- package/lib/types/openai-adapter.js +181 -0
- package/lib/types/openai-adapter.js.map +1 -0
- package/lib/types/openai-serialize.d.ts +61 -0
- package/lib/types/openai-serialize.d.ts.map +1 -0
- package/lib/types/openai-serialize.js +115 -0
- package/lib/types/openai-serialize.js.map +1 -0
- package/lib/types/openai-translate.d.ts +53 -0
- package/lib/types/openai-translate.d.ts.map +1 -0
- package/lib/types/openai-translate.js +168 -0
- package/lib/types/openai-translate.js.map +1 -0
- package/lib/types/openai.d.ts +30 -0
- package/lib/types/openai.d.ts.map +1 -0
- package/lib/types/openai.js +109 -0
- package/lib/types/openai.js.map +1 -0
- package/lib/types/route.d.ts +19 -8
- package/lib/types/route.d.ts.map +1 -1
- package/lib/types/route.js +26 -10
- package/lib/types/route.js.map +1 -1
- package/lib/types/version.d.ts +1 -1
- package/lib/types/version.js +1 -1
- package/package.json +1 -1
- package/src/config.ts +127 -19
- package/src/index.ts +24 -10
- package/src/openai-adapter.ts +145 -0
- package/src/openai-serialize.ts +147 -0
- package/src/openai-translate.ts +208 -0
- package/src/openai.ts +121 -0
- package/src/route.ts +28 -11
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,12 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.2.0] - 2026-08-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- OpenAI-compatible multi-backend provider (LM Studio / vLLM / llama.cpp) with route-provider routing.
|
|
13
|
+
|
|
8
14
|
## [0.1.5] - 2026-08-23
|
|
9
15
|
|
|
10
16
|
### Added
|
package/README.es.md
CHANGED
|
@@ -109,8 +109,16 @@ Todos los ajustes son campos `Config` de Schemastery (modificables desde cordis.
|
|
|
109
109
|
| `models[].contextWindow` | *(none)* | Capacidad de contexto por modelo |
|
|
110
110
|
| `models[].maxTokens` | *(none)* | Límite de salida por modelo |
|
|
111
111
|
| `models[].temperature` | *(none)* | Temperatura de muestreo por modelo |
|
|
112
|
+
| `backends` | `[]` | Backends locales compatibles con OpenAI (LM Studio / vLLM / llama.cpp) |
|
|
113
|
+
| `backends[].name` | *(required)* | Nombre del backend; registra el id de proveedor `openai:<name>` |
|
|
114
|
+
| `backends[].baseURL` | *(required)* | URL base del backend (incluye `/v1`), p. ej. `http://127.0.0.1:1234/v1` |
|
|
115
|
+
| `backends[].apiKey` | *(none)* | Clave bearer opcional (la mayoría de servidores locales la dejan vacía) |
|
|
116
|
+
| `backends[].models` | `[]` | Mapeos de nombre visible → modelo del backend |
|
|
117
|
+
| `backends[].maxTokens` | `4096` | Límite de salida por backend cuando un modelo no tiene valor exacto |
|
|
118
|
+
| `backends[].temperature` | *(none)* | Temperatura de muestreo por backend |
|
|
112
119
|
| `route` | `[]` | Reglas de enrutamiento a modelos locales (primera coincidencia gana) |
|
|
113
120
|
| `route[].model` | *(required)* | Nombre del modelo local destino |
|
|
121
|
+
| `route[].provider` | `ollama` | Id del proveedor destino: `ollama` u `openai:<name>` |
|
|
114
122
|
| `route[].purpose` | *(none)* | Coincidencia de tipo de tarea: `compaction` / `session-title` |
|
|
115
123
|
| `route[].keywords` | `[]` | Palabras clave de solicitud (sin distinguir mayúsculas) |
|
|
116
124
|
| `route[].always` | `false` | Enruta toda solicitud elegible a este modelo |
|
|
@@ -171,6 +179,7 @@ pnpm pack # el tarball publicado
|
|
|
171
179
|
## Contributors
|
|
172
180
|
|
|
173
181
|
- [@PerryLink](https://github.com/PerryLink) — creador y mantenedor: adaptador, enrutamiento, herramientas, comprobación de estado, desinfección y documentación en cinco idiomas.
|
|
182
|
+
- [@LABEST-IA](https://github.com/LABEST-IA) — corrección del CallId de las llamadas a herramientas (PR #2), y los informes sobre la ranura de llamadas a herramientas y el soporte de visión (issues #1, #3, #5).
|
|
174
183
|
|
|
175
184
|
## PerryLink DSH Plugin Family
|
|
176
185
|
|
package/README.hi.md
CHANGED
|
@@ -109,8 +109,16 @@ dsh --profile web --dump-config | grep -A2 'id: dsh-local-ai'
|
|
|
109
109
|
| `models[].contextWindow` | *(none)* | प्रति-मॉडल संदर्भ क्षमता |
|
|
110
110
|
| `models[].maxTokens` | *(none)* | प्रति-मॉडल आउटपुट सीमा |
|
|
111
111
|
| `models[].temperature` | *(none)* | प्रति-मॉडल सैंपलिंग तापमान |
|
|
112
|
+
| `backends` | `[]` | OpenAI-संगत स्थानीय बैकएंड (LM Studio / vLLM / llama.cpp) |
|
|
113
|
+
| `backends[].name` | *(required)* | बैकएंड नाम; provider id `openai:<name>` पंजीकृत करता है |
|
|
114
|
+
| `backends[].baseURL` | *(required)* | बैकएंड base URL (`/v1` सहित), जैसे `http://127.0.0.1:1234/v1` |
|
|
115
|
+
| `backends[].apiKey` | *(none)* | वैकल्पिक bearer API key (अधिकांश स्थानीय सर्वर इसे खाली छोड़ते हैं) |
|
|
116
|
+
| `backends[].models` | `[]` | दृश्य नाम → बैकएंड मॉडल मैपिंग |
|
|
117
|
+
| `backends[].maxTokens` | `4096` | बिना सटीक मान वाले मॉडल के लिए प्रति-बैकएंड आउटपुट सीमा |
|
|
118
|
+
| `backends[].temperature` | *(none)* | प्रति-बैकएंड सैंपलिंग तापमान |
|
|
112
119
|
| `route` | `[]` | स्थानीय-मॉडल रूटिंग नियम (पहला मेल जीतता है) |
|
|
113
120
|
| `route[].model` | *(required)* | लक्ष्य स्थानीय मॉडल नाम |
|
|
121
|
+
| `route[].provider` | `ollama` | लक्ष्य प्रदाता id: `ollama` या `openai:<name>` |
|
|
114
122
|
| `route[].purpose` | *(none)* | कार्य-प्रकार मेल: `compaction` / `session-title` |
|
|
115
123
|
| `route[].keywords` | `[]` | केस-असंवेदी अनुरोध कीवर्ड |
|
|
116
124
|
| `route[].always` | `false` | हर पात्र अनुरोध को इस मॉडल पर रूट करें |
|
|
@@ -171,6 +179,7 @@ pnpm pack # प्रकाशित tarball
|
|
|
171
179
|
## Contributors
|
|
172
180
|
|
|
173
181
|
- [@PerryLink](https://github.com/PerryLink) — निर्माता व अनुरक्षक: एडाप्टर, रूटिंग, टूल, स्वास्थ्य जाँच, सैनिटाइज़ेशन और पाँच-भाषा दस्तावेज़।
|
|
182
|
+
- [@LABEST-IA](https://github.com/LABEST-IA) — टूल-कॉल CallId सुधार (PR #2), तथा टूल-कॉल स्लॉट व विज़न-समर्थन रिपोर्टें (issues #1, #3, #5)।
|
|
174
183
|
|
|
175
184
|
## PerryLink DSH Plugin Family
|
|
176
185
|
|
package/README.md
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
- **Discovery & management** — `ollama_list` (installed models, running models, disk usage), `ollama_show` (parameter size, quantization, context length), `ollama_pull`, and `ollama_remove`.
|
|
38
38
|
- **Health check** — process liveness (via the `ollama` CLI) and API responsiveness (via `/api/version`), reported as two independent signals.
|
|
39
39
|
- **Official adapter** — the `ollama` provider route is registered through `ctx.llm.registerAdapter` (`LlmAdapter`), with configurable model mapping and temperature / max-tokens / stop translation.
|
|
40
|
+
- **OpenAI-compatible backends** — LM Studio, vLLM, and llama.cpp `--server` each register as their own `openai:<name>` provider through the same `LlmAdapter` seam, reusing one OpenAI `/v1/chat/completions` adapter (text-only route).
|
|
40
41
|
- **Local routing** — `model_route` rules route requests to a local model by task type (`purpose`), case-insensitive keyword, or `always`, with automatic fallback to the cloud when the local route fails before producing content.
|
|
41
42
|
- **`/ollama` command** — a one-shot status overview: models, disk usage, health, and suggestions.
|
|
42
43
|
- **Zero dependencies, HTTP first** — everything talks to Ollama's HTTP API (the CLI is used only for the process probe); no model files are bundled.
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
request (loop)
|
|
46
47
|
│ llm/stream waterfall
|
|
47
48
|
├─ rule matches? ──▶ route to ollama ──▶ Ollama /api/chat (NDJSON stream)
|
|
49
|
+
│ └─▶ route to openai:<name> ─▶ /v1/chat/completions (SSE)
|
|
48
50
|
│ └─ fails first ─▶ fall back to cloud (next())
|
|
49
51
|
└─ no match ──▶ cloud provider
|
|
50
52
|
tools ──▶ /api/tags · /api/ps · /api/show · /api/pull · /api/delete
|
|
@@ -110,8 +112,16 @@ All tunables are Schemastery `Config` fields (changeable from cordis.yml). An id
|
|
|
110
112
|
| `models[].contextWindow` | *(none)* | Per-model context capacity |
|
|
111
113
|
| `models[].maxTokens` | *(none)* | Per-model output cap |
|
|
112
114
|
| `models[].temperature` | *(none)* | Per-model sampling temperature |
|
|
115
|
+
| `backends` | `[]` | OpenAI-compatible local backends (LM Studio / vLLM / llama.cpp) |
|
|
116
|
+
| `backends[].name` | *(required)* | Backend name; registers provider id `openai:<name>` |
|
|
117
|
+
| `backends[].baseURL` | *(required)* | Backend base URL including `/v1`, e.g. `http://127.0.0.1:1234/v1` |
|
|
118
|
+
| `backends[].apiKey` | *(none)* | Optional bearer API key (most local servers leave it empty) |
|
|
119
|
+
| `backends[].models` | `[]` | Harness-visible → backend model mappings |
|
|
120
|
+
| `backends[].maxTokens` | `4096` | Per-backend output cap used when a model has no exact value |
|
|
121
|
+
| `backends[].temperature` | *(none)* | Per-backend sampling temperature |
|
|
113
122
|
| `route` | `[]` | Local-model routing rules (first match wins) |
|
|
114
123
|
| `route[].model` | *(required)* | Target local model name |
|
|
124
|
+
| `route[].provider` | `ollama` | Target provider id: `ollama` or `openai:<name>` |
|
|
115
125
|
| `route[].purpose` | *(none)* | Task type match: `compaction` / `session-title` |
|
|
116
126
|
| `route[].keywords` | `[]` | Case-insensitive request keywords |
|
|
117
127
|
| `route[].always` | `false` | Route every eligible request to this model |
|
|
@@ -172,6 +182,7 @@ pnpm pack # the published tarball
|
|
|
172
182
|
## Contributors
|
|
173
183
|
|
|
174
184
|
- [@PerryLink](https://github.com/PerryLink) — creator and maintainer: adapter, routing, tools, health check, sanitization, and the five-language docs.
|
|
185
|
+
- [@LABEST-IA](https://github.com/LABEST-IA) — tool-call CallId fix (PR #2), and the tool-call slot and vision-support reports (issues #1, #3, #5).
|
|
175
186
|
|
|
176
187
|
## PerryLink DSH Plugin Family
|
|
177
188
|
|
package/README.pt.md
CHANGED
|
@@ -109,8 +109,16 @@ Todos os ajustes são campos `Config` de Schemastery (modificáveis pelo cordis.
|
|
|
109
109
|
| `models[].contextWindow` | *(none)* | Capacidade de contexto por modelo |
|
|
110
110
|
| `models[].maxTokens` | *(none)* | Limite de saída por modelo |
|
|
111
111
|
| `models[].temperature` | *(none)* | Temperatura de amostragem por modelo |
|
|
112
|
+
| `backends` | `[]` | Backends locais compatíveis com OpenAI (LM Studio / vLLM / llama.cpp) |
|
|
113
|
+
| `backends[].name` | *(required)* | Nome do backend; registra o id de provedor `openai:<name>` |
|
|
114
|
+
| `backends[].baseURL` | *(required)* | URL base do backend (inclui `/v1`), ex. `http://127.0.0.1:1234/v1` |
|
|
115
|
+
| `backends[].apiKey` | *(none)* | Chave bearer opcional (a maioria dos servidores locais deixa vazia) |
|
|
116
|
+
| `backends[].models` | `[]` | Mapeamentos de nome visível → modelo do backend |
|
|
117
|
+
| `backends[].maxTokens` | `4096` | Limite de saída por backend quando um modelo não tem valor exato |
|
|
118
|
+
| `backends[].temperature` | *(none)* | Temperatura de amostragem por backend |
|
|
112
119
|
| `route` | `[]` | Regras de roteamento para modelos locais (primeira correspondência vence) |
|
|
113
120
|
| `route[].model` | *(required)* | Nome do modelo local de destino |
|
|
121
|
+
| `route[].provider` | `ollama` | Id do provedor de destino: `ollama` ou `openai:<name>` |
|
|
114
122
|
| `route[].purpose` | *(none)* | Correspondência de tipo de tarefa: `compaction` / `session-title` |
|
|
115
123
|
| `route[].keywords` | `[]` | Palavras-chave da solicitação (sem diferenciar maiúsculas) |
|
|
116
124
|
| `route[].always` | `false` | Roteia toda solicitação elegível para este modelo |
|
|
@@ -171,6 +179,7 @@ pnpm pack # o tarball publicado
|
|
|
171
179
|
## Contributors
|
|
172
180
|
|
|
173
181
|
- [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: adaptador, roteamento, ferramentas, verificação de saúde, sanitização e documentação em cinco idiomas.
|
|
182
|
+
- [@LABEST-IA](https://github.com/LABEST-IA) — correção do CallId de chamadas de ferramenta (PR #2), e os relatórios sobre o slot de chamadas de ferramenta e o suporte a visão (issues #1, #3, #5).
|
|
174
183
|
|
|
175
184
|
## PerryLink DSH Plugin Family
|
|
176
185
|
|
package/README.zh.md
CHANGED
|
@@ -109,8 +109,16 @@ dsh --profile web --dump-config | grep -A2 'id: dsh-local-ai'
|
|
|
109
109
|
| `models[].contextWindow` | *(none)* | 该模型的上下文容量 |
|
|
110
110
|
| `models[].maxTokens` | *(none)* | 该模型的输出上限 |
|
|
111
111
|
| `models[].temperature` | *(none)* | 该模型的采样温度 |
|
|
112
|
+
| `backends` | `[]` | OpenAI 兼容的本地后端(LM Studio / vLLM / llama.cpp) |
|
|
113
|
+
| `backends[].name` | *(required)* | 后端名;注册为 provider id `openai:<name>` |
|
|
114
|
+
| `backends[].baseURL` | *(required)* | 后端 base URL(含 `/v1`),如 `http://127.0.0.1:1234/v1` |
|
|
115
|
+
| `backends[].apiKey` | *(none)* | 可选 bearer API key(多数本地服务器留空) |
|
|
116
|
+
| `backends[].models` | `[]` | 界面可见名 → 后端模型映射 |
|
|
117
|
+
| `backends[].maxTokens` | `4096` | 该后端无精确值时的输出上限 |
|
|
118
|
+
| `backends[].temperature` | *(none)* | 该后端的采样温度 |
|
|
112
119
|
| `route` | `[]` | 本地模型路由规则(首个命中生效) |
|
|
113
120
|
| `route[].model` | *(required)* | 目标本地模型名 |
|
|
121
|
+
| `route[].provider` | `ollama` | 目标 provider id:`ollama` 或 `openai:<name>` |
|
|
114
122
|
| `route[].purpose` | *(none)* | 任务类型匹配:`compaction` / `session-title` |
|
|
115
123
|
| `route[].keywords` | `[]` | 不区分大小写的请求关键词 |
|
|
116
124
|
| `route[].always` | `false` | 把所有符合条件的请求路由到此模型 |
|
|
@@ -171,6 +179,7 @@ pnpm pack # 发布用 tarball
|
|
|
171
179
|
## Contributors
|
|
172
180
|
|
|
173
181
|
- [@PerryLink](https://github.com/PerryLink) — 创建者与维护者:适配器、路由、工具、健康检查、脱敏与五语文档。
|
|
182
|
+
- [@LABEST-IA](https://github.com/LABEST-IA) — 工具调用 CallId 修复(PR #2),以及工具调用槽位与视觉支持的报告(issue #1、#3、#5)。
|
|
174
183
|
|
|
175
184
|
## PerryLink DSH Plugin Family
|
|
176
185
|
|
package/cordis.patch.yml
CHANGED
|
@@ -32,15 +32,27 @@
|
|
|
32
32
|
# contextWindow: 4096
|
|
33
33
|
# maxTokens: 2048
|
|
34
34
|
# temperature: 0.7
|
|
35
|
+
# OpenAI-compatible backends (LM Studio / vLLM / llama.cpp). Each
|
|
36
|
+
# registers as provider id "openai:<name>"; baseURL includes the /v1
|
|
37
|
+
# prefix; apiKey is optional (most local servers leave it empty).
|
|
38
|
+
backends: []
|
|
39
|
+
# backends:
|
|
40
|
+
# - name: lmstudio
|
|
41
|
+
# baseURL: http://127.0.0.1:1234/v1
|
|
42
|
+
# - name: vllm
|
|
43
|
+
# baseURL: http://127.0.0.1:8000/v1
|
|
44
|
+
# apiKey: token-abc123
|
|
35
45
|
# Routing rules (first match wins): route requests to a local model by
|
|
36
46
|
# task type (purpose), keyword (case-insensitive), or always. A rule
|
|
37
47
|
# needs at least one of purpose/keywords/always; an empty list means
|
|
38
|
-
# no automatic re-routing.
|
|
48
|
+
# no automatic re-routing. `provider` defaults to "ollama"; use
|
|
49
|
+
# "openai:<name>" to target a backend above.
|
|
39
50
|
route: []
|
|
40
51
|
# route:
|
|
41
52
|
# - model: local
|
|
42
53
|
# keywords: ["confidential", "offline", "internal"]
|
|
43
54
|
# - model: local
|
|
44
55
|
# purpose: compaction
|
|
45
|
-
# - model:
|
|
56
|
+
# - model: qwen2.5-7b
|
|
57
|
+
# provider: openai:lmstudio
|
|
46
58
|
# always: true # offline-first: route everything local
|