Skip to content

Releases: ralforion/orionbelt-analytics

v1.7.0

22 Jun 10:23
31f7f92

Choose a tag to compare

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; decomposed handlers/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

21 Jun 13:46
39a381f

Choose a tag to compare

Added

  • Graph reasoning surface over the generated ontology (design/PLAN_graph_reasoning.md):
    • oba:joinsTo shared join predicate. Every declared or inferred many-to-one foreign key now also emits a single directed oba:joinsTo edge between the table classes (finer grain → coarser grain). A single SPARQL property path ?from oba:joinsTo+ ?to answers directed reachability across all FKs without enumerating each per-FK object property. Declared in ontology/oba.ttl (vocabulary bumped 0.1 → 0.2).
    • reachable_from MCP 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_from MCP 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_query MCP tool — advisory Composite Fact Layer (CFL) decomposition: detects whether the requested facts are independent grains (disjoint siblings) requiring a UNION ALL composite, 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 pyshacl is installed, generate_ontology validates the generated ontology against ontology/oba-shacl.ttl and surfaces violations as a non-blocking warning (gated by OBA_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:disjointWith axioms (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

10 Jun 07:17
1a44d5d

Choose a tag to compare

Changed

  • Constrained MCP tool string parameters at the input boundary. Enumerated parameters now use Literal types (db_type, cache_type, artifact_type, source, chart_type, chart_style, sort_order, output_format, element_type), free-text and identifier parameters carry max_length bounds, 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_model additionally reduces model_name to 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). Completed docs/tools-reference.md to 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 runs uv lock in one step.
  • scripts/publish-docker.sh accepts a generic DOCKERHUB_PAT (legacy DOCKERHUB_RALFORION_PAT still works).

📦 PyPI: https://pypi.org/project/orionbelt-analytics/1.5.3/
🐳 Docker: ralforion/orionbelt-analytics:1.5.3 (multi-arch)

v1.5.2

08 Jun 15:05
ccbe61e

Choose a tag to compare

Removed

  • get_server_info MCP tool — redundant with the MCP initialize handshake, server instructions, and tools/list. Unique capability descriptions folded into the instructions.

Changed

  • Condensed server instructions (~58 → ~30 lines) — dropped the duplicated database list and Version: footer, merged overlapping sections.
  • Slimmed generate_chart from 13 → 11 parameters — removed width/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

06 Jun 16:40
0a8ab54

Choose a tag to compare

Fixed

  • MCP handshake advertised the wrong versionFastMCP() was constructed without an explicit version, so the initialize response's serverInfo.version fell back to the FastMCP package version (e.g. 3.2.4) instead of the application version. The constructor now receives version=__version__.

Changed

  • Upgraded fastmcp[apps] from >=3.2.4 to >=3.3.1,<3.4.

Full Changelog: v1.5.0...v1.5.1

v1.5.0 — MCP sampling for semantic-rename suggestions

03 May 21:56
90036a0

Choose a tag to compare

Added

  • MCP sampling for suggest_semantic_names -- when the connected client advertises the sampling capability, the server now calls back through the host LLM via ctx.sample() to pre-fill rename suggestions for cryptic identifiers, returning a suggestions dict alongside the cryptic-name lists in a single tool call.
    • Gated on a new ENABLE_SAMPLING env flag (default true). Set to false to 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.

Fixed

  • MCP session crash on client disconnect during suggest_semantic_names -- a notification (ctx.info) write that hit anyio.ClosedResourceError because the client had already closed the streamable-HTTP session was caught by the handler's outer except and triggered a second doomed write, bringing down the entire FastMCP TaskGroup. Notifications are now sent through safe_ctx_info (failures swallowed at debug level), and ClosedResourceError-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 injected final_response tool, fragile on large responses) with explicit JSON parsing that accepts bare JSON, ```json fences, and prose-embedded JSON.

v1.4.4

27 Apr 17:07
f19ef52

Choose a tag to compare

What's Changed

  • Chart storage cleanup: renamed legacy tmp/tmp/ to tmp/charts/ and removed duplicate chart saves — charts are now stored once in tmp/<connectionId>/charts/
  • FastMCP structured output fix: create_error_response now returns a dict instead of a JSON string, fixing ValueError: structured_content must be a dict crashes in graphrag_search and other Dict-returning tools
  • Improved query_sparql tool 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

24 Apr 21:09
ee768ed

Choose a tag to compare

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

23 Apr 14:13
30e741d

Choose a tag to compare

What's New

Chart Improvements

  • JSON chart resource: Registers a chart-json resource 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_chart responses (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...v1.4.2

v1.4.1

18 Apr 16:32
87ca286

Choose a tag to compare

What's Changed

  • Renamed analyze_schemadiscover_schema across the entire codebase to prevent LLMs from confusing "analyze my data" with schema discovery
  • discover_schema returns early when workspace is already restored — no redundant re-discovery
  • get_table_details uses cached data from session and discourages bulk usage
  • sample_table_data auto-fills schema_name from session when omitted
  • execute_sql_query recommends semantic layer (OBML) when available
  • Updated all integration examples, docs, skills, and tests