@jaypie/mcp 0.8.145 → 0.8.147
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/dist/suites/docs/index.js +1 -1
- package/package.json +1 -1
- package/release-notes/jaypie/1.2.97.md +10 -0
- package/release-notes/jaypie/1.2.98.md +11 -0
- package/release-notes/llm/1.3.39.md +70 -0
- package/release-notes/llm/1.3.40.md +13 -0
- package/release-notes/logger/1.2.24.md +24 -0
- package/release-notes/mcp/0.8.146.md +14 -0
- package/release-notes/mcp/0.8.147.md +14 -0
- package/release-notes/testkit/1.2.68.md +10 -0
- package/release-notes/testkit/1.2.69.md +12 -0
- package/skills/llm.md +20 -11
- package/skills/logs.md +10 -0
|
@@ -10,7 +10,7 @@ import { gt } from 'semver';
|
|
|
10
10
|
/**
|
|
11
11
|
* Docs Suite - Documentation services (skill, version, release_notes)
|
|
12
12
|
*/
|
|
13
|
-
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.
|
|
13
|
+
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.147#f46c48c1"
|
|
14
14
|
;
|
|
15
15
|
const __filename$1 = fileURLToPath(import.meta.url);
|
|
16
16
|
const __dirname$1 = path.dirname(__filename$1);
|
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.98
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Pick up @jaypie/logger 1.2.24 and @jaypie/llm 1.3.40
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `@jaypie/logger` 1.2.24: `log.sessionActive` reports whether a report session
|
|
10
|
+
is open
|
|
11
|
+
- `@jaypie/llm` 1.3.40: no tally attempt outside an active logger session
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.3.39
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Meta Model API provider with MODEL.MUSE_SPARK and MODEL.MUSE_SPARK_CONTRIBUTOR
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `MetaProvider` (`PROVIDER.META`, name `meta`) calls Meta's Model API at
|
|
10
|
+
`https://api.meta.ai/v1`. The API serves the OpenAI Responses protocol, so
|
|
11
|
+
`MetaAdapter` extends `OpenAiAdapter` the way `XaiAdapter` does and inherits
|
|
12
|
+
request building, tool handling, structured output, streaming, and `input_file`
|
|
13
|
+
data URIs. `Llm` resolves the provider from the model id, the bare name
|
|
14
|
+
`meta`, or a `meta:` prefix.
|
|
15
|
+
- `MODEL.MUSE_SPARK` is `muse-spark-1.3` and `PROVIDER.META.DEFAULT`.
|
|
16
|
+
`MODEL.MUSE_SPARK_CONTRIBUTOR` is `muse-spark-1.3-contributor`: the same
|
|
17
|
+
model at roughly a tenth of the price in exchange for data use (prompts and
|
|
18
|
+
completions may train Meta models), limited to 100 RPM. The contributor tier
|
|
19
|
+
is an explicit opt-in and is never the default.
|
|
20
|
+
- `COST` prices all five Muse Spark ids: `muse-spark-1.3` and `muse-spark-1.2`
|
|
21
|
+
at $1.25 input / $4.25 output with $0.15 cache reads, the `-contributor` ids
|
|
22
|
+
at $0.10 / $0.20 with $0.002 cache reads, and `muse-spark-1.1` at the
|
|
23
|
+
standard rate. Reasoning bills as output; no write premium is published.
|
|
24
|
+
- The API key is read from `META_API_KEY`, then from `MODEL_API_KEY` (the name
|
|
25
|
+
Meta's own docs and SDK examples use), then an explicit `apiKey` option wins
|
|
26
|
+
over both. `ConfigurationError` when none resolves.
|
|
27
|
+
- `reasoning.effort` walks Meta's `minimal | low | medium | high | xhigh | max`
|
|
28
|
+
ladder. `max` is limited to the Standard-tier `muse-spark-1.3`, so `highest`
|
|
29
|
+
on the contributor id or an older release clamps to `xhigh` and logs at
|
|
30
|
+
debug. Muse Spark always reasons: `none` is rejected and never emitted.
|
|
31
|
+
`reasoning.summary: "auto"` is requested on every Muse Spark id.
|
|
32
|
+
- The `user` option is sent as `safety_identifier`, the field Meta names as the
|
|
33
|
+
successor to the deprecated `user`.
|
|
34
|
+
- A 402 from Meta is classified as a terminal billing failure (`LlmQuotaError`,
|
|
35
|
+
`reason: "billing"`) rather than retried.
|
|
36
|
+
- `PROVIDER.META.MODEL_MATCH_WORDS` is `["muse"]`. `meta` is deliberately not a
|
|
37
|
+
match word: `meta.llama-*` stays on Bedrock and `meta-llama/*` on OpenRouter.
|
|
38
|
+
- `OpenAiAdapter` gains a `protected supportsReasoningSummary(model)` hook so
|
|
39
|
+
OpenAI-compatible subclasses can request reasoning summaries for models
|
|
40
|
+
outside OpenAI's `gpt-5+` / o-series naming.
|
|
41
|
+
|
|
42
|
+
## Testing
|
|
43
|
+
|
|
44
|
+
- Unit coverage for the adapter (field renaming, reasoning summary, effort
|
|
45
|
+
ladder and the `max` gate, `prompt_cache_key`, usage with `cached_tokens` and
|
|
46
|
+
`reasoning_tokens`, 402 classification), the provider (key resolution order),
|
|
47
|
+
routing (every cataloged and priced id, the `meta:` prefix, Bedrock and
|
|
48
|
+
OpenRouter ids left alone), and constants (default never the contributor
|
|
49
|
+
tier, every Muse Spark price within the `COST` invariants).
|
|
50
|
+
- A `meta` group joins the CI capability matrix in `npm-check.yml` and
|
|
51
|
+
`npm-deploy.yml`, keyed on `CICD_META_API_KEY`.
|
|
52
|
+
- Live verification on 2026-09-05: the capability matrix passed on both
|
|
53
|
+
cataloged models. The `pdf` cell on `muse-spark-1.3` overran the 180 second
|
|
54
|
+
cell deadline on the first run and passed on a rerun, so no `MATRIX_EXPECT`
|
|
55
|
+
entry is pinned for it. Live probes confirmed `max` is accepted on
|
|
56
|
+
`muse-spark-1.3` and rejected with a 400 on the contributor tier, the
|
|
57
|
+
response echoes the literal model id, a repeat call reports `cached_tokens`,
|
|
58
|
+
and a two-turn tool call replays the reasoning item without error. Before
|
|
59
|
+
billing was configured every call returned 402 `billing_not_configured`,
|
|
60
|
+
which exercised the billing classification.
|
|
61
|
+
- `test/matrix.ts` now exits the process explicitly after a passing run. An
|
|
62
|
+
abandoned cell keeps retrying in the background, and its backoff timers and
|
|
63
|
+
open socket held the event loop open after the verdict printed.
|
|
64
|
+
- `test/matrix.ts` treats a provider refusal (`stopReason: "refusal"`) as an
|
|
65
|
+
inconclusive cell, alongside the cell deadline and an exhausted turn budget.
|
|
66
|
+
The `claude-opus-5` pdf cell refused on five of seven CI runs across two
|
|
67
|
+
branches and answered on every local run, so failing on it reported a
|
|
68
|
+
classifier flake as a missing capability. Every cell now requests the
|
|
69
|
+
exchange envelope so the stop reason is observable; the refusal still prints
|
|
70
|
+
in ISSUES.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.3.40
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Skip the operate tally when no logger session is active
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `tallyOperate` returns before building a payload when `log.sessionActive` is
|
|
10
|
+
`false`, so `operate()` and `stream()` outside a Jaypie handler no longer
|
|
11
|
+
produce `[logger] tally() called without active session` at trace (issue #522)
|
|
12
|
+
- Behavior inside a handler is unchanged; the guard compares against `false`, so
|
|
13
|
+
a logger predating `@jaypie/logger` 1.2.24 still tallies
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.24
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Expose log.sessionActive so libraries can guard optional report and tally calls
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `JaypieLogger` exposes a read-only `sessionActive` getter, `true` between
|
|
10
|
+
`setup()` and `teardown()`
|
|
11
|
+
- Libraries that tally opportunistically guard on it rather than calling
|
|
12
|
+
`tally()` unconditionally and having the logger trace
|
|
13
|
+
`[logger] tally() called without active session`
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
if (log.sessionActive !== false) {
|
|
19
|
+
log.tally({ llm: { operates: 1, turns: 2 } });
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Compare against `false` rather than testing truthiness: a logger predating this
|
|
24
|
+
release reports `undefined`, where the tally should still be attempted.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.146
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Release notes for @jaypie/llm 1.3.39, @jaypie/testkit 1.2.68, and jaypie 1.2.97
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added release notes for `@jaypie/llm` 1.3.39, `@jaypie/testkit` 1.2.68, and
|
|
10
|
+
`jaypie` 1.2.97
|
|
11
|
+
- `skills/llm.md` documents the Meta provider: the `muse` match word and
|
|
12
|
+
`meta:` prefix, `MODEL.MUSE_SPARK` and `MODEL.MUSE_SPARK_CONTRIBUTOR` with the
|
|
13
|
+
contributor tier's data-use terms, `META_API_KEY` with the `MODEL_API_KEY`
|
|
14
|
+
fallback, the Meta column of the reasoning effort table, and prompt caching
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.147
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Release notes for @jaypie/logger 1.2.24, @jaypie/llm 1.3.40, @jaypie/testkit 1.2.69, and jaypie 1.2.98
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Added release notes for `@jaypie/logger` 1.2.24, `@jaypie/llm` 1.3.40,
|
|
10
|
+
`@jaypie/testkit` 1.2.69, and `jaypie` 1.2.98
|
|
11
|
+
- `skills/logs.md` documents `log.sessionActive` and the guard pattern for
|
|
12
|
+
optional tally calls
|
|
13
|
+
- `skills/llm.md` records that the operate tally is skipped outside a handler
|
|
14
|
+
session rather than no-oping inside the logger
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.69
|
|
3
|
+
date: 2026-09-05
|
|
4
|
+
summary: Mock log reports sessionActive
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `mockLogFactory` sets `sessionActive: true` on the mock log, matching
|
|
10
|
+
`@jaypie/logger` 1.2.24, so code guarding a tally on the session runs under
|
|
11
|
+
test
|
|
12
|
+
- Tests exercising the unguarded path set `log.sessionActive = false`
|
package/skills/llm.md
CHANGED
|
@@ -39,16 +39,20 @@ the alias rather than the id it currently resolves to. Read the id off
|
|
|
39
39
|
| Mistral | "mistral", "ministral", "codestral", "devstral", "magistral", "pixtral", "voxtral" | `MODEL.MISTRAL.LARGE` |
|
|
40
40
|
| OpenRouter | "openrouter" | `MODEL.OPENROUTER.SONNET` |
|
|
41
41
|
| xAI | "xai", "grok" | `MODEL.GROK` |
|
|
42
|
+
| Meta | "muse" (plus the exact name `meta` and a `meta:` prefix) | `MODEL.MUSE_SPARK` |
|
|
42
43
|
| Bedrock | "amazon.nova", "anthropic.claude", "meta.llama", "deepseek.", "google.gemma", "moonshotai.", "openai.gpt-oss", … | `MODEL.NOVA_PRO` |
|
|
43
44
|
|
|
44
45
|
The provider name for Gemini models is `"google"` — `"gemini"` is accepted as a deprecated alias.
|
|
45
46
|
|
|
46
47
|
Mistral's family names mostly do not contain the substring "mistral" (`ministral` is m-i-n-i-s-t-r-a-l; `codestral`/`devstral`/`pixtral`/`voxtral` share only the `-tral` suffix), so each family carries its own match word. Bedrock-hosted `mistral.mistral-*` ids still resolve to `bedrock`, and `mistralai/*` routes still resolve to `openrouter`; use the `mistral:` prefix to force the direct API.
|
|
47
48
|
|
|
49
|
+
"meta" is deliberately not a Meta match word: `meta.llama-*` is a Bedrock id and `meta-llama/*` an OpenRouter route. Muse Spark ids resolve on "muse"; use the `meta:` prefix to force the Meta Model API for any other id.
|
|
50
|
+
|
|
48
51
|
### Model Constants
|
|
49
52
|
|
|
50
53
|
- **`PROVIDER.<name>.DEFAULT`** — the single default model per provider (above), used when no `model` is given.
|
|
51
|
-
- **`LLM.MODEL.*`** — the named model catalog (e.g. `MODEL.SONNET`, `MODEL.ASTRA`, `MODEL.SOL`, `MODEL.GEMINI_FLASH`, `MODEL.GROK`, `MODEL.NOVA_PRO`, `MODEL.NOVA_LITE`), plus three nested subtrees: `MODEL.FIREWORKS.*` for Fireworks serverless models (`DEEPSEEK`, `GLM`, `GPT_OSS`, `INKLING`, `KIMI`, `MINIMAX`, `NEMOTRON`, `QWEN`), `MODEL.MISTRAL.*` (`LARGE`, `OCR`, `SMALL`), and `MODEL.OPENROUTER.*` for provider-prefixed routes (`GLM`, `LUNA`, `SONNET`). Pick specific models from here. `MODEL.MISTRAL.OCR` serves `POST /v1/ocr` rather than chat completions: it is priced per page, carries no `COST` entry, and is reached through `MistralProvider.ocr()`. Amazon's Nova models are first-class ids served over Bedrock; Bedrock's third-party routes are not catalogued — pass the literal id (e.g. `us.anthropic.claude-sonnet-4-6`) and `determineModelProvider` resolves it to `bedrock`.
|
|
54
|
+
- **`LLM.MODEL.*`** — the named model catalog (e.g. `MODEL.SONNET`, `MODEL.ASTRA`, `MODEL.SOL`, `MODEL.GEMINI_FLASH`, `MODEL.GROK`, `MODEL.MUSE_SPARK`, `MODEL.MUSE_SPARK_CONTRIBUTOR`, `MODEL.NOVA_PRO`, `MODEL.NOVA_LITE`), plus three nested subtrees: `MODEL.FIREWORKS.*` for Fireworks serverless models (`DEEPSEEK`, `GLM`, `GPT_OSS`, `INKLING`, `KIMI`, `MINIMAX`, `NEMOTRON`, `QWEN`), `MODEL.MISTRAL.*` (`LARGE`, `OCR`, `SMALL`), and `MODEL.OPENROUTER.*` for provider-prefixed routes (`GLM`, `LUNA`, `SONNET`). Pick specific models from here. `MODEL.MISTRAL.OCR` serves `POST /v1/ocr` rather than chat completions: it is priced per page, carries no `COST` entry, and is reached through `MistralProvider.ocr()`. Amazon's Nova models are first-class ids served over Bedrock; Bedrock's third-party routes are not catalogued — pass the literal id (e.g. `us.anthropic.claude-sonnet-4-6`) and `determineModelProvider` resolves it to `bedrock`.
|
|
55
|
+
- `MODEL.MUSE_SPARK` and `MODEL.MUSE_SPARK_CONTRIBUTOR` are the same Meta model at two tiers. The contributor tier is roughly a tenth of the price because prompts and completions may train Meta models; it is limited to 100 RPM and does not accept `reasoning.effort: "max"`. It is an explicit opt-in: `PROVIDER.META.DEFAULT` is `MODEL.MUSE_SPARK`.
|
|
52
56
|
- The catalog is the **single source of truth for CI coverage**: `packages/llm/test/models.ts` derives the live capability matrix from `MODEL.*` plus each `PROVIDER.*.DEFAULT`, and the workflow shards it by provider. Adding a model to `MODEL.*` puts it under test; no id list exists anywhere else.
|
|
53
57
|
- **Deprecated:** the size-tier map `PROVIDER.<name>.MODEL.{DEFAULT,LARGE,SMALL,TINY}`, the `DEFAULT.MODEL` bundle, and `ALL` are `@deprecated` and retired in 2.0 — use `PROVIDER.*.DEFAULT` for defaults and `MODEL.*` for named models.
|
|
54
58
|
|
|
@@ -644,6 +648,7 @@ MISTRAL_API_KEY # Required for Mistral
|
|
|
644
648
|
OPENAI_API_KEY # Required for OpenAI
|
|
645
649
|
OPENROUTER_API_KEY # Required for OpenRouter
|
|
646
650
|
XAI_API_KEY # Required for xAI (Grok)
|
|
651
|
+
META_API_KEY # Required for Meta (Muse Spark); MODEL_API_KEY is read as a fallback
|
|
647
652
|
```
|
|
648
653
|
|
|
649
654
|
Keys are resolved via `getEnvSecret()` which supports AWS Secrets Manager.
|
|
@@ -671,7 +676,7 @@ Inside a Jaypie handler (`expressHandler`, `lambdaHandler`, and stream variants)
|
|
|
671
676
|
- `operates` counts loop executions; repeated calls sum every number
|
|
672
677
|
- `usage` is keyed `provider:model` — fallback providers appear as separate keys
|
|
673
678
|
- `tools` appears only when tools were called
|
|
674
|
-
- Outside a handler session the tally is a
|
|
679
|
+
- Outside a handler session the tally is skipped entirely (guarded on `log.sessionActive`), so a CLI or script calling `operate()` directly emits nothing
|
|
675
680
|
|
|
676
681
|
## LLM Observability (Datadog)
|
|
677
682
|
|
|
@@ -858,13 +863,13 @@ await Llm.operate("Solve this step by step", {
|
|
|
858
863
|
Per-provider translation (`medium`/`high` stay aligned across providers; ends
|
|
859
864
|
collapse where a provider has fewer rungs):
|
|
860
865
|
|
|
861
|
-
| `effort` | OpenAI `reasoning.effort` | Anthropic `output_config.effort` | Gemini 3 `thinkingLevel` | Gemini 2.5 `thinkingBudget` | Grok `reasoning_effort` | OpenRouter `reasoning.effort` | Fireworks `reasoning_effort` | Mistral `reasoning_effort` |
|
|
862
|
-
|
|
863
|
-
| `lowest` | minimal | low | MINIMAL | 512 | low | minimal | low | none |
|
|
864
|
-
| `low` | low | low | LOW | 4096 | low | low | low | high |
|
|
865
|
-
| `medium` | medium | medium | MEDIUM | 8192 | medium | medium | medium | high |
|
|
866
|
-
| `high` | high | high | HIGH | 16384 | high | high | high | high |
|
|
867
|
-
| `highest` | xhigh | max | HIGH | 24576 | high | xhigh | high | high |
|
|
866
|
+
| `effort` | OpenAI `reasoning.effort` | Anthropic `output_config.effort` | Gemini 3 `thinkingLevel` | Gemini 2.5 `thinkingBudget` | Grok `reasoning_effort` | Meta `reasoning.effort` | OpenRouter `reasoning.effort` | Fireworks `reasoning_effort` | Mistral `reasoning_effort` |
|
|
867
|
+
|-----------|---------------------------|----------------------------------|--------------------------|-----------------------------|-------------------------|-------------------------|-------------------------------|------------------------------|----------------------------|
|
|
868
|
+
| `lowest` | minimal | low | MINIMAL | 512 | low | minimal | minimal | low | none |
|
|
869
|
+
| `low` | low | low | LOW | 4096 | low | low | low | low | high |
|
|
870
|
+
| `medium` | medium | medium | MEDIUM | 8192 | medium | medium | medium | medium | high |
|
|
871
|
+
| `high` | high | high | HIGH | 16384 | high | high | high | high | high |
|
|
872
|
+
| `highest` | xhigh | max | HIGH | 24576 | high | max | xhigh | high | high |
|
|
868
873
|
|
|
869
874
|
When a neutral level has no distinct native rung and collapses onto a neighbor
|
|
870
875
|
it is "papered over." Papering that follows from the provider's native scale
|
|
@@ -890,6 +895,10 @@ erroring):
|
|
|
890
895
|
other models get nothing.
|
|
891
896
|
- **xAI** — only models whose name advertises reasoning (a `*-reasoning`
|
|
892
897
|
suffix); a bare version name and `*-non-reasoning` are skipped.
|
|
898
|
+
- **Meta** — every `muse-spark` id; merges with the auto `reasoning.summary`.
|
|
899
|
+
`max` is limited to the Standard-tier `muse-spark-1.3`, so `highest` on the
|
|
900
|
+
contributor id or an older release clamps to `xhigh` (logged at debug).
|
|
901
|
+
Muse Spark always reasons: `none` is rejected by the API and never emitted.
|
|
893
902
|
- **OpenRouter** — always forwarded; OpenRouter maps to the routed model's
|
|
894
903
|
nearest supported level.
|
|
895
904
|
- **Fireworks** — always forwarded (`reasoning_effort`); the API accepts it on
|
|
@@ -927,7 +936,7 @@ elsewhere); `false`/`0` = disabled; `"5m"`/`"1h"` = that TTL.
|
|
|
927
936
|
|
|
928
937
|
Per provider: Anthropic `cache_control` on system + last tool; Bedrock
|
|
929
938
|
`cachePoint` blocks (model-gated, auto-denylisted and retried without on a 400;
|
|
930
|
-
5m only); OpenAI/xAI automatic caching + a stable `prompt_cache_key`; OpenRouter
|
|
939
|
+
5m only); OpenAI/xAI/Meta automatic caching + a stable `prompt_cache_key`; OpenRouter
|
|
931
940
|
`cache_control` on the system message (forwarded to Anthropic/Gemini backends);
|
|
932
941
|
Google implicit caching only (Gemini 2.5+). TTL applies to Anthropic/OpenRouter;
|
|
933
942
|
others use provider defaults. Sub-threshold prefixes silently no-op. Cache
|
|
@@ -967,7 +976,7 @@ await Llm.operate(input, {
|
|
|
967
976
|
});
|
|
968
977
|
```
|
|
969
978
|
|
|
970
|
-
OpenAI and
|
|
979
|
+
OpenAI, xAI, and Meta leave the limit unset (their defaults do not truncate early).
|
|
971
980
|
Mistral is capped (32,768 streaming / 16,384 non-streaming) despite publishing
|
|
972
981
|
no low ceiling: a Mistral model can degenerate into restating its answer when
|
|
973
982
|
`format` and tools are combined, and an uncapped completion turns that into a
|
package/skills/logs.md
CHANGED
|
@@ -132,6 +132,16 @@ log.tally({ llm: { operates: 1, turns: 3 } });
|
|
|
132
132
|
|
|
133
133
|
Outside an active session `tally()` silently no-ops, so libraries can tally unconditionally. `@jaypie/llm` tallies an `llm` key (turns, tool calls, usage by model) automatically.
|
|
134
134
|
|
|
135
|
+
`log.sessionActive` reports whether a session is open. A library that assembles a tally payload guards on it, skipping the work when nothing will collect the result:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
if (log.sessionActive !== false) {
|
|
139
|
+
log.tally({ llm: { operates: 1, turns: 2 } });
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Compare against `false` rather than testing truthiness: an older logger without the accessor reports `undefined`, and the tally should still be attempted there.
|
|
144
|
+
|
|
135
145
|
## Setting Log Level
|
|
136
146
|
|
|
137
147
|
Via environment variable:
|