Releases: Amphidrom/nlght-ai
Release list
nlght-ai v0.1.2
Change notes — v0.1.2
Released: 2026-07-20
- docs: place Demo Showcase in the Getting Started hierarchy, remove the
duplicate page heading, and align all links with its slug.
(working/fix-showcase-page-consistency) - docs: move the executable demo gallery to a dedicated Showcase page so
Recipes contains only reusable AI patterns. (working/separate-recipes-from-showcase) - docs: reframe Recipes as concise AI patterns and align the demo documentation
with the six-case executable showcase. (working/refresh-recipes-and-demo-docs) - ci:
tests.ymlnow skips when the pushed commit carries av*release tag, so
a release runs onlyrelease.yml(which already enforces the full gate) instead
of both workflows in parallel on the same commit. (working/ci-skip-tests-on-release, ADR-0025)
nlght-ai v0.1.1
Change notes — v0.1.1
Released: 2026-07-19
-
release: process the final public-mirror exclude entry even when the file
has no trailing newline, preventing paths such asscripts/releasefrom
leaking into the public snapshot. (slice:
working/public-mirror-exclude-final-line) -
roadmap: document the planned move from blocking tool loops to asynchronous
orchestration where reasoning can continue around in-flight calls, suspend or
wait when necessary, and supervise subprocesses up to complete child
workflows. (slice: working/parallel-tool-orchestration-roadmap) -
agent skill: expand the
nlghtproject skill with code-backed public APIs,
complete platform/provider options, workflow/tool/playbook/session/protocol
patterns, diagnostics, deployment, and E2E coverage guidance; correct the
mutable step context, signal, and tool-event examples. (slice:
working/nlght-skill-reference) -
fix(coverage): count regular cloud provider implementations now that their
e2e suite contributes to CI coverage; exclude instrumented*_debug.py
duplicates and retain theollama_local.pyexclusion because its daemon-
backed e2e suite intentionally remains local-only. (slice:
working/provider-coverage) -
fix(ci): make
https://api.openai.com/v1the regular/debug OpenAI provider
default so an explicitly empty CIOPENAI_BASE_URLcannot produce relative
request URLs; retain non-empty Azure/proxy overrides. Run architecture tests
without starting an empty coverage process and generate the combined report
and XML in a dedicated step after unit, integration, and cloud e2e coverage
have been combined. (slice: working/openai-default-endpoint; ADR-0030) -
docs(skill): validate the nlght project skill metadata and synchronize its
model-provider guidance with the current provider kinds, defaults, debug
clients, continuation requirements, and shared e2e conventions. (slice:
working/update-nlght-skill) -
fix(model): the non-streaming Ollama tool loop (
call()with a catalog) never
sent the tool schemas — bothollama_localandollama_cloudbuilt the
/v1/chat/completionsbody as{model, messages, stream:False}with no
tools, so the model was never told the tools existed and returned no tool
call (streaming already sent them). Proven by an evidence log
(tools_in_request=None); fixed by deriving OpenAI-format tools from the
catalog and adding them to the body, mirroringstream(). Verified: the local
Ollama e2e suite now passes 5/5. (slice: working/model-provider-e2e) -
chore(model): preserve the fully instrumented Anthropic, OpenAI, Google,
Ollama local/cloud clients and shared Ollama HTTP transport as*_debug
modules, with both Ollama debug clients isolated onto_ollama_http_debug.
Regular production clients no longer emit diagnostic INFO/DEBUG request,
response, token, chunk, or tool-loop traces; operational warnings and all
provider bug fixes remain unchanged. (slice: working/model-provider-e2e) -
fix(model): Anthropic's streaming tool loop never invoked tools.
AsyncMessageStream.get_final_message()is async but was called without
await, sofinalwas a coroutine, theexceptswallowed the resulting
AttributeError, and tool_use blocks were never surfaced as tool_call events.
Non-streaming worked; both streaming tool paths (native catalog loop and the
step-drivenstream()loop) silently produced no call. Added theawait; a
regression test asserts a tool_use block in the final message reaches the
caller as a tool_call event. (slice: working/model-provider-e2e) -
fix(model): Google/Gemini 3.x tool loops failed with
400 INVALID_ARGUMENT
("Function call is missing a thought_signature"). Gemini 3.x returns a
thought_signatureon function_call parts and requires it echoed back on the
continuation; the client dropped it by rebuilding the part. The native loops
(call()andstream()with a catalog) now re-append the model's own turn /
function_call Parts verbatim instead of rebuilding them, preserving the
signature. The step-driven path carries it (base64) through the canonical
tool-turn (append_ollama_native_tool_turn) and_to_google_contentsdecodes
it back onto the Google part; other providers ignore the extra key. Unit tests
cover the canonical round-trip; confirmed against the live Gemini API (all
Google tool-loop e2e scenarios pass). (slice: working/model-provider-e2e) -
test(model-clients): restructure the e2e model-client suite so every client
is exercised by one shared scenario set (tests/model_client_suite.py:
non-stream call, streaming tokens, native tool loop in call() and stream(),
and the step-driven append_tool_turn() loop). Cloud clients (Anthropic,
OpenAI, Google, Ollama Cloud) stay intests/e2e; the local Ollama client
moves to a newtests/local_e2epackage that runs the same suite and is
deselected by default (-m "not local_e2e") — it needs a live daemon and
never runs in CI. Dropped the misnamed "ollama proxy" tests and the
local-Ollama e2e conftest. Env naming is now uniform and prefix-free
(<PROVIDER>_API_KEY+<PROVIDER>_MODEL, plusOPENAI_BASE_URL); the old
NLGHT_E2E_*model vars and the…_OLLAMA_CLOUD_URL/KEY/MODELtrio are gone.
Ollama Cloud gates onOLLAMA_API_KEYalone (default modelgpt-oss:20b, a
free-tier/no-subscription model), needs no URL. Also fixed a real suite bug: thebackendfixture was
module-scoped, so async SDK clients outlived their event loop and the Google
client raised "Event loop is closed" from the second test on — now
function-scoped, one client per test. README gains an e2e-scope note under the
badge block: the local Ollama suite is intentionally not run in CI (no daemon)
and is verified locally. (slice: working/model-provider-e2e) -
feat(model): Ollama Cloud
base_urldefaults tohttps://ollama.com
(overridable) so a cloud provider needs only an API key.OllamaCloudClient
gains the default;CompositionServicepicks the endpoint per kind
(ollama-local→ localhost, cloud kinds → ollama.com), any configured
base_urlstill wins. (slice: working/model-provider-e2e; ADR-0029) -
fix(model): Google's
gemini-2.0-flashwas decommissioned by the
provider (HTTP 404, "no longer available"), breaking all 5 Google e2e
scenarios. Replaced the hardcoded default everywhere it appeared
(production wiring incomposition_service.py, e2e test default, both CI
workflow env fallbacks, both doc examples) withgemini-3.5-flash.
Separately,GoogleModelClient.list_models()previously only ever
returned the static_CONTEXT_WINDOWStable — it now queries the live
Google Generative AI API first (client.aio.models.list()), falling back
to the static table only on error, matching the pattern
OpenAICloudModelClient.list_models()already used. Token-budget
resolution is unchanged (still the static prefix-matched table — Google
exposes no reliable context-window metadata endpoint). New/updated unit
tests mirror OpenAI's existing live/fallback test pair.
(slice: working/google-e2e-live-model-standards) -
fix(badge): replace the live
img.shields.io/pypi/v/nlght-aiPyPI badge
with a self-generated staticpypi.svg, rendered the same way as
tests.svg/coverage.svg(anybadge). Owned by a third lifecycle:
prepare_release.pyregenerates it from the version being bumped, at
bump-before-tag time (ADR-0025), so it travels with the normal pre-tag
commit — no live PyPI query, no new release-workflow step (the tagged
commit already carries the right file viagit archive). Initial value on
main:v0.0.1.release_badges.pygainedgenerate_pypi()and apypi
CLI subcommand;pypi.svgjoined theBADGEStuple that drives both the
repo's own README and the tag-pinned public/PyPI-description markdown.
(slice: working/pypi-self-generated-badge, ADR-0028) -
docs(memory): explain the full store-to-prompt pipeline, including Weighted
Sigmoid as the default relevance strategy, Linear and Multiplicative
alternatives, effective thresholds and limits, cache semantics, prompt
disclosure controls, and the boundary between Python wiring, YAML, and fixed
internals. (slice: working/session-doc-illustrations) -
docs(models): document context-budget resolution and unknown-model fallbacks
for every provider; distinguish local Ollama/api/showdiscovery from
static cloud tables, and correct the shared partition chart to the actual
Store/Prompt/Response/Safety 40/20/20/20 split.
(slice: working/model-provider-budget-docs) -
docs(access): visualize rule-based access-policy evaluation, including the
default-open no-rule path, priority/tie ordering, and fail-closed allowlist
semantics when subject rules exist. (slice: working/echarts-visualizations) -
docs(concepts,hero): keep Concepts graph nodes and legends inside their
chart bounds across desktop and narrow layouts, and add a responsive index
hero topology that connects an app through nlght-ai to its four core user
benefits: explicit workflows, persistent memory, any model, and self-hosting.
(slice: working/echarts-visualizations) -
docs(diagrams): migrate every fixed rectangular node-link chart to the
responsive rectangle-edge integration, preserving native labels, tooltips,
emphasis, and edge semantics while making arrow endpoints exact; improve
Signals Sankey labels and the final responsive hero composition.
(slice: working/rect-graph-doc-migration) -
docs(hero): add three temporary hero-visual preview pages
(/hero-variant-1 platform map with request particles, /hero-variant-2
draggable concept constellation, /hero-variant-3 timeline pulse) for the
index-page hero decision; the chosen one moves into docs/index.mdx and
the previews get deleted. (slice: working/echarts-visualizations) -
docs(concepts): add in-chart legends to all five concept diagrams (g...