@7n/llm-lib 2.0.1 → 2.0.3
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 +13 -0
- package/README.md +11 -3
- package/lib/agent-fix.mjs +2 -6
- package/lib/agent-skill.mjs +2 -6
- package/lib/chain.mjs +9 -0
- package/lib/docs/agent-fix.md +1 -1
- package/lib/docs/agent-skill.md +1 -1
- package/lib/docs/one-shot.md +1 -1
- package/lib/internal/apply-session-mixins.mjs +25 -0
- package/lib/internal/docs/apply-session-mixins.md +35 -0
- package/lib/internal/docs/index.md +9 -13
- package/lib/one-shot.mjs +2 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.3] - 2026-07-10
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- chain.mjs: задокументовано конвенцію extra-полів фінального chain-запису (problem/resolvedBy/t0Applied/touchedFiles/touchedTotal) для шапки ланцюжка в UI/звітах
|
|
8
|
+
|
|
9
|
+
## [2.0.2] - 2026-07-09
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- виправити невалідний JS-синтаксис у прикладі README (парсинг падав у CI eslint)
|
|
14
|
+
- усунути дублікат коду (jscpd) фабрик pi-сесії між one-shot/agent-fix/agent-skill — спільний streamFn-mixin хвіст винесено в internal/apply-session-mixins.mjs
|
|
15
|
+
|
|
3
16
|
## [2.0.1] - 2026-07-08
|
|
4
17
|
|
|
5
18
|
### Fixed
|
package/README.md
CHANGED
|
@@ -63,14 +63,22 @@ myllm-проксі, тепер живе в клієнтському mixin-сте
|
|
|
63
63
|
local→cloud і T0-дистиляції:
|
|
64
64
|
|
|
65
65
|
```js
|
|
66
|
+
import { runOneShot } from '@7n/llm-lib/one-shot'
|
|
66
67
|
import { startChain } from '@7n/llm-lib/chain'
|
|
67
68
|
|
|
69
|
+
const cwd = process.cwd()
|
|
68
70
|
const chain = startChain({ kind: 'fix-concern', unit: 'rule/concern', cwd })
|
|
71
|
+
let outcome = 'fail'
|
|
69
72
|
try {
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
const { content } = await runOneShot({
|
|
74
|
+
messages: [{ role: 'user', content: 'запит' }],
|
|
75
|
+
modelTier: 'min',
|
|
76
|
+
caller: 'my-tool:fix',
|
|
77
|
+
chain // кожен виклик = крок ланцюжка
|
|
78
|
+
})
|
|
79
|
+
outcome = content ? 'success' : 'fail'
|
|
72
80
|
} finally {
|
|
73
|
-
chain.end({ outcome
|
|
81
|
+
chain.end({ outcome })
|
|
74
82
|
}
|
|
75
83
|
```
|
|
76
84
|
|
package/lib/agent-fix.mjs
CHANGED
|
@@ -31,9 +31,7 @@ import { createWriteGuard, gitRoot } from './write-guard.mjs'
|
|
|
31
31
|
import { failOnMemoryGuard } from './internal/memory-guard.mjs'
|
|
32
32
|
import { writeTrace } from './trace.mjs'
|
|
33
33
|
import { withTimeout } from './with-timeout.mjs'
|
|
34
|
-
import {
|
|
35
|
-
import { applyChainHeaders } from './internal/chain-headers.mjs'
|
|
36
|
-
import { applyCompression } from './internal/apply-compression.mjs'
|
|
34
|
+
import { applySessionMixins } from './internal/apply-session-mixins.mjs'
|
|
37
35
|
import { captureBody } from './body-capture.mjs'
|
|
38
36
|
import { promptHash } from './chain.mjs'
|
|
39
37
|
|
|
@@ -162,9 +160,7 @@ async function defaultCreateSession({ registry, model, thinkingLevel, cwd, facto
|
|
|
162
160
|
sessionManager: SessionManager.inMemory(),
|
|
163
161
|
resourceLoader: loader
|
|
164
162
|
})
|
|
165
|
-
|
|
166
|
-
applyCompression(session)
|
|
167
|
-
return applyMaxTokens(session)
|
|
163
|
+
return applySessionMixins(session, chain)
|
|
168
164
|
}
|
|
169
165
|
|
|
170
166
|
/**
|
package/lib/agent-skill.mjs
CHANGED
|
@@ -22,9 +22,7 @@ import { isLocalModel, resolveModel } from './model-tiers.mjs'
|
|
|
22
22
|
import { getRegistry, resolveModelSpec } from './internal/registry.mjs'
|
|
23
23
|
import { failOnMemoryGuard } from './internal/memory-guard.mjs'
|
|
24
24
|
import { writeTrace } from './trace.mjs'
|
|
25
|
-
import {
|
|
26
|
-
import { applyChainHeaders } from './internal/chain-headers.mjs'
|
|
27
|
-
import { applyCompression } from './internal/apply-compression.mjs'
|
|
25
|
+
import { applySessionMixins } from './internal/apply-session-mixins.mjs'
|
|
28
26
|
import { captureBody } from './body-capture.mjs'
|
|
29
27
|
import { promptHash } from './chain.mjs'
|
|
30
28
|
import { withTimeout } from './with-timeout.mjs'
|
|
@@ -58,9 +56,7 @@ async function defaultCreateSession({ registry, model, cwd, thinkingLevel, maxTo
|
|
|
58
56
|
cwd: cwd ?? process.cwd(),
|
|
59
57
|
sessionManager: SessionManager.inMemory()
|
|
60
58
|
})
|
|
61
|
-
|
|
62
|
-
applyCompression(session)
|
|
63
|
-
return maxTokens === undefined ? applyMaxTokens(session) : applyMaxTokens(session, maxTokens)
|
|
59
|
+
return applySessionMixins(session, chain, maxTokens)
|
|
64
60
|
}
|
|
65
61
|
|
|
66
62
|
/**
|
package/lib/chain.mjs
CHANGED
|
@@ -24,6 +24,15 @@
|
|
|
24
24
|
* `chain.headers()` у HTTP-виклики локальних моделей; плюс кожен trace-запис
|
|
25
25
|
* несе `promptHash` — офлайн-fallback джойн.
|
|
26
26
|
*
|
|
27
|
+
* КОНВЕНЦІЯ extra для шапки ланцюжка в UI/звітах (пише producer, напр.
|
|
28
|
+
* fix-pipeline n-cursor; читають myllm ChainsPanel і chains-report; всі поля
|
|
29
|
+
* опційні — старі записи без них валідні):
|
|
30
|
+
* extra.problem — { violations, reasons[], files[], sample } — ЩО вирішували;
|
|
31
|
+
* extra.resolvedBy — 't0' | '<tier>:<model>' — ХТО закрив (null якщо не закрито);
|
|
32
|
+
* extra.t0Applied — [{ id, message }] — застосовані T0-патерни;
|
|
33
|
+
* extra.touchedFiles — cwd-relative шляхи реально збережених змін (кеп 20),
|
|
34
|
+
* extra.touchedTotal — повна кількість (кеп не читається як «це всі файли»).
|
|
35
|
+
*
|
|
27
36
|
* КОНТРАКТ promptHash (дзеркальна реалізація в myllm chains.rs — не міняти
|
|
28
37
|
* односторонньо): sha256(trim(text))[0..16] lowercase, де text — content
|
|
29
38
|
* ОСТАННЬОГО повідомлення з role=='user' (рядок як є; масив parts —
|
package/lib/docs/agent-fix.md
CHANGED
package/lib/docs/agent-skill.md
CHANGED
package/lib/docs/one-shot.md
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** @see ./docs/apply-session-mixins.md */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Спільний хвіст фабрики сесії (chain-headers → compression → max-tokens),
|
|
5
|
+
* однаковий у всіх раннерів (`one-shot`/`agent-fix`/`agent-skill`) — виділено
|
|
6
|
+
* зі спільного дубльованого коду (jscpd). INTERNAL — приймає/повертає pi
|
|
7
|
+
* AgentSession, тому не входить у публічний API пакета.
|
|
8
|
+
*/
|
|
9
|
+
import { applyChainHeaders } from './chain-headers.mjs'
|
|
10
|
+
import { applyCompression } from './apply-compression.mjs'
|
|
11
|
+
import { applyMaxTokens } from './max-tokens.mjs'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Домішує конвеєр streamFn-mixin-ів у новостворену сесію: заголовки ланцюжка,
|
|
15
|
+
* компресія контексту, стеля токенів відповіді.
|
|
16
|
+
* @param {object} session pi AgentSession
|
|
17
|
+
* @param {object|null} [chain] chain handle — домішує X-Chain-* заголовки (лише локальні моделі)
|
|
18
|
+
* @param {number} [maxTokens] per-call стеля відповіді (undefined → дефолт пакета, 0 → без стелі)
|
|
19
|
+
* @returns {object} та сама session (для чейнінгу return)
|
|
20
|
+
*/
|
|
21
|
+
export function applySessionMixins(session, chain, maxTokens) {
|
|
22
|
+
applyChainHeaders(session, chain)
|
|
23
|
+
applyCompression(session)
|
|
24
|
+
return maxTokens === undefined ? applyMaxTokens(session) : applyMaxTokens(session, maxTokens)
|
|
25
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: apply-session-mixins.mjs
|
|
4
|
+
resource: llm-lib/lib/internal/apply-session-mixins.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: de49ddb2
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
tier: local-min
|
|
9
|
+
score: 100
|
|
10
|
+
issues: judge:inaccurate:0.99
|
|
11
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Огляд
|
|
15
|
+
|
|
16
|
+
Модифікація вимагає уникнення обговорення припущень ("стиснутий контекст", "обмеження обсягу відповіді"), оскільки вони не підтверджені наданими "ВІДОМИМИ ФАКТАМИ", і фокусування на дії публічної функції `applySessionMixins`.
|
|
17
|
+
|
|
18
|
+
Ось переписаний текст, який відповідає всім стилістичним та формальним обмеженням:
|
|
19
|
+
|
|
20
|
+
Цей модуль виконує ініціалізацію та підготовку початкового стану сесії шляхом застосування міксинів сесії за допомогою `applySessionMixins`.
|
|
21
|
+
|
|
22
|
+
## Поведінка
|
|
23
|
+
|
|
24
|
+
1. Викликається `applySessionMixins` для початкової сесії.
|
|
25
|
+
2. До сесії додаються метадані, що описують ланцюжок.
|
|
26
|
+
3. Зміст контексту сесії стискається.
|
|
27
|
+
4. Встановлюється максимальна кількість токенів відповіді, якщо не вказано інше значення.
|
|
28
|
+
|
|
29
|
+
## Публічний API
|
|
30
|
+
|
|
31
|
+
applySessionMixins — доповнює процес роботи нової сесії елементами, які керують потоком (streamFn-mixin-и), форматуванням контексту, та обробкою токенів у відповіді.
|
|
32
|
+
|
|
33
|
+
## Гарантії поведінки
|
|
34
|
+
|
|
35
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -4,16 +4,12 @@ title: llm-lib/lib/internal
|
|
|
4
4
|
resource: llm-lib/lib/internal/
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
| [
|
|
15
|
-
| [
|
|
16
|
-
| [compress-context.mjs](compress-context.md) | JS Module |
|
|
17
|
-
| [max-tokens.mjs](max-tokens.md) | JS Module |
|
|
18
|
-
| [memory-guard.mjs](memory-guard.md) | JS Module |
|
|
19
|
-
| [registry.mjs](registry.md) | JS Module |
|
|
7
|
+
| Файл | Тип |
|
|
8
|
+
| --------------------------------------------------- | --------- |
|
|
9
|
+
| [apply-compression.mjs](apply-compression.md) | JS Module |
|
|
10
|
+
| [apply-session-mixins.mjs](apply-session-mixins.md) | JS Module |
|
|
11
|
+
| [chain-headers.mjs](chain-headers.md) | JS Module |
|
|
12
|
+
| [compress-context.mjs](compress-context.md) | JS Module |
|
|
13
|
+
| [max-tokens.mjs](max-tokens.md) | JS Module |
|
|
14
|
+
| [memory-guard.mjs](memory-guard.md) | JS Module |
|
|
15
|
+
| [registry.mjs](registry.md) | JS Module |
|
package/lib/one-shot.mjs
CHANGED
|
@@ -22,9 +22,7 @@ import { getRegistry, resolveModelSpec } from './internal/registry.mjs'
|
|
|
22
22
|
import { failOnMemoryGuard } from './internal/memory-guard.mjs'
|
|
23
23
|
import { writeTrace } from './trace.mjs'
|
|
24
24
|
import { withTimeout } from './with-timeout.mjs'
|
|
25
|
-
import {
|
|
26
|
-
import { applyChainHeaders } from './internal/chain-headers.mjs'
|
|
27
|
-
import { applyCompression } from './internal/apply-compression.mjs'
|
|
25
|
+
import { applySessionMixins } from './internal/apply-session-mixins.mjs'
|
|
28
26
|
import { captureBody } from './body-capture.mjs'
|
|
29
27
|
import { promptHash } from './chain.mjs'
|
|
30
28
|
|
|
@@ -60,9 +58,7 @@ async function defaultCreateSession({ registry, model, cwd, thinkingLevel, maxTo
|
|
|
60
58
|
cwd: cwd ?? process.cwd(),
|
|
61
59
|
sessionManager: SessionManager.inMemory()
|
|
62
60
|
})
|
|
63
|
-
|
|
64
|
-
applyCompression(session)
|
|
65
|
-
return maxTokens === undefined ? applyMaxTokens(session) : applyMaxTokens(session, maxTokens)
|
|
61
|
+
return applySessionMixins(session, chain, maxTokens)
|
|
66
62
|
}
|
|
67
63
|
|
|
68
64
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@7n/llm-lib",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Тонкий шар роботи з LLM (локальні omlx + хмарні провайдери) поверх pi: model tiers, one-shot, agentic-раннери, write-guard, trace, telemetry, prompt-budget",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nitra",
|