Releases: firefly-operationOS/flycanon
Release list
v26.6.19
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 asno_answer=truewith 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, defaultfalse) — runs the engine at twice the configuredFLYCANON_RLM_MAX_ITERSfor a single hard request, without a global default bump. RAG ignores it. - Self-consistency guard (
FLYCANON_RLM_SELF_CONSISTENCY, default1= 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
boto3is now declared in thedevextra so the S3 object-store backend's unit tests and the pyright type-check ofstorage/s3.pyrun 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.whlOr 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
- chore: bump pyfly to v26.06.113 by @miguelgfierro in #66
- fix(rlm): eliminate empty-answer failure; add extended_reasoning + self-consistency by @miguelgfierro in #67
Full Changelog: v26.6.18...v26.6.19
v26.6.18
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. NewFLYCANON_RLM_*settings tune the root/sub/answer models
(defaultanthropic:claude-sonnet-4-6), iteration budget, and depth. - Object-store originals. A hexagonal
ObjectStoreport (LocalFs / S3) plus
FLYCANON_OBJECT_STORE_*settings; ingest persists the original document and
recordscanon_sources.object_store_keywhenFLYCANON_STORE_ORIGINALSis
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 markedcache_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(astatusframe then the
finalframe), 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 anX-Flycanon-Deprecationresponse header. The raw
/api/v1/searchretrieval 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.whlOr 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
- @miguelgfierro made their first contribution in #30
Full Changelog: v26.5.9...v26.6.18
v26.5.9
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 imagelicenseslabel, the README badge, andpyprojectmetadata 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.9on GitHub Packages.
v26.5.8
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.whlOr 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
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.whlOr 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
Full Changelog: v26.5.6...v26.5.7
v26.5.6
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.whlOr 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
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.whlOr 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
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.whlOr 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