Skip to content

Releases: firefly-operationOS/flycanon

v26.6.19

Choose a tag to compare

@miguelgfierro miguelgfierro released this 30 Jun 14:10
8590abf

RLM reliability fixes + tuning levers

This release hardens the RLM answer engine so it can no longer return a silent empty answer, and adds two opt-in levers for hard questions.

Fixed

  • Empty-answer bug. When the CodeAct loop exhausted its iteration budget without calling final(), it returned an empty string flagged as a valid answer (no_answer=false) that callers could not detect. A blank result is now surfaced as no_answer=true with an explanatory note, and the out-of-iterations fallback re-asks the model with no tools so a diverged run must emit text instead of nothing.

Added

  • CodeAct turn logging + convergence warnings — per-turn DEBUG trace and a WARNING when the loop exhausts its budget without converging.
  • Per-request extended_reasoning (AnswerRequest.extended_reasoning, default false) — runs the engine at twice the configured FLYCANON_RLM_MAX_ITERS for a single hard request, without a global default bump. RAG ignores it.
  • Self-consistency guard (FLYCANON_RLM_SELF_CONSISTENCY, default 1 = off) — when >1, the non-streaming answer path runs the engine N times in parallel and an LLM selector returns the most-grounded answer; token usage of all runs + the selector is merged.

Changed

  • Scoped RLM system prompt — requires verifying every benchmark/threshold/figure against the source documents and forbids stating a value not found in them.

Build

  • boto3 is now declared in the dev extra so the S3 object-store backend's unit tests and the pyright type-check of storage/s3.py run deterministically in CI (they previously relied on a transitive path that went away).

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.6.19/flycanon_sdk-26.6.19-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.6.19/flycanon_sdk-26.6.19-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.6.19</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

Full Changelog: v26.6.18...v26.6.19

v26.6.18

Choose a tag to compare

@miguelgfierro miguelgfierro released this 18 Jun 15:01
781e95e

Added

  • RLM (Recursive Language Model) answer engine. A code-driven CodeAct REPL
    that reasons over whole documents instead of retrieving chunks: it routes to
    the right source, reads it, and computes the answer in a sandboxed Python
    loop. New FLYCANON_RLM_* settings tune the root/sub/answer models
    (default anthropic:claude-sonnet-4-6), iteration budget, and depth.
  • Object-store originals. A hexagonal ObjectStore port (LocalFs / S3) plus
    FLYCANON_OBJECT_STORE_* settings; ingest persists the original document and
    records canon_sources.object_store_key when FLYCANON_STORE_ORIGINALS is
    on (default), giving RLM a whole-document corpus.
  • Scalable corpus access. The corpus loads lazily (only the filings the
    model actually reads are fetched) behind a tiered page cache — a thread-safe
    in-process LRU and an optional shared Redis layer (FLYCANON_CORPUS_CACHE_*),
    content-hash keyed so a re-ingest auto-invalidates.
  • Prompt caching for the RLM loop (FLYCANON_RLM_PROMPT_CACHE, default on):
    the repeated system prompt is marked cache_control: ephemeral.

Changed

  • RLM is now the default answer mode (FLYCANON_ANSWER_MODE=rlm). It backs
    /api/v1/query, the SSE /api/v1/query/stream (a status frame then the
    final frame), and the agent-tier equivalents, with full filter parity.

