Releases: ralforion/orionbelt-analytics
Releases · ralforion/orionbelt-analytics
v1.7.0
Architecture-review release (minor). No MCP tool surface changes — still 26 tools, same signatures.
Added
- Driver/dialect registry — single source of truth for
db_type→ driver + sqlglot dialect - Parser-based SQL safety gate (
analyze_sql_statement) as the primary read-only/single-statement check - Typed HandlerContext for handlers
- CI enforcing ruff/black/isort/pytest (mypy advisory)
Changed
- OBQC dialect parity — bigquery/duckdb/databricks/mysql now validated with their own dialect instead of the Postgres fallback
- SQL validation catches DML hidden after a CTE and no longer mis-flags
;-in-strings as multiple statements - Internal refactor: split
main.py; decomposedhandlers/ontology.py; repo formatted with black + isort
Fixed
- AUTO_ONTOLOGY background generation (was silently producing nothing)
- Artifact downloads honor an explicit
schema_name(per-schema state) - RDF-store auto-restore no longer AttributeErrors on RDF-enabled workspaces
- Startup banner reports the real tool count
PyPI: https://pypi.org/project/orionbelt-analytics/1.7.0/
Full details in CHANGELOG.md.
v1.6.0 — Graph reasoning surface over generated ontology
Added
- Graph reasoning surface over the generated ontology (
design/PLAN_graph_reasoning.md):oba:joinsToshared join predicate. Every declared or inferred many-to-one foreign key now also emits a single directedoba:joinsToedge between the table classes (finer grain → coarser grain). A single SPARQL property path?from oba:joinsTo+ ?toanswers directed reachability across all FKs without enumerating each per-FK object property. Declared inontology/oba.ttl(vocabulary bumped 0.1 → 0.2).reachable_fromMCP tool — the dimension-capable tables for a query anchored on a table (many-to-one closure): coarser-grain tables joinable without row multiplication, safe to GROUP BY / filter on.measurable_fromMCP tool — the measure-capable tables (one-to-many closure, the inverse): finer-grain tables that fan out the anchor and must only be aggregated, never used as dimensions at this grain. Both closures are cycle-safe.plan_composite_queryMCP tool — advisory Composite Fact Layer (CFL) decomposition: detects whether the requested facts are independent grains (disjoint siblings) requiring aUNION ALLcomposite, and returns the leg roots, conformed (shared) GROUP BY dimensions, and per-leg NULL-pad sets. Advisory only — OBA does not compile SQL; defer compilation to OrionBelt Semantic Layer when connected.- Optional in-process SHACL validation. When
pyshaclis installed,generate_ontologyvalidates the generated ontology againstontology/oba-shacl.ttland surfaces violations as a non-blocking warning (gated byOBA_SHACL_VALIDATE, default on). Gracefully no-ops when the dependency or shapes file is absent.
Changed
- OBQC fan-trap detection is now grounded in the ontology's own
owl:disjointWithaxioms (sibling facts sharing a dimension) instead of only re-deriving the risk from the relationship heuristic. When disjoint facts appear together in an aggregating query, OBQC cites the actual disjoint tables and recommends a Composite Fact Layer (UNION ALL). The relationship heuristic is retained as a fallback when no disjointness axioms are present.
v1.5.3
Changed
- Constrained MCP tool string parameters at the input boundary. Enumerated parameters now use
Literaltypes (db_type,cache_type,artifact_type,source,chart_type,chart_style,sort_order,output_format,element_type), free-text and identifier parameters carrymax_lengthbounds, and filename/model-name parameters reject path separators — so invalid, oversized, or path-traversing arguments are rejected before reaching a handler, and the constraints are published in each tool's JSON schema. Handlers keep their existing runtime validation as defense-in-depth.save_semantic_modeladditionally reducesmodel_nameto a bare filename component so it can never escape the models directory.
Fixed
- Aligned all documentation with the registered tool set. Removed references to four tools that were advertised but never registered (
validate_sql_syntax,download_ontology,list_tables_sparql,diagnose_connection_issue) across the README,docs/, Claude skills, and all 8 integration guides, replacing them with registered equivalents (execute_sql_query's built-in validation,download_artifact,query_sparql). Completeddocs/tools-reference.mdto cover all 23 tools (was 16). Corrected stale tool counts (README 32, startup banner 22 → 23). - Resolved all pre-existing lint findings (ruff: unused imports, f-strings without placeholders, unused locals, redundant imports; intentional late imports annotated with
# noqa: E402).ruff check .is now clean.
Added
scripts/bump-version.sh— bumps the version across all files, inserts a CHANGELOG stub, and runsuv lockin one step.scripts/publish-docker.shaccepts a genericDOCKERHUB_PAT(legacyDOCKERHUB_RALFORION_PATstill works).
📦 PyPI: https://pypi.org/project/orionbelt-analytics/1.5.3/
🐳 Docker: ralforion/orionbelt-analytics:1.5.3 (multi-arch)
v1.5.2
Removed
get_server_infoMCP tool — redundant with the MCPinitializehandshake, serverinstructions, andtools/list. Unique capability descriptions folded into the instructions.
Changed
- Condensed server
instructions(~58 → ~30 lines) — dropped the duplicated database list andVersion:footer, merged overlapping sections. - Slimmed
generate_chartfrom 13 → 11 parameters — removedwidth/height. Interactive charts are responsive; static PNG export uses fixed 800×600. Docstring condensed.
Full Changelog: v1.5.1...v1.5.2
v1.5.1
Fixed
- MCP handshake advertised the wrong version —
FastMCP()was constructed without an explicitversion, so theinitializeresponse'sserverInfo.versionfell back to the FastMCP package version (e.g.3.2.4) instead of the application version. The constructor now receivesversion=__version__.
Changed
- Upgraded
fastmcp[apps]from>=3.2.4to>=3.3.1,<3.4.
Full Changelog: v1.5.0...v1.5.1
v1.5.0 — MCP sampling for semantic-rename suggestions
Added
- MCP sampling for
suggest_semantic_names-- when the connected client advertises the sampling capability, the server now calls back through the host LLM viactx.sample()to pre-fill rename suggestions for cryptic identifiers, returning asuggestionsdict alongside the cryptic-name lists in a single tool call.- Gated on a new
ENABLE_SAMPLINGenv flag (defaulttrue). Set tofalseto force the legacy manual-review path everywhere. - Clients without sampling support (e.g. Claude Desktop) silently fall back to the legacy response shape — no breaking change.
- Sampling requests, results, and failures are logged with elapsed time and item counts for observability.
- Gated on a new
Fixed
- MCP session crash on client disconnect during
suggest_semantic_names-- a notification (ctx.info) write that hitanyio.ClosedResourceErrorbecause the client had already closed the streamable-HTTP session was caught by the handler's outerexceptand triggered a second doomed write, bringing down the entire FastMCP TaskGroup. Notifications are now sent throughsafe_ctx_info(failures swallowed at debug level), andClosedResourceError-class disconnects re-raise cleanly so the framework tears the session down instead of writing into a dead transport. - Sampling response parsing -- replaced pydantic-ai's
result_type=Dict[str, str](which forces the model to call an injectedfinal_responsetool, fragile on large responses) with explicit JSON parsing that accepts bare JSON, ```json fences, and prose-embedded JSON.
v1.4.4
What's Changed
- Chart storage cleanup: renamed legacy
tmp/tmp/totmp/charts/and removed duplicate chart saves — charts are now stored once intmp/<connectionId>/charts/ - FastMCP structured output fix:
create_error_responsenow returns a dict instead of a JSON string, fixingValueError: structured_content must be a dictcrashes ingraphrag_searchand other Dict-returning tools - Improved
query_sparqltool description: better guidance for LLM clients on when and how to use the SPARQL tool
Full Changelog: v1.4.3...v1.4.4
v1.4.3
What's Changed
- Inline ontology upload: support loading ontologies directly via chat upload
- Database compatibility check: validate database type before ontology import
- Version sync fix: aligned version across
pyproject.toml,src/__init__.py, and README badge
Full Changelog: v1.4.2...v1.4.3
v1.4.2
What's New
Chart Improvements
- JSON chart resource: Registers a
chart-jsonresource alongside the HTML resource, allowing OB Chat to render Plotly charts directly without HTML parsing overhead - Multi-y bar charts: Support for multiple y_columns in bar charts (grouped/stacked), not just line charts
- CHART_RETURN_BINARY env setting: Control whether inline binary images are included in
generate_chartresponses (default: false) - Responsive layout: Charts use responsive sizing with vertical right-side legend and horizontal modebar toolbar with all buttons
Full Changelog
v1.4.1
What's Changed
- Renamed
analyze_schema→discover_schemaacross the entire codebase to prevent LLMs from confusing "analyze my data" with schema discovery discover_schemareturns early when workspace is already restored — no redundant re-discoveryget_table_detailsuses cached data from session and discourages bulk usagesample_table_dataauto-fillsschema_namefrom session when omittedexecute_sql_queryrecommends semantic layer (OBML) when available- Updated all integration examples, docs, skills, and tests