Changelog¶
For the complete release history, see CHANGELOG.md in the AMX repository
or the GitHub Releases page.
The repo's CHANGELOG is generated from Conventional Commits
by python-semantic-release.
Latest highlights¶
0.19.0 — VS Code extension + native management from the editor¶
AMX now ships a full VS Code extension — Activity Bar trees for
Profiles, Catalog, History, and Schedules; the Studio surfaces (Ask
chat, run launch with live SSE progress, Run detail, the Lineage
canvas, Pages, Settings) rendered as webview panels inside the editor;
catalog-backed SQL intelligence in .sql files (hover
descriptions, completion, CodeLens, optional coverage diagnostics
across every configured profile); and a granularity-aware selection
lookup that resolves a table reference selected in any file — even
inside a Python spark.sql("""…""") string — to its Studio page. The
extension works in VS Code, VS Code Insiders, Cursor, Windsurf, and
VSCodium. See the new
AMX in VS Code (extension) guide for the
full tour.
The distribution model is deliberately in-product, not Marketplace:
the extension is bundled inside the amx-cli wheel, so its version
always equals the AMX that shipped it and the editor surface can never
drift from the server API. Installation is one command — the new
/vscode REPL wizard detects installed editors across macOS, Windows,
and Linux and installs through each editor's own CLI, with
/vscode status reporting installed-vs-bundled versions and a manual
.vsix fallback when no editor CLI is on PATH. Studio gains a matching
Settings → VS Code tab with per-editor cards, an update-available
badge, Install / Reinstall / Uninstall buttons, and a Download .vsix
link.
Under the hood the server learned to host this: an embedded Studio
mode serves the SPA into editor webviews against the local API, and
the extension either adopts a Studio server already running from the
REPL or starts its own headless one on 127.0.0.1 behind a
per-session bearer token. If no AMX install is found at all, the
extension offers to install amx-cli into a managed environment.
Updating stays in lockstep too: after pip install -U amx-cli, run
/vscode install again (or click Reinstall in Studio).
0.18.0 — MCP for IDE agents + native Databricks lineage + lineage in RUN/ASK¶
AMX now exposes its catalog to the code agents inside your IDE over the
Model Context Protocol. Once the local stdio server is registered in
Cursor, Claude Desktop, or VS Code Copilot, the agent can list_schemas,
describe_table, lineage_for_table, search_docs, search_code, and
the rest of the read-only catalog surface against AMX's local cache —
without a database password, without a network service, and without
exposing the underlying data. See the new
Connect your IDE (MCP) guide for setup snippets per
client and the full tool list.
Native Databricks lineage lands as a first-class surface on the
Lineage canvas. The picker hits Databricks' lineage REST endpoints
(rather than system.access.*) and renders neighbours as privilege-
tiered name-only ghost nodes when the caller has only directory-level
visibility — names without column counts, so the canvas is honest about
what AMX actually saw. Clicking a ghost lazy-ingests that single
asset into AMX: notebooks resolve through a persisted workspace path
index (no 40-second workspace scan, no broken object_id round-trips),
and queries / jobs / pipelines ingest by id. After ingest, assets open
inside AMX by default with an explicit "open in Databricks" link
for power users — the previous deep-link plumbing that shipped to
Databricks UI on every click has been removed in favour of this
in-AMX-first flow. The asset-ingest endpoint requires the writer role
so view-only members cannot mutate the shared catalog.
Lineage neighbours in RUN and ASK. A shared one-hop neighbour
query core now feeds both /run and /ask so CLI and Studio reach
parity on canvas-free lineage context. RUN's analysis blocks for a
table carry the named neighbours plus their descriptions (no canvas
required); ASK's retrieval surfaces the same neighbour appendix at the
bottom of the answer with explicit artifact_filter semantics so it's
clear which assets contributed. Performance is bounded with a sanity
test so the new join cannot regress hot-path latency.
This release also rolls in the docs catch-up itself: the
/pages and /admin CLI namespaces, the remote code-asset ingestion
flow for Snowflake notebooks and Databricks notebooks / jobs /
pipelines / queries, the Browse-page per-asset chunking override, and
the shared catalog / lineage / pages collaboration tables all gain
dedicated documentation. Previously these surfaces only appeared as
one-liners in earlier changelog entries; the topic-specific pages are
now caught up to the shipped behaviour.
0.17.0 — Trino / Presto + Hive (HiveServer2) backends¶
Two new first-class adapters land, taking the supported-backend count to twelve.
Trino / Presto (backend: trino, install with
pip install 'amx-cli[trino]') targets the distributed-SQL
coordinator over the standard HTTP protocol. Trino and Presto share
the same wire protocol so the adapter covers both. ANSI
COMMENT ON TABLE / COLUMN / VIEW / MATERIALIZED VIEW / SCHEMA
writeback flows straight through to whatever connector the
coordinator is pointed at — hive, iceberg, delta, memory,
tpch — with single-quote escaping handled by the adapter.
Three-level catalog hierarchy (catalog.schema.table) is wired
through the picker, the cache, and Studio's settings form.
Basic and JWT auth modes ship in the wizard; OAuth2 and Kerberos
are accepted as hand-edit paths for power users. See the
Trino / Presto page for the wizard walkthrough,
sample configs, capability matrix, and a Docker dev compose snippet.
Hive (HiveServer2) (backend: hive, install with
pip install 'amx-cli[hive]') targets the HiveServer2 SQL gateway
over Thrift. The [hive] extra uses pure-sasl (pure Python)
instead of the legacy sasl C extension, so it wheels cleanly on
macOS, Linux, and Windows. Table / view / database (== schema)
comments write back via ALTER TABLE / VIEW … SET TBLPROPERTIES and
ALTER DATABASE … SET DBPROPERTIES. The wizard surfaces
PLAIN / LDAP / NOSASL for the four mainstream deployments
(local Docker / on-prem Hadoop / AWS EMR / Cloudera CDH+CDP);
KERBEROS and CUSTOM auth modes are accepted as hand-edit YAML
overrides. Bulk metadata caches via Hive 3.x information_schema
with a DESCRIBE FORMATTED parser fallback that handles the
row-shape drift between Hive 2.x, 3.x, and 4.x. Column-comment
write-back is intentionally OFF on Hive — Hive's only column path
requires re-declaring the original column type, which is lossy for
complex types (struct, map, array); /apply raises
UnsupportedDatabaseOperation cleanly upstream so users get a
clear error instead of a silently-broken schema. Apply Hive column
comments through dbt or Apache Atlas instead, or migrate the table
to Trino / Databricks Unity Catalog / PostgreSQL where native
column-comment DDL is safe. See the
Hive page for the deployment matrix, the
disambiguation against Databricks legacy hive_metastore catalogs,
and copy-paste configs for each scenario.
This release closes [issue
518](https://github.com/omeryasirkucuk/amx/issues/518) — thanks to¶
@ying-w for the request.
0.16.0 — Lineage canvas rebuild + AI Generate quality¶
The Lineage canvas is rebuilt from the ground up. Per-column typed handles render every table as a column-row card with its own connection ports; Bezier edges carry hover labels colored by relationship type; a rich top toolbar adds undo / auto-arrange / search / attribute-tracker / PNG export / SQL import-export. A single canvas can host nodes from any number of DB profiles, so Postgres tables, Snowflake tables, and a Power BI logo can all sit in the same diagram and connect to each other. See the Lineage page for the full feature surface.
AI Generate gets a three-layer quality pass. The LLM now sees the
anchor's full context — table + column descriptions, FK partners,
views that join the anchor, and recent query-log co-occurrence —
instead of bare metadata, and candidates are ranked by a weighted
sum over six signals (FK partnership, view co-mentions, query
co-occurrence, shared column names, name prefix, matching
column-name tokens) so SAP-style sibling-prefix tables never fill
the prompt. The output contract switched to explicit column-pair
edges with an evidence enum (FK | view | co-query | name |
inferred); self-loops are rejected at the parser; the streaming
hook reuses existing canvas nodes so picking an anchor never spawns
a duplicate. Anchor resolution falls back to (profile, schema,
table) when the picker's database label differs from the catalog
row's synced label, and a ghost-endpoint filter drops streamed
edges whose source / target isn't in catalog_entities. Prompt
size is capped so LLM provider errors (e.g. out-of-credit) surface
as clean SSE warnings within seconds instead of hanging until the
tunnel cuts the connection.
New node types: standalone Logo nodes for external systems
(22 default brand logos seeded inline from SimpleIcons with
Iconify fallback; custom uploads shadow any default under the
same key) and a rich-text Label node (font size, bold,
color, bullet list, auto-grow with paragraphs). Every node type
carries an explicit floating delete button on selection; multi-
select via ⌘/Ctrl-click and Shift-drag rubber-band removes every
selected node and its incident edges in one pass. Save-canvas
re-opens by id (?artifact=<id>), so naming a canvas the same as
a real table no longer collides with the anchor resolver. New
sticky-note Comment node with a six-color palette + resizable
NodeResizer.
Catalog cache stops auto-expiring at 7 days — a profile with
state='done' is fully synced regardless of age. The
/api/catalog/freshness pill still flags profiles past one week
(was 24 h) as stale: true. Ask gets three new cache-only tools
(catalog_coverage_summary, catalog_inventory, describe_column),
a 1-second LLM heartbeat surface during long tool rounds, a live
activity feed per tool dispatch, a structured needs_live_refresh
envelope (instead of hidden tools) with a one-click "Enable Live
refresh & retry" affordance, and a catalog_sync_status tool that
short-circuits every "are my tables fresh?" question to a single
zero-DB-query call. The Scheduler daemon now actually loads on
modern macOS (launchctl bootstrap / enable / kickstart) and
distinguishes installed from loaded so Studio's Schedules page
stops showing misleading green checks for unloaded plists.
0.15.0 — Scheduled jobs, hybrid RAG, LLM price browser¶
Recurring runs ship as a first-class feature: a cron-based daemon runs
on macOS, Linux, and Windows; Studio adds a schedule edit dialog and a
one-click install/uninstall flow. The scheduler plumbs the full cascading
scope tree (profile → database → schema → table → column) into the
orchestrator and persists column_overrides so a "/analyze on Mondays"
schedule lands exactly the same scope you would have picked
interactively.
Document RAG gets serious hardening. An FTS5 sidecar with RRF fusion adds hybrid lexical + semantic retrieval; an opt-in cross-encoder reranks the top candidates; MMR diversity reorders the rerank output to avoid near-duplicates; a format-dispatching chunker respects Markdown headers so chunk boundaries fall on natural sections. A gold-set runner with a baseline regression CI gate locks retrieval quality in place. Edges-first context assembly with a model-aware budget gives the agent the citation chain it actually needs to ground its answer.
The LLM price browser lets you pick prices for any LiteLLM /
OpenRouter model from Studio or CLI; the sidebar surfaces the live
token-consuming rate and the run detail page records both the price
the run actually used and the price it would consume today. Code RAG
defaults to jina-embeddings-v2-base-code (MiniLM fallback) and
collection identity v2 records embedding_dim so port mismatches
surface in Catalog Search instead of silently returning wrong
neighbours.
The bulk-review UX adds filter / search / sort / group, multi-select
with bulk actions, pagination, URL-shareable state, keyboard
navigation, and column-level compare. Cancellation is now real across
/ask, /run, and the scheduler: cancelled runs are tagged
cancelled (never success), runs where every asset failed flip to
failed, and the Studio SSE consumer no longer hangs waiting for a
terminal frame. See the detailed sub-sections below for variations, the
re-run modal override parity, the CLI override picker, and the docs
update covering alternatives mode and confidence signals.
Variations: seeded re-run + per-run model selector¶
Studio's run-detail page now renders a ✨ trigger next to every
alternative in the Results tab. Click it to open the Variations
modal: the chosen alternative is shown read-only as the seed, a
top-level radio picks between semantic (paraphrase the seed) and
lexical (share vocabulary with the seed, allow meaning to drift),
and the existing Advanced LLM settings disclosure exposes every
LLM knob with the diversity-mode row suppressed because mode lives
at the top-level. Submit → a worker thread fires; the new
run_results row carries five new audit columns
(seed_alternative_id, seed_alternative_text, parent_run_id,
model, provider) so /history show <run> and Studio can trace
the seed lineage and the effective LLM identity per row. The seed
text is filtered back out of the alternatives list before
persistence.
The same Advanced LLM settings block grows a per-run profile
selector at the top of the Generation section. Pick a different
saved profile to swap the whole provider / model / api_key /
api_base bundle for this single run only — per-knob overrides
(temperature, max tokens, …) layer on top. Profiles on disk are
never mutated. Profiles whose API key isn't configured surface a
no key suffix in the picker and the submit button disables with
an inline pointer to Settings → LLM. The Advanced block also gates
thinking_budget and the logprob_* rows on whether the
(provider, model) pair actually supports those knobs — the
capability table now lives centrally at amx/llm/capabilities.py
and ships through GET /api/llm/capabilities.
CLI parity: /variations <result_id> <letter> mirrors the modal
flow (A / zero-based index both accepted, --mode,
--instructions, --temperature). When --mode is omitted the
CLI defaults to the parent run's alternatives_mode so a follow-up
exploration stays consistent.
Backend: new POST /api/runs/variations endpoint (separate from
/rerun-item because the wire shape differs: result_id +
alternative_index + seed_text + top-level mode instead of
result_ids). LLMOverrides.profile lets callers swap the whole
saved-profile bundle atomically; unknown profile names degrade
safely to the active profile. The profiles router exposes
has_credentials with a lazy in-process cache: literal keys take a
fast path with no keyring lookup; keyring: references resolve once
per (profile, ref) pair and are invalidated on profile mutation.
GET /api/runs/{id}/results?include_descendants=true returns the
descendant Variations + Re-Run tree (Variations recurse three
levels, Re-Run one) — wired ahead of the upcoming inline-nested
run-detail display.
Re-Run modal: full LLM override parity with RunNew¶
Studio's Re-Run modal (asset-row ↻ and the multi-select batch re-run that reuses the same modal) now mounts the same Advanced LLM settings form block as RunNew. Every knob exposed on RunNew is exposable on Re-Run: temperature, max output tokens, alternatives per column, column batch size, prompt detail, description verbosity, confidence signal, alternatives diversity mode (disabled when alternatives per column is 1), thinking budget, plus the confidence thresholds (high / medium) and cost overrides.
Resolution semantics match RunNew: each field shows the active profile's value as a hint, edits become per-run overrides only, the Reset to profile defaults link rewinds in one click, and the saved LLM profile on disk is never mutated. Batch re-run notes that defaults reflect your active LLM profile and overrides apply uniformly to all selected items.
Backend: POST /api/runs/rerun-item now accepts an llm_overrides
field with the same shape as LLMOverrides on /api/runs; the
legacy temperature_override shim stays for one release so
in-flight Studio bundles don't break. The orchestrator's
_llm_for_rerun adopts the immutable dataclasses.replace pattern
used by /api/runs. New rerun runs persist the effective LLM config
in analysis_runs.settings_json so /history show <run> reports
what actually ran.
CLI parity exception: the CLI does not expose per-run
/rerun --alternatives-mode (or --confidence-signal, etc.). The
single tactical exception is /rerun --temperature for diversity
nudges. The full override surface on the CLI side lives in the
interactive picker on /run. Documented on
Studio run detail and
Concepts → Alternatives mode.
CLI override picker parity¶
The CLI's interactive /run override gate ("Override LLM settings for
this run? [y/N]") now exposes the alternatives_mode and
confidence_signal rows, reaching parity with Studio's RunNew →
Advanced LLM settings panel. The picker:
- Skips the
alternatives_moderow when the effectiven_alternativesis 1 (mirrors Studio's tile-disabled rule). - Always prompts for
confidence_signal— single-answer runs still surface a band. - Writes the chosen values to a derived
LLMConfigfor the run only;~/.amx/config.ymlis never written. - Lands the effective values in
analysis_runs.settings_jsonso/history show <run>can explain after the fact why a given run produced what it produced.
Per-run CLI flags (--alternatives-mode, --confidence-signal)
remain deliberately out of scope: the picker is the interactive
parity surface; non-interactive /run invocations stay fully
profile-driven so config.yml is the single source of truth for
scripted runs. See the new design note on
Alternatives mode → Override per run.
The cli/run-and-apply.md page also drops the misleading
/generate REPL section — single-shot generation is a Studio-only
path (POST /api/generate/column etc.); the documented CLI flags
never existed.
Docs — Alternatives mode + Confidence signals¶
Two new Concepts pages cover features that were under-documented:
- Alternatives mode explains the
semanticvslexicaldiversity dimension on every LLM profile. Includes the Definition 1 wording (semantic = paraphrase / same meaning, different words; lexical = shared vocabulary / shifted meaning), worked examples per mode, profile + per-run set instructions for CLI and Studio, and where the[Semantic]/[Lexical]badge surfaces in results. - Confidence signals documents
the five scorers (
self_consistency,logprob,self_decl,judge,none) end-to-end: what each one measures, how it's computed at a high level, the score range, how to read the HIGH / MED / LOW bands, and the per-alternatives_modeexpected SC distribution that AMX's runtime guardrail watches. Includes a short "how to read the score" guide for non-ML-literate readers.
config.yml gains the
alternatives_mode and confidence_signal rows in the LLM-profile
example and a cross-link block after it.
Run & Apply, Setup, and
Studio Settings cross-link into the new pages.
0.14.0 — Live cost everywhere, Re-Run, Studio Landing¶
Every LLM call AMX makes now reports tokens and USD cost at every
surface — /ask, /run, the run progress header, the Tokens &
cost card on the run detail page, the lifetime card on the Studio
Overview, and a top-bar pricing-cache freshness badge with a one-click
refresh button. Pricing is fetched live from a versioned per-(provider,
model) table, cached on disk with a freshness timestamp, and overrideable
per model from Settings → LLM. Every run records both the price it ran
at (frozen) and the price it would cost today (live), so a stale price
never silently rewrites history.
Re-Run. A run_results row, or a multi-row selection, can now be
re-executed with the original context preserved — DB scope, prompt
detail, alternatives count, and the cached first-run table profile are
reused so a re-run is comparable to its source instead of a fresh shot.
The introspection cost absorbed on the first run is amortized across every
subsequent re-run.
Studio Landing. / is a calm landing page; the dashboard moved to
/overview (with a redirect from the legacy URL). The sidebar gets a
DB profile search box and per-profile collapse, so a workspace with
many profiles stays navigable. The brand renders as "AMX Studio" — a
pixel mark + text wordmark in the top bar — and the browser tab title
is consistent across pages.
Run lifecycle controls. A running run can be cancelled from both
the Runs list and the Run detail page. Applying the pending queue
opens a confirmation modal that names the row count and target
database. An already-applied row can be revised inline and writes a
new audit entry. The live /runs/new-{jobId} view redirects to the
persisted detail page as soon as run.created fires, so the user
gains access to the full edit / pick / apply controls immediately.
Compare rebuild. New asset picker, surfaces per-row confidence and log-prob, marks winners, includes a cost row, and computes overlap against the actual same-asset set rather than the union of asset sets (which over-stated agreement on partial coverage).
Audit timeline. /audit is reorganized into day groups with inline
before/after diffs and author chips, so a row's history is readable at
a glance. Filters by run id and DB profile still apply on top.
LLM reasoning trace. When the provider returns one (Anthropic extended thinking, GPT-5 / o-series, DeepSeek-reasoner, Kimi K2.x), the reasoning trace is rendered alongside the answer on the Run detail page rather than thrown away.
/run parity. Single-shot /run now respects
n_alternatives, verbosity, temperature, and prompt_detail the
same way the full /run path does. The run row captures the target
database / catalog so a re-run can reproduce the original scope.
Per-table Gen in Studio spawns a background run instead of
blocking the UI on an inline LLM call.
/max-tokens REPL command plus raised default max_tokens
ceilings and modernized reasoning-token handling so reasoning models
get a 32 k reasoning floor on top of the configured output budget.
Concept cleanup. The "Active backend" Overview card and the entire "Active DB profile" concept are gone. Every saved DB profile is its own expandable row in the Browse sidebar; two browser tabs on different profiles never collide; and the apply path is pinned to the run's own DB scope rather than whatever profile the user happens to have selected. The Studio's per-table comment and Generate buttons all carry the per-page profile so the write lands on the right backend.
Hygiene. Console no longer leaks Rich markup tags into terminal
output. /usage aggregates every run kind (not just analyze.run),
and list_recent_runs pulls tokens_json so the aggregation has
data to sum. Residual Turkish content has been purged from CLI text,
Studio surfaces, the agent path, and earlier CHANGELOG entries.
0.13.0 — Doc & code RAG into /ask, Studio polish, durable secrets¶
/ask finally reads the user's documentation and codebase. Two new
LLM-callable tools (search_docs, search_code) ground answers in
the doc RAG and the amx_code Chroma index that previous releases
already built — both surfaces existed in 0.12.x but were never wired
into the agent loop. When nothing is in scope, the tools short-circuit
with a structured no_*_for_scope payload so the LLM doesn't
hallucinate definitions or callsites. Lazy-init keeps the no-context
/ask path zero-cost.
Doc/code ↔ DB profile linking. Each doc or code profile can now
be linked to one or more DB profiles. /ask running against scope
{X} only pulls from doc/code profiles whose link list contains X
(or is empty = global). New CLI commands /doc-link, /code-link,
/ask-context. Studio's Settings → Docs/Code wizards expose the link
as a multi-select chip control, and AskChat shows a small 📄 N docs ·
💻 M code badge above the scope dropdown so you always know what
the agent has in its tool window.
Drag-drop document upload. Studio's Settings → Docs gets per-card
and per-wizard drop zones. Files land under
~/.amx/uploads/<profile>/<sha256>.<ext> with per-file 25 MB and
per-batch 100 MB caps and idempotent profile-path registration. The
CLI counterpart /doc-add <profile> <file>... shares the same
storage module, accept-list, and size guards. Empty-state nudges and
a small cli_support/hints.py helper point terminal users at the
visual surface and vice versa.
Studio Code Search & Code Analyze. A new Search code box on
Settings → Code mirrors the docs search (no LLM, just embedding
similarity over amx_code). Each code-profile row gains an
Analyze button that runs the Code Agent against the cached
/code-index and streams per-table progress; the on-disk JSON cache
shape is byte-identical to what /code-results writes from the CLI,
since both call into the new shared amx/codebase/agent_service.py.
The CLI gains /code-search for the keyboard-only equivalent.
Live progress on numeric run-detail pages. A run still being
processed by a worker thread now exposes live_job_id on
GET /api/history/runs/{id}; the run-detail page subscribes to the
SSE stream and renders a compact activity card above the tabs. The
live /runs/new-{jobId} view also redirects to the persisted detail
page as soon as run.created fires, so users gain access to the full
edit / pick / apply controls immediately instead of waiting for the
worker to finish.
Apply path is finally well-behaved on Postgres. Per-row
SAVEPOINT isolation in apply_review_results_to_db so one failed
COMMENT (eg. wrong schema name) no longer cascade-poisons the whole
batch with InFailedSqlTransaction. The Studio Apply pending queue
button now pins the worker to the run's own database/catalog instead
of falling back to the active profile's pinned default — old runs
that didn't capture scope on the row get an inline database picker
on the run-detail page.
Inline scope picker on /runs/new. Clicking + New run on the
Runs list without a sidebar-scoped URL now shows a chip-based DB
profile + database/catalog picker instead of a "no scope selected"
warning, so a run can start without first navigating through the
sidebar.
Keyring references survive reinstalls on every OS. Previously, a
single transient keyring backend outage (macOS Keychain ACL miss
after a binary path change, gnome-keyring / KWallet not running on
Linux, Credential Manager access denied on Windows) permanently
deleted the YAML's keyring: pointer because the next cfg.save()
overwrote it with "". The resolver now leaves unresolved references
intact, the LLM provider substitutes AMX_LLM_API_KEY for outgoing
auth, and the DB connector strips them on a replace() copy — so
the dataclass + YAML keep their pointers and the next process with a
healthy backend resolves the secret automatically.
Cold-path bench guard in CI. tests/perf/bench_ask_no_context.py
pins the four no-context guarantees the doc/code RAG plumbing
introduced (search_docs / search_code short-circuit, scope-resolver
micro-cost, ToolBox.schemas() constant time) so future regressions
don't sneak in unnoticed.
0.12.9 — Multi-profile browse, /ask, and AMX Studio launch¶
AMX is multi-profile end-to-end. Both Studio and the CLI's /ask now
operate across every saved DB profile simultaneously — no more switch
dance.
Browse (Studio). The sidebar tree shows every saved DB profile as
its own expandable row (profile → database/catalog → schema → table).
Click any node to open it; per-request scope means two browser tabs
on different profiles never collide. The legacy "Switch" pill is
gone. Routes are explicit: /db/:profile/:database/:schema/:table
for 2-level backends and /cat/:profile/:catalog/:schema/:table for
3-level (Databricks UC, BigQuery). Inline comment editors and the
"Generate description" buttons all carry the per-page profile so the
write lands on the right backend.
Multi-profile /ask. Catalog tools span the configured profile
list in a single SQL pass via db_profile IN (?, ?, …). Live-DB
tools (list_schemas, list_tables_in_schema, list_databases)
parallel-query each profile via ThreadPoolExecutor (cap 8 workers,
8s per-profile timeout — slow profile never blocks the others).
Result rows always carry db_profile so the LLM cites the right
source. New find_joinable_across_profiles tool scores
cross-DB join candidates with a 4-signal mix (column-name token
overlap, dtype compatibility, vector similarity, FK pattern) so
"what can I join this table with from a different DB?" is one tool
call away.
Studio scope dropdown. Above the Ask textarea: a multi-select
profile picker (sticky per chat session, resets on + New) plus a
read-only "Focus: X (auto)" hint when the conversation has
gravitated toward one profile in recent turns. The auto-focus
heuristic scans the last 3 assistant turns; ≥60% mention dominance
biases the system prompt without locking out cross-profile
questions. Answer footer shows
N profiles · X.Ys · focus: WAREHOUSE per turn.
CLI /session everywhere. /session list, /session resume <id>,
/session new, /session end, /session scope now dispatch from
every tab (was previously failing inside /search). The slash
registry lists /session next to /ask under the search group.
Resumed chats now replay the prior 4 Q/A pairs into the agent so
follow-up references like "that table" / "the second one" resolve
without re-explaining context.
Profile cleanup. Deleting the active or last DB / LLM profile is
now allowed. Empty config surfaces a friendly "configure an LLM
profile" prompt (Studio: 412 + configure-llm hint with "Open LLM
settings" / "Run doctor" CTAs; CLI: /search discussion-requires-LLM
message).
Robustness.
- Friendly LLM errors.
/askno longer hangs on "Reasoning…" when the LLM is broken. Studio shows the configure-llm banner immediately on a missing provider/model (412 pre-flight); worker failures emit ajob.failedSSE event with classification (auth / rate-limit / network / model-not-found →configure-llmhint; generic errors stay generic). - CLI Ctrl-C cancels cleanly. First press sets a
cancel_tokenthe agent loop polls between iterations; second press also raises KeyboardInterrupt for stuck socket I/O. The chat surfaces "Cancelled by user." rather than draining the question to completion. - Last/active profile delete.
/remove-db-profileand/remove-llm-profileno longer refuse the only profile — config resets to empty, downstream surfaces handle it. list_databasesshows full reach. Asking "which databases do I have" across two profiles now enumerates every reachable database/catalog per connection, not just the pinned default.- LiteLLM startup chatter silenced. Corp-network TLS proxies no
longer surface a "Failed to fetch remote model cost map" warning
on every
/ask—LITELLM_LOCAL_MODEL_COST_MAP=Trueskips the GitHub fetch entirely.
AMX Studio launch. The local web UI is AMX Studio. The slash
command is /studio, the Click subcommand is amx studio, and the
Python entry point is amx.web.launch_studio. The user-facing brand
(FastAPI title, browser tab, auth error messages, Settings copy) all
reads "AMX Studio." See the Studio docs for a full
walkthrough.
amx.core Python library API cleanup (BREAKING). amx.init,
AMXApplication.ask_with_tools, LoopBasedAskAgent, AskToolbox,
ToolAskResponse, ToolResult, ReasoningTraceStep, and
infer_table_metadata (free function) are removed. Use
AMXApplication.load(...), app.ask(...), and the new typed
app.infer_metadata(schema, table, ...) -> list[InferenceResult]
instead. See the migration block in the
repo CHANGELOG.
On-demand driver and dependency install. Connecting to a new DB
backend (Snowflake, BigQuery, Databricks, MySQL, MS SQL, Trino,
Redshift, …) installs the driver on first connect; feature-gated
packages (RAG, codebase analysis, optional LLM provider SDKs)
auto-install on first use. The pip install amx-cli[…] extras still
work for reproducible environments.
0.12.8 — AMX Studio umbrella release¶
AMX Studio reaches feature parity with the REPL. Thirteen UI-overhaul PRs +
Stage 2–7 parity work + a design-system reset land together in 0.12.8: the SPA
can now drive /run end-to-end (with live SSE progress and a tabbed run-detail
view that surfaces every alternative), full DB / LLM / Docs / Code wizards live
on Settings, the new System page covers amx doctor / token usage / catalog
status / team history-store / one-click placeholder cleanup, and every Browse
page (database / schema / table / column) gets inline-edit + per-asset
Generate that drafts a single comment through the same human-in-the-loop
queue the CLI uses. AMX Studio is dark-only, sits on a warm-amber palette,
and ships under a pixel-art AMX brand mark. README and amxcli.com both grow a
/studio entry point with the Overview screenshot.
Also in 0.12.8: Ctrl-C now interrupts the running command instead of tearing
down the whole REPL session, and /edit "Bulk by table" respects mode selection
+ survives a stale catalog (live-DB fallback splices the user's pick back in).
0.12.7 — databricks_serving is a first-class LLM provider¶
/add-llm-profile now lists databricks_serving alongside OpenAI / Anthropic / Gemini
/ etc. Pick a Foundation Model endpoint (e.g.
databricks-meta-llama-3-1-70b-instruct, databricks-dbrx-instruct) or a custom
serving endpoint published in your workspace, paste the workspace host, paste a PAT —
done. AMX builds the /serving-endpoints URL for you. The big win: the LLM lives in
the same workspace as the SQL warehouse you're documenting, so there's no extra vendor
contract, no second authentication path, and inference cost stays on your existing
Databricks bill. See Databricks Serving for the
full walkthrough.
Also fixed in 0.12.7: OpenAI Responses-style structured content blocks
({"type":"output_text",...}) are flattened before pydantic validation, so reasoning
routes that emit content arrays no longer fail draft parsing.
0.12.6 — Databricks /ask polish + list_volumes tool¶
The Databricks experience for /ask is noticeably less wizard-y in 0.12.6:
- Auto-pick the user catalog. When the workspace has exactly one user-visible
catalog (the common case for analyst sandboxes and team workspaces),
/askpicks it silently instead of looping through a "select catalog" prompt for every question. - Catalog-scoped tools all auto-pick.
list_schemas,list_tables,describe,sample— every tool that needs a catalog now uses the same auto-pick logic, not just the first one. list_volumestool./askcan now answer questions about Unity Catalog Volumes ("what volumes exist?", "what's involume_x?"), not just tables.- TLS asked first in
/db /add-db-profile. The wizard used to probe catalogs before knowing whether the workspace had custom TLS — corporate-CA setups would fail the probe and you'd have to start over. TLS now comes first, the catalog probe runs with the right truststore on the first try.
0.12.5 — /edit-db-profile + /use-rag-llm + safer profile writes¶
/edit-db-profile. Edit an existing DB profile in place — same wizard as/add-db-profilebut pre-fills with the current values, so press Enter to keep, type to change. Pairs with the existing collision-detection on/add-db-profile, which now points you at/edit-db-profileinstead of failing./use-rag-llm. Pin a different LLM profile to the RAG agent (the one that fuses documentation + codebase evidence into a description) than the one drafting columns. Useful when a cheaper fast model is enough for prose synthesis but you want a stronger model on the column-drafting path. Run with no args for an interactive picker, or/use-rag-llm noneto clear the override.- Profile writes are transactional. A bug where newly-created profiles could be
silently empty after an
amxrestart (autosave running between two assignments with stale state) is fixed —upsert_db_profile+set_active_db_profilenow run insidecfg.transaction()so save() sees consistent state. - Validating catalog/database picker. The wizard now validates the catalog/database name against what the connection actually exposes, instead of taking the user's typo at face value and failing on the first query.
/schemaand/table(singular) removed. Use the plural/schemasand/tables(under the/dbnamespace) — they were the canonical commands all along and the singular forms were undocumented duplicates.
0.12.0 — /doctor streams staged progress like /run¶
/doctor (and the in-session /doctor) now print one [Stage] line per phase as
the check runs — [Binary], [Python], [Schema], [FS], [Drivers], [DB],
[LLM], [History] — using the same live progress format /run uses. A stalled probe
(typically the LLM models-endpoint ping) is now visible as in progress for much longer
than its peers instead of looking like a hang, and the closing
✓ /doctor finished in Xs. N passed, M failed. summary mirrors /run's footer with the
first remediation inline. Exit codes are unchanged (0 clean, 1 if any ✗); under
--skip-network the [LLM] stage collapses to a single skipped line. See
/doctor for the full sample output.
0.12.0 — shared run-history store for team collaboration¶
AMX has always kept its run history in a single SQLite file at ~/.amx/history.db — fine
for one engineer, invisible to teammates. 0.12.0 introduces an optional shared mode:
every /run, /run-apply, and /ask invocation is dual-written to a backend the team
already owns (PostgreSQL, MySQL, MSSQL, Oracle, Snowflake, Databricks, Redshift, or
BigQuery) under a dedicated AMX schema, so two engineers running AMX against the same
warehouse can finally see each other's analyses, results, and review decisions.
Onboarding is one command — /history-store (under the /db tab) opens an interactive
picker. See Shared history store for the full
walkthrough.
0.12.0 — six new database backends + extended object model¶
AMX now ships adapters for MySQL, Oracle, SQL Server, Redshift, ClickHouse, and DuckDB, bringing the supported backend count to 10. Each adapter exposes the object types its backend treats as first-class — not just tables and views. See Backends for the full capability matrix.
0.12.0 — Apache-2.0 license¶
AMX now ships under the Apache License, Version 2.0, replacing the previous MIT licence. Apache-2.0 layers an explicit patent grant on top of the permissive redistribution terms — a better fit for a tool that integrates with managed warehouses (Databricks, Snowflake, BigQuery, Redshift) where downstream redistributors care about patent posture.
0.12.0 — /temperature slash command and wizard prompt¶
The LLM sampling temperature is now user-configurable from the interactive CLI instead of
being locked at the 0.2 default. The /add-llm-profile wizard prompts for it alongside
the existing generation settings, and /temperature shows or sets the value on the
active profile (e.g. /temperature 0.7). Values are clamped to [0.0, 2.0] and persist
to ~/.amx/config.yml.
0.12.0 — /search improvements (selected)¶
- Live verification for high-risk structural claims uses deterministic read-only probe selection instead of a second LLM planning hop.
- Explicit table mentions take precedence over fuzzy catalog matches; AMX refuses to substitute similar candidates.
- Inventory and superlative questions answer with one fact, not a dump.
- Seven explicit answer shapes:
single_fact,short_table,full_table,ranked_list,table_summary,join_candidates,prose.
See /ask and /search for the full feature surface.
0.12.0 — Reasoning-route token-budget fixes¶
- OpenRouter reasoning routes (kimi-k2-thinking, deepseek-reasoner, claude-sonnet-4 /
opus-4 / 3.7-sonnet, o-series, gpt-5) now get the
AMX_LLM_MIN_MAX_TOKENSfloor (default 16384) so they don't burn the whole output budget on internal thinking. - AMX sends
reasoning.effortonly — never withreasoning.max_tokens— because OpenRouter's API rejects that combination. - Default
AMX_REASONING_EFFORTfor OpenRouter dropped frommedium→lowso token burn stays bounded by default.
0.12.0 — /search typo handling¶
Typo'd slash commands inside /search no longer silently become 30-second LLM calls.
Bare-text questions are still auto-prefixed with /ask, but explicit slash commands that
don't match anything print Unknown command: /asl. Type /help. like every other namespace.
Following along¶
pip install --upgrade amx-clito update.- The full changelog is in the AMX repo CHANGELOG.
- Subscribe to GitHub Releases for tag notifications.