Deprecated

  • Hybrid-RAG answer mode (FLYCANON_ANSWER_MODE=rag) is deprecated and
    slated for removal in a future release. When selected it logs a deprecation
    warning and returns an X-Flycanon-Deprecation response header. The raw
    /api/v1/search retrieval surface is unaffected.

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.6.18/flycanon_sdk-26.6.18-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.6.18/flycanon_sdk-26.6.18-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.6.18</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

  • docs: RLM integration design spec by @miguelgfierro in #30
  • feat(storage): ObjectStore port with LocalFs + S3 backends by @miguelgfierro in #31
  • feat(sources): add canon_sources.object_store_key column + migration by @miguelgfierro in #32
  • feat(query): port the RLM engine (CodeAct REPL + LLM client) into flycanon by @miguelgfierro in #33
  • feat(sources): persist original documents on ingest for RLM by @miguelgfierro in #35
  • feat(query): CanonDocStore — whole-document corpus for the RLM engine by @miguelgfierro in #34
  • feat(query): RLMAnswerService — answer endpoint backed by the RLM engine by @miguelgfierro in #36
  • feat(query): FLYCANON_ANSWER_MODE dispatch — RLM default, RAG opt-in by @miguelgfierro in #37
  • feat(query): complete RLM corpus filter parity (knowledge_item_ids + AND composition) by @miguelgfierro in #38
  • feat(query): RLM streaming parity for the SSE answer endpoints by @miguelgfierro in #39
  • test(query): DB-backed test for KnowledgeRepository.resolve_source_ids_for_items by @miguelgfierro in #40
  • feat(query): surface RAG deprecation via X-Flycanon-Deprecation header by @miguelgfierro in #42
  • docs: document RLM as the default answer mode + RAG deprecation by @miguelgfierro in #41
  • perf(query): Anthropic prompt caching for the RLM REPL loop by @miguelgfierro in #44
  • perf(query): lazy CanonDocStore — load filings on first REPL access by @miguelgfierro in #45
  • perf(query): tiered corpus page cache (in-proc LRU + shared Redis) by @miguelgfierro in #46
  • Release 26.6.18 by @miguelgfierro in #47
  • fix(test): pass content_sha256 to SourceMeta fakes (green CI unit tests) by @miguelgfierro in #48
  • fix(types): make pyright (advisory Typecheck) green by @miguelgfierro in #49
  • chore: stop tracking docs/superpowers design specs by @miguelgfierro in #50
  • chore: remove the remaining docs/superpowers design spec by @miguelgfierro in #51
  • feat(query): record RLM query cost in flycanon's cost tracking by @miguelgfierro in #52
  • feat(query): structured no-answer signal from the RLM engine by @miguelgfierro in #53
  • feat(query): richer, structure-preserving RLM citation evidence by @miguelgfierro in #54
  • feat(query): per-REPL-turn status frames on the RLM SSE stream by @miguelgfierro in #55
  • style: fix ruff-format drift in test_session.py (green CI Lint) by @miguelgfierro in #56
  • feat(query): sandboxed subprocess executor for untrusted REPL code by @miguelgfierro in #57
  • feat(query): run the RLM REPL in the sandboxed subprocess (opt-in) by @miguelgfierro in #58
  • feat(query): make the sandboxed subprocess the default RLM executor by @miguelgfierro in #59
  • refactor(query): RLM corpus reuses the PdfLoader (gains OCR) instead of raw fitz by @miguelgfierro in #60
  • refactor(web): share the answer-SSE stream generator across both controllers by @miguelgfierro in #61
  • fix(query): RLM sandbox inactivity timeout + graceful child-death handling by @miguelgfierro in #62
  • docs: RLM FinanceBench 50/50 benchmark + ingestion time by @miguelgfierro in #63
  • docs: RLM vs RAG benchmark (FinanceBench 50/50 + full) by @miguelgfierro in #64
  • docs: RLM-vs-best-RAG summary table by @miguelgfierro in #65
  • RLM as the default answer mode (RAG deprecated) by @miguelgfierro in #43

New Contributors

Full Changelog: v26.5.9...v26.6.18

v26.5.9

Choose a tag to compare

@github-actions github-actions released this 31 May 20:01

flycanon 26.5.9 — Apache 2.0 open-source release

flycanon is now open source under the Apache License 2.0 (© 2024-2026 Firefly Software Foundation); the repository is public.

Changed

  • Replaced the proprietary notice with the full Apache 2.0 LICENSE (root + Python/Java SDKs) and added an Apache 2.0 header to every source file.
  • Set the OpenAPI info.license, the image licenses label, the README badge, and pyproject metadata to Apache-2.0.
  • Aligned all version references to 26.5.9.

SDKs

  • Python: wheel + sdist attached below.
  • Java: com.firefly:flycanon-sdk:26.5.9 on GitHub Packages.

v26.5.8

Choose a tag to compare

@github-actions github-actions released this 31 May 11:07

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.8/flycanon_sdk-26.5.8-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.8/flycanon_sdk-26.5.8-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.5.8</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

Full Changelog: v26.5.7...v26.5.8

v26.5.7

Choose a tag to compare

@github-actions github-actions released this 30 May 23:33

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.7/flycanon_sdk-26.5.7-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.7/flycanon_sdk-26.5.7-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.5.7</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

  • docs: refresh after five rounds of concurrency + RFC 7807 work by @ancongui in #28

