Releases: clbrge/mohdel
Releases · clbrge/mohdel
mohdel v0.114.0
Added
- Anthropic per-TTL cache-creation accounting. The streaming adapter now reads
usage.cache_creation.ephemeral_1h_input_tokensand exposes
cacheWrite1hInputTokenson the done result.computeCostprices the 1h write
tier via a new optional spec fieldcacheWrite1hPrice; the 5m portion
(cacheWriteInputTokens − cacheWrite1hInputTokens) stays oncacheWritePrice.
A request may mix TTLs, so both tiers can be non-zero. - Gemini implicit-cache read accounting. The adapter now reads
usageMetadata.cachedContentTokenCountand exposescacheReadInputTokenson
the done result, priced via the existingcacheReadPricespec field.
Fixed
- Gemini cached input was billed at full
inputPrice. Cached tokens are now
subtracted frominputTokens(subset convention, matching the OpenAI adapter)
and priced atcacheReadPrice, so reportedcostreflects the provider's
cached-token discount. - Anthropic 1h cache writes were priced at the 5m rate. They now bill at
cacheWrite1hPricewhen the spec provides it.
Notes
- Additive and backward-compatible. When
cacheWrite1hInputTokensis absent or a
spec omitscacheWrite1hPrice, the whole write bills atcacheWritePrice—
prior behaviour. Realizing the corrected rates requires catalog specs to carry
cacheWrite1hPrice(Anthropic) andcacheReadPrice(Gemini); without them the
new fields are observability-only and cost is unchanged.
mohdel v0.113.0
Added
- Qwen Cloud provider (
qwen/*) — OpenAI-compatible chat completions
against Alibaba's international DashScope endpoint
(dashscope-intl.aliyuncs.com/compatible-mode/v1), key via
QWEN_API_SK. Thinking is wired through the newqwen
reasoning-field variant:outputEffortmaps toenable_thinking
plus a numericthinking_budgetfrom the spec's
thinkingEffortLevels; Qwen hybrid models think by default, so
effortnonesends an explicitenable_thinking: false.
mohdel v0.112.0
Added
POST /v1/transcriptionon thin-gate's data plane — closes the
"factory path only" gap from 0.111.0; the cross-process client can
now transcribe viacallTranscription(envelope, { socketPath })
frommohdel/client. Same one-shot shape as/v1/image: plain JSON
response, no streaming, no enforcer,op: "transcription"driver
tag.audio.fileUriisfile://(gate sessions read the path —
requires a shared filesystem with the caller) ordata:(inline,
subject to the 16 MiB body cap). Rust protocol structs
(TranscriptionEnvelope/TranscriptionResult), conformance
fixtures, and an end-to-end session-dispatch test included; the
image and transcription paths now share one one-shot pool-exchange
helper in the gate.
mohdel v0.111.0
Added
- Speech-to-text via
model.transcribe(audio, options?)— a third call
primitive alongsideanswer()andimage(). One shared adapter posts
multipart audio to the OpenAI-compatible/audio/transcriptions
endpoint; registered forgroq,mistral, andopenai. Audio comes
from afile://ordata:URI; result is
{ status, text, language, durationSeconds, cost, timestamps }.
Factory path only for now — thin-gate has no/v1/transcriptionroute
yet, so the cross-process client cannot transcribe. mo transcribe <model> <audio-file>CLI command — MIME type guessed
from the extension (--mimeto override),--language/--prompt
hints,--jsonoutput, duration/cost summary on stderr.- Catalog support for transcription entries:
type: "transcription",
transcriptionPrice(USD per audio minute),"audio"in
inputFormat. Cost is duration × per-minute price when the provider
reports duration, with a token-pricing fallback for OpenAI's
gpt-4o-*-transcribemodels (computeTranscriptionCostin
_pricing.js). - Live transcription smoke tests (
test/live/transcription.live.test.js),
key-gated per provider; the audio fixture is a generated sine WAV.
Changed
- README repositioned around the gateway wedge new "How it compares"
section (LiteLLM, Vercel AI SDK, OpenRouter, raw SDKs). package.jsondescription rewritten in searcher vocabulary:
LiteLLM-style unified API, provider names spelled out, per-call USD
cost tracking, speech-to-text.
mohdel v0.110.0
Fixed
toEnvelopePromptnow accepts thetoolrole in addition totool_result
in the factory{ system?, messages }prompt shape, carryingtoolCallId
andtoolNameonto the envelope.
mohdel v0.109.0
Changed
fireworksprovider definition moved into alphabetical position in
providers.js(betweencerebrasandgemini). No behavioral change —
the provider config is byte-for-byte identical, only its source order
changed.@anthropic-ai/sdk^0.98.0 → ^0.100.1@google/genai^2.6.0 → ^2.8.0groq-sdk^1.2.0 → ^1.2.1openai^6.39.0 → ^6.42.0@clack/prompts^1.4.0 → ^1.5.1 (optional)lint-staged^17.0.5 → ^17.0.7 (dev)release-it^20.0.1 → ^20.2.0 (dev)vitest^4.1.7 → ^4.1.8 (dev)
mohdel v0.108.2
The release-it after:bump hook now refreshes both package-lock.json
and Cargo.lock after the version bump, so CI's npm ci succeeds and
the working tree stays clean through the cargo build. No runtime changes.
mohdel v0.108.1
No code changes from 0.108.0. The 0.108.0 release was tagged but
never landed on the npm registry — the publish workflow was migrated
to npm trusted publishing (OIDC) mid-release and the original tag was
cut against the legacy token-based workflow. 0.108.1 is the first
version of the 0.108 line actually available on npm.
mohdel v0.108.0
Changed
- Session log lines now carry trace context as a nested
span: { traceId, spanId, traceFlags }object instead of flat
traceId/spanIdfields at the root, matching the standard
OpenTelemetry pino convention. The publiccreateLoggerAPI and the
wire/event protocol are unchanged. @anthropic-ai/sdk^0.96.0 → ^0.98.0@google/genai^2.3.0 → ^2.6.0openai^6.37.0 → ^6.39.0lint-staged^17.0.4 → ^17.0.5 (dev)vitest^4.1.6 → ^4.1.7 (dev)
mohdel v0.107.0
Added
mo doctor— single-command health check covering config dir, environment
file, API keys per provider,curated.jsonparse + schema validation, and
default-model resolution. Pretty output by default;--jsonfor machine
consumers. Exits 0 on success (warnings allowed) or 1 on errors.- JSON Schema for
curated.jsonatconfig/curated.schema.json. Editors that
speak JSON Schema (VS Code, JetBrains, Helix, Neovim withcoc-json) get
autocomplete, inline type checking, and hover docs while editing the catalog.
Two ways to wire it: an inline$schemapointer at the top of the file, or a
.vscode/settings.jsonjson.schemasmapping. config/curated.example.json— five worked entries (minimal, full-featured
with thinking effort + cache pricing + leaderboard, deprecated stub, image
generation, custom rate limits) with inline$schemapointer.docs/CATALOG.md— full reference forcurated.json: required vs
recommended vs capability fields, image entries, custom-field convention,
editor support, and themo curate/mo model add/mo checkworkflow.docs/GLOSSARY.md— short definitions for envelope, thin-gate, session,
factory, creator vs provider, thinking effort, status, cooldown, and the
rest of the recurring vocabulary.docs/COOKBOOK.md— six copy-paste recipes (summarize a file, stream to
terminal, swap providers via env var, tool-use round trip, vision, batch
with cost totals).--helpformo model addandmo curate(and themo curatealias),
each with concrete examples and pointers to the catalog docs.- Friendly next-step hints in
mo askerrors: model not in catalog →
mo curate <provider>/mo model add <id>; API-key missing or rejected →
mo setup <provider>; broken deprecation chain →mo check. Hints are
pure pattern-match onerr.message/err.detail, so the lib layer stays
neutral. - Top-level meta-key support in
curated.json: keys starting with$(e.g.
$schema) or_(e.g._comment) are preserved on load/save but excluded
from every iteration site (alias map, suggestion search, rank index,
pickers, validation). Lets users embed a JSON Schema pointer or inline
notes in the catalog without polluting downstream behaviour. - New
src/lib/common.jshelpers:isMetaKey,catalogEntries,
catalogKeys,catalogValues— used internally by every catalog
iteration site so meta-key filtering stays consistent.
Changed
- README rewrite for clarity.
- Returning-user
momenu (when at least one provider is already
configured) leads withmo ask <model> "...", surfacesmo doctor, and
includesmo provider setup <p>for adding a second key. @anthropic-ai/sdk^0.95.2 → ^0.96.0@google/genai^2.2.0 → ^2.3.0