@7n/llm-lib 2.9.9 → 2.10.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/lib/docs/index.md +1 -0
- package/lib/docs/local-providers.md +29 -0
- package/lib/docs/model-tiers.md +17 -13
- package/lib/local-providers.mjs +31 -0
- package/lib/model-tiers.mjs +6 -2
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.10.0] - 2026-07-27
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- llm-lib: додано litellm як другий local-provider (перемикач omlx/litellm через `N_LOCAL_*_MODEL`, `defaultLocalProviders()` з `N_OMLX_*`/`N_LITELLM_*` env)
|
|
8
|
+
|
|
3
9
|
## [2.9.9] - 2026-07-27
|
|
4
10
|
|
|
5
11
|
### Fixed
|
package/lib/docs/index.md
CHANGED
|
@@ -16,6 +16,7 @@ resource: llm-lib/lib/
|
|
|
16
16
|
| [chains-report.mjs](chains-report.md) | JS Module |
|
|
17
17
|
| [harness.mjs](harness.md) | JS Module |
|
|
18
18
|
| [local-cloud.mjs](local-cloud.md) | JS Module |
|
|
19
|
+
| [local-providers.mjs](local-providers.md) | JS Module |
|
|
19
20
|
| [model-tiers.mjs](model-tiers.md) | JS Module |
|
|
20
21
|
| [one-shot.mjs](one-shot.md) | JS Module |
|
|
21
22
|
| [prompt-budget.mjs](prompt-budget.md) | JS Module |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: local-providers.mjs
|
|
4
|
+
resource: llm-lib/lib/local-providers.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 6513b04f
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
|
+
score: 100
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Дефолтна мапа local-провайдерів для `llm_lib::local_cloud` у форматі `{ prefix: { baseUrl, apiKey } }`, яку споживають `oneShotLocalCloud` і `submitBatch`.
|
|
16
|
+
|
|
17
|
+
`omlx` і `litellm` завжди присутні в мапі одночасно, а фактичний виклик іде рівно в один клієнт за `provider`-префіксом у model-spec. Якщо spec не вказує на певний префікс, відповідний запис у мапі не отримує запиту.
|
|
18
|
+
|
|
19
|
+
## Поведінка
|
|
20
|
+
|
|
21
|
+
1. `defaultLocalProviders` формує єдиний дефолтний набір local-провайдерів для `llm_lib::local_cloud`, щоб обидва зареєстровані напрямки — `omlx` і `litellm` — були доступні одночасно в очікуваному `{ prefix: { baseUrl, apiKey } }` форматі для `oneShotLocalCloud` і `submitBatch`.
|
|
22
|
+
2. Для `omlx` функція бере `baseUrl` з `N_OMLX_BASE_URL`, а якщо його немає — підставляє `http://127.0.0.1:8000/v1/`; `apiKey` бере з `N_OMLX_API_KEY`, інакше лишає порожнім значенням.
|
|
23
|
+
3. Для `litellm` функція бере `baseUrl` з `N_LITELLM_BASE_URL`, а якщо його немає — підставляє `https://llm.7n.ai/v1/`; `apiKey` бере з `N_LITELLM_API_KEY`, інакше лишає порожнім значенням.
|
|
24
|
+
4. Функція не вирішує, який провайдер “активний” сама по собі: вибір фактично визначається тим, який provider-префікс вказаний у model-spec на кшталт `N_LOCAL_MIN_MODEL`.
|
|
25
|
+
5. Коли model-spec вказує на один префікс, `LocalCloud::one_shot_with_spec` звертається рівно до відповідного клієнта; другий запис у мапі залишається запасним і не отримує запитів, доки жоден spec на нього не посилається.
|
|
26
|
+
|
|
27
|
+
## Гарантії поведінки
|
|
28
|
+
|
|
29
|
+
- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
|
package/lib/docs/model-tiers.md
CHANGED
|
@@ -3,31 +3,31 @@ type: JS Module
|
|
|
3
3
|
title: model-tiers.mjs
|
|
4
4
|
resource: llm-lib/lib/model-tiers.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
model: openai-codex/gpt-5.
|
|
8
|
-
tier: cloud-
|
|
6
|
+
crc: 16df44f1
|
|
7
|
+
model: openai-codex/gpt-5.4-mini
|
|
8
|
+
tier: cloud-min
|
|
9
9
|
score: 100
|
|
10
|
-
issues: judge-refine:kept-original,judge:inaccurate:0.
|
|
10
|
+
issues: judge-refine:kept-original,judge:inaccurate:0.98
|
|
11
11
|
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
## Огляд
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Публічний шар модуля зосереджений на виборі та нормалізації моделей: `resolveModel`, `parseModelId`, `formatModelSpec`, `isLocalModel`, `thinkingLevelForTier` і константах `LOCAL_MIN`, `LOCAL_AVG`, `LOCAL_MAX`, `CLOUD_MIN`, `CLOUD_AVG`, `CLOUD_MAX`.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Він узгоджує представлення моделі між tier і форматом `"provider/model-id"`, дає змогу відрізняти локальні моделі від хмарних і окремо пов’язує tier із рівнем thinking.
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
## Поведінка
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
LOCAL_MIN, LOCAL_AVG, LOCAL_MAX, CLOUD_MIN, CLOUD_AVG і CLOUD_MAX — це джерело політики вибору моделі: значення беруться з env і далі використовуються як канонічні тири для розв’язання model-spec та класифікації локальної чи хмарної моделі. Якщо відповідний env не заданий, значення лишається порожнім рядком, тож наступні кроки можуть повернути порожній результат замість конкретної моделі.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
resolveModel — центральна точка для отримання фактичного `"provider/model-id"` за абстрактним тиром. Вона спирається на канон тиру з native-шару, а невідомий тир відсікає одразу тут, щоб зберегти TypeError на рівні цього модуля. Результат або повертає готовий model-spec, або порожній рядок, якщо дефолт не визначений.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
parseModelId і formatModelSpec утворюють парну нормалізацію між рядковим spec та об’єктом моделі: перша розкладає зовнішній `"provider/model-id"` на складники, друга збирає фактично резолвлену модель назад у той самий формат. Це дозволяє пропускати через модуль як сирі spec-рядки, так і вже вибрані pi-моделі без втрати форми.
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
isLocalModel використовує спільні тири LOCAL_MIN, LOCAL_AVG і LOCAL_MAX як найвищий пріоритет, а для решти spec опирається на провайдера з `N_LLM_LOCAL_PROVIDERS`. Так модуль узгоджує явні локальні політики з ознакою провайдера й дає один бінарний сигнал для ланцюжків, що відрізняють local від cloud.
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
thinkingLevelForTier не бере участі у резолву моделі, але працює поруч із тирами як окрема проєкція: перетворює rung-рівні на дискретний thinkingLevel для downstream-логіки. Це тримає вибір моделі та рівень міркування синхронними, але розділеними по відповідальності.
|
|
31
31
|
|
|
32
32
|
## Публічний API
|
|
33
33
|
|
|
@@ -55,7 +55,11 @@ cloud-min — `medium`, cloud-avg — `high`, cloud-max (experiment-only tier,
|
|
|
55
55
|
pi-моделі (`session.model`), коли consumer лишив `modelSpec` порожнім і pi
|
|
56
56
|
сам вибрав дефолт (локальний чи хмарний).
|
|
57
57
|
- isLocalModel — Чи model-spec вказує на локальну модель: збіг з одним із LOCAL_* тирів
|
|
58
|
-
АБО провайдер з `N_LLM_LOCAL_PROVIDERS` (дефолт `omlx`).
|
|
58
|
+
АБО провайдер з `N_LLM_LOCAL_PROVIDERS` (дефолт `omlx,litellm`). Обидва
|
|
59
|
+
провайдери можуть бути зареєстровані в `localProviders`-конфізі одночасно
|
|
60
|
+
(див. `local-providers.mjs`) — "активний" завжди рівно один, бо
|
|
61
|
+
`LocalCloud` викликає клієнта за провайдер-префіксом фактичного
|
|
62
|
+
model-spec, не за наявністю запису в мапі. Використовується
|
|
59
63
|
для local/cloud-агрегатів ланцюжків і рішення про chain-заголовки.
|
|
60
64
|
|
|
61
65
|
## Гарантії поведінки
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Дефолтна мапа local-провайдерів для Rust-крейта `llm_lib::local_cloud`
|
|
3
|
+
* (той самий `{ prefix: { baseUrl, apiKey } }` конфіг, що приймає
|
|
4
|
+
* `oneShotLocalCloud`/`submitBatch`). Обидва зареєстровані провайдери
|
|
5
|
+
* (`omlx`, `litellm`) завжди присутні в мапі одночасно — "активність"
|
|
6
|
+
* визначається лише тим, чий provider-префікс реально стоїть у
|
|
7
|
+
* model-spec (`N_LOCAL_MIN_MODEL` тощо): `LocalCloud::one_shot_with_spec`
|
|
8
|
+
* б'є рівно в один клієнт за префіксом spec, тож другий запис у мапі
|
|
9
|
+
* ніколи не отримує запиту, поки на нього не вказує жоден spec.
|
|
10
|
+
*/
|
|
11
|
+
import { env } from 'node:process'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @returns {{
|
|
15
|
+
* omlx: { baseUrl: string, apiKey: string|null },
|
|
16
|
+
* litellm: { baseUrl: string, apiKey: string|null }
|
|
17
|
+
* }} дефолтна мапа локальних провайдерів (override окремих полів — через
|
|
18
|
+
* `N_OMLX_BASE_URL`/`N_OMLX_API_KEY`/`N_LITELLM_BASE_URL`/`N_LITELLM_API_KEY`)
|
|
19
|
+
*/
|
|
20
|
+
export function defaultLocalProviders() {
|
|
21
|
+
return {
|
|
22
|
+
omlx: {
|
|
23
|
+
baseUrl: env.N_OMLX_BASE_URL ?? 'http://127.0.0.1:8000/v1/',
|
|
24
|
+
apiKey: env.N_OMLX_API_KEY ?? null
|
|
25
|
+
},
|
|
26
|
+
litellm: {
|
|
27
|
+
baseUrl: env.N_LITELLM_BASE_URL ?? 'https://llm.7n.ai/v1/',
|
|
28
|
+
apiKey: env.N_LITELLM_API_KEY ?? null
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
package/lib/model-tiers.mjs
CHANGED
|
@@ -107,7 +107,7 @@ export function formatModelSpec(model) {
|
|
|
107
107
|
|
|
108
108
|
/** Провайдери, що вважаються локальними. Override: `N_LLM_LOCAL_PROVIDERS` (кома-список). */
|
|
109
109
|
const LOCAL_PROVIDERS = new Set(
|
|
110
|
-
(env.N_LLM_LOCAL_PROVIDERS ?? 'omlx')
|
|
110
|
+
(env.N_LLM_LOCAL_PROVIDERS ?? 'omlx,litellm')
|
|
111
111
|
.split(',')
|
|
112
112
|
.map(p => p.trim())
|
|
113
113
|
.filter(Boolean)
|
|
@@ -115,7 +115,11 @@ const LOCAL_PROVIDERS = new Set(
|
|
|
115
115
|
|
|
116
116
|
/**
|
|
117
117
|
* Чи model-spec вказує на локальну модель: збіг з одним із LOCAL_* тирів
|
|
118
|
-
* АБО провайдер з `N_LLM_LOCAL_PROVIDERS` (дефолт `omlx`).
|
|
118
|
+
* АБО провайдер з `N_LLM_LOCAL_PROVIDERS` (дефолт `omlx,litellm`). Обидва
|
|
119
|
+
* провайдери можуть бути зареєстровані в `localProviders`-конфізі одночасно
|
|
120
|
+
* (див. `local-providers.mjs`) — "активний" завжди рівно один, бо
|
|
121
|
+
* `LocalCloud` викликає клієнта за провайдер-префіксом фактичного
|
|
122
|
+
* model-spec, не за наявністю запису в мапі. Використовується
|
|
119
123
|
* для local/cloud-агрегатів ланцюжків і рішення про chain-заголовки.
|
|
120
124
|
* @param {string} spec `"provider/model-id"`
|
|
121
125
|
* @returns {boolean} true — локальна модель
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@7n/llm-lib",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "Тонкий шар роботи з LLM (локальні omlx + хмарні провайдери) поверх pi: model tiers, one-shot, agentic-раннери, write-guard, trace, telemetry, prompt-budget",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nitra",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"./anchored-edit": "./lib/anchored-edit.mjs",
|
|
37
37
|
"./web-tools": "./lib/web-tools.mjs",
|
|
38
38
|
"./model-tiers": "./lib/model-tiers.mjs",
|
|
39
|
+
"./local-providers": "./lib/local-providers.mjs",
|
|
39
40
|
"./acp": "./lib/acp.mjs",
|
|
40
41
|
"./local-cloud": "./lib/local-cloud.mjs",
|
|
41
42
|
"./batch": "./lib/batch.mjs",
|