Full Changelog: v26.5.6...v26.5.7

v26.5.6

Choose a tag to compare

@github-actions github-actions released this 19 May 12:22
094af37

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.6/flycanon_sdk-26.5.6-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.6/flycanon_sdk-26.5.6-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.5.6</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

  • Strip v-prefix from release-notes Maven coordinate + add PII knobs to env_template by @ancongui in #21
  • Concurrent-operation safety audit + fixes by @ancongui in #22
  • fix(billing): really switch BadRequestException -> InvalidRequestException by @ancongui in #23
  • fix(web): RFC 7807 error contract genuinely reaches the wire + service-level concurrency tests by @ancongui in #25
  • Concurrency audit round 4: lease-poaching guard + race-free conversation summary + gap coverage by @ancongui in #26
  • Periodic stuck-job sweep + version sync to 26.5.6 by @ancongui in #27

Full Changelog: v26.5.5...v26.5.6

v26.5.5

Choose a tag to compare

@github-actions github-actions released this 18 May 23:49
1d83724

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.5/flycanon_sdk-26.5.5-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.5/flycanon_sdk-26.5.5-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.5.5</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

  • Java SDK: add ReactiveCanonClient (WebClient + Reactor) alongside the blocking client by @ancongui in #20

Full Changelog: v26.5.4...v26.5.5

v26.5.4

Choose a tag to compare

@github-actions github-actions released this 18 May 21:45
9afae8f

Python SDK

Install the wheel for this release with uv:

uv add https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.4/flycanon_sdk-26.5.4-py3-none-any.whl

Or pin it in your pyproject.toml:

[project]
dependencies = ["flycanon-sdk"]

[tool.uv.sources]
flycanon-sdk = { url = "https://github.com/firefly-operationOS/flycanon/releases/download/v26.5.4/flycanon_sdk-26.5.4-py3-none-any.whl" }

Java SDK

<dependency>
  <groupId>com.firefly</groupId>
  <artifactId>flycanon-sdk</artifactId>
  <version>26.5.4</version>
</dependency>

Resolve from GitHub Packages -- add to your pom.xml:

<repositories>
  <repository>
    <id>github-firefly-operationOS</id>
    <url>https://maven.pkg.github.com/firefly-operationOS/flycanon</url>
  </repository>
</repositories>

What's Changed

  • Audit: universal ingestion, backend-agnostic retrieval, Spring Boot Java SDK, professional docs by @ancongui in #1
  • E2E fixes: chunks persistence, EventPublisher DI, PDF/PyMuPDF, metadata extractor, embedding resilience by @ancongui in #2
  • Postgres-native BM25 + enriched Hit shape (filename/title/kind/section/page) by @ancongui in #3
  • Production CI/CD + PDF dual-mode docs + provenance enrichment by @ancongui in #4
  • Integration audit: chunk→knowledge linkage, working filters, correlation_id, page propagation, taxonomy seed by @ancongui in #5
  • Agent max_tokens env vars + bounded-concurrency worker dispatcher by @ancongui in #6
  • PR-A: knowledge diff, bulk + URL-fetched ingest, source re-ingestion by @ancongui in #7
  • PR-B: typed knowledge relations + graph visualisation by @ancongui in #8
  • PR-C: async ingest jobs + SSE progress streaming by @ancongui in #9
  • PR-D: cross-encoder reranker + LLM query expansion (opt-in) by @ancongui in #10
  • PR-E: conversations + streaming answers + suggestions by @ancongui in #11
  • PR-F: PII detection at ingest + cost tracking + /billing by @ancongui in #12
  • PR-G: stale knowledge detection + cross-item conflict scan by @ancongui in #13
  • Wire Tier 1/2 cross-cutting glue + cover from SDKs + docs by @ancongui in #14
  • Cover billing drill-downs + /api/v1/stats from docs + SDKs by @ancongui in #15
  • Lint backlog + restore billing controller registration + idiomatic conversation memory by @ancongui in #17
  • QUICKSTART + SDK READMEs + docs catalogue cover the Tier 1/2 surfaces by @ancongui in #18
  • Field-level descriptions on every billing + job DTO by @ancongui in #19

New Contributors

Full Changelog: https://github.com/firefly-operationOS/flycanon/commits/v26.5.4