Skip to content

Releases: CocoRoF/geny-executor

v0.29.0 — Unified LLM client + per-stage model routing

21 Apr 10:42
240944a

Choose a tag to compare

Minor release bundling cycle 20260421_4.

Highlights

  • PipelineState.shared + Stage.local_state(state) — pipeline-lifetime shared scratchpad and per-stage scratchpad convention. Ergonomic replacements for stuffing working state into state.metadata.
  • Stage.resolve_model_config(state) -> ModelConfig — full sampling + thinking bundle (not just a model string). Honoured by every stage that calls an LLM in this release.
  • geny_executor.llm_client — new top-level package with BaseClient, ClientCapabilities, ClientRegistry, and per-vendor AnthropicClient / OpenAIClient / GoogleClient / VLLMClient. One surface for all LLM calls; feature-detection via capability flags; unsupported fields silently dropped with llm_client.feature_unsupported events.
  • state.llm_client — optional BaseClient slot populated via Pipeline.attach_runtime(llm_client=…). Any stage reaches for it when it needs an LLM.
  • PipelineMutator.set_stage_model(order, cfg) — public entry point for per-stage model overrides (raises MutationError on missing order).
  • s06_api on the unified client. The per-vendor APIProvider artifact system is deleted; APIStage now selects via provider: str config + state.llm_client.
  • Memory stages honour overrides. s02 LLMSummaryCompactor replaces the placeholder stub; s15 ReflectionResolver gives GenyMemoryStrategy a native reflection path. Both consume state.llm_client when a ModelConfig override is installed; both stay cost-free when no override is present.

Breaking changes

The per-vendor APIProvider classes under stages/s06_api/artifact/{default,openai,google}/providers.py are deleted. Hosts that constructed them directly switch to ClientRegistry.get(provider)(api_key=…, base_url=…) and inject via attach_runtime(llm_client=…). Geny does this in cycle-4 PR-6 (Geny 16690d7).

See CHANGELOG.md for the complete Added / Changed / Removed / Upgrade notes.

Merge provenance

PRs merged for this release: #37, #42, #43, #44, #45, #46.

v0.28.0 — L0 recent-turns retriever layer

20 Apr 23:33
eeb2372

Choose a tag to compare

Highlights

GenyMemoryRetriever gains a new L0 recent turns layer that injects the tail of the short-term-memory transcript verbatim before any semantic/keyword matching runs. The goal is to restore conversational continuity on trigger-style turns — idle reflection, sub-worker auto-reports, and inter-agent DMs — whose query text has no lexical overlap with the prior dialogue and would otherwise miss the last few turns entirely.

API

  • GenyMemoryRetriever(..., recent_turns: int = 6) — controls tail size; pass 0 to disable.
  • Layer budget is capped at 40% of max_inject_chars so downstream layers (session summary, MEMORY.md, vector, keyword, backlink, curated) still fit.
  • Entries inject verbatim as [<role>] <content> lines, reading metadata["role"] from each STM entry (falling back to "user"), so new roles such as internal_trigger and assistant_dm flow through unmodified.

Tests

  • 7 new cases in tests/unit/test_geny_retriever_recent_turns.py
  • Full unit suite green: 615 passed
  • Lint, security, and 3.11/3.12/3.13 build matrix all green on PR #36

See CHANGELOG.md for the full notes.

v0.26.0 — attach_runtime(system_builder, tool_context)

20 Apr 07:57
ffc4887

Choose a tag to compare

Additive release. Extends Pipeline.attach_runtime(...) with two new kwargs:

  • system_builder → Stage 3 (System) slot builder. Lets hosts attach multi-block PromptBuilder instances (e.g. ComposablePromptBuilder of PersonaBlock + DateTimeBlock + MemoryContextBlock) that cannot be serialized into a manifest.
  • tool_context → Stage 10 (Tool) _context attribute. Lets hosts supply session-scoped ToolContext (with working_dir / storage_path / etc.) that is allocated at session-creation time.

Both kwargs are additive on top of the v0.24.0 memory_* kwargs — no breaking changes. Manifest-built pipelines now carry every session-scoped runtime object through one call.

Tests

tests/unit/test_pipeline_attach_runtime.py — 6 new tests (14 total, all passing). Full suite: 1035 passed, 18 skipped. Ruff clean.

Why

Prerequisite for Geny's master-plan PR 17 (Geny/dev_docs/20260420_3/plan/02_default_env_per_role.md) — the last PR of Phase 2, which collapses AgentSession._build_pipeline into a single attach_runtime call.

v0.25.0 — binary_classify in default registry

20 Apr 07:24
ece7b15

Choose a tag to compare

Register binary_classify

Additive release. Makes the adaptive binary_classify evaluation strategy resolvable from EnvironmentManifest without import-time plumbing.

Added

  • binary_classify in the default EvaluateStage strategy slot registry — manifests with strategies={\"strategy\": \"binary_classify\"} now restore to a real BinaryClassifyEvaluation instance.
  • BinaryClassifyEvaluation.configure(config) — applies easy_max_turns and not_easy_max_turns from manifest strategy_configs.

Why

Unblocks Geny's manifest-first cutover (PR 10 of the 20260420_3 cycle): serializing the worker_adaptive preset through an EnvironmentManifest no longer silently degrades to signal-based evaluation.

Backwards compatibility

No breaking changes. The adaptive artifact remains strategy-only; its import path is unchanged. The default registry keeps every pre-existing strategy.

Tests

tests/unit/test_binary_classify_manifest.py — 6 new tests.
Full suite: 1029 passed, 18 skipped.

PR: #31

v0.24.0 — Pipeline.attach_runtime()

20 Apr 07:12
4bd4418

Choose a tag to compare

Pipeline.attach_runtime()

Additive release. Introduces a single explicit injection point for the session-scoped runtime objects that EnvironmentManifest cannot express (memory retriever, memory update strategy, conversation persistence).

Added

  • Pipeline.attach_runtime(*, memory_retriever=None, memory_strategy=None, memory_persistence=None) — walks registered stages and replaces the relevant slot strategies:

    • memory_retriever → Stage 2 (Context), slot retriever
    • memory_strategy → Stage 15 (Memory), slot strategy
    • memory_persistence → Stage 15 (Memory), slot persistence

    Kwargs are keyword-only. Omitted kwargs preserve the prior slot. Missing stages are silently skipped.

  • Pipeline._has_started flag. attach_runtime raises RuntimeError after the first run()/run_stream() call — prior stage state has already captured slot references.

Backwards compatibility

No breaking changes. Pipelines that never call attach_runtime behave identically to 0.23.0. GenyPresets.worker_adaptive(...) / GenyPresets.vtuber(...) builders remain unchanged.

Tests

tests/unit/test_pipeline_attach_runtime.py — 8 new tests.
Full suite: 1023 passed, 18 skipped. Ruff + format clean.

PR: #30

v0.23.0 — per-call tool events

20 Apr 06:57
456d686

Choose a tag to compare

Additive release on top of 0.22.1. Extends the Stage 10 tool event vocabulary with per-call events so downstream log consumers can render the input, outcome, and latency of individual tool calls.

Non-breaking. Existing tool.execute_start / tool.execute_complete summary events are preserved byte-for-byte. Consumers that listen only to tool.execute_* see no behavior change. Third-party ToolExecutor implementations continue to work without modification.

Added

  • tool.call_start event — fired before each dispatch, payload {tool_use_id, name, input}.
  • tool.call_complete event — fired after each dispatch, payload {tool_use_id, name, is_error, duration_ms}.
  • on_event keyword-only kwarg on ToolExecutor.execute_all(...). Shape: Callable[[str, dict], None]. The default ToolStage wires it to state.add_event.
  • ToolEventCallback type alias in geny_executor.stages.s10_tool.interface.

Why

Host-side log UIs need the per-call input dict to render a call-by-call detail pane. The 0.22.1 summary events omit this, and the pipeline-internal pending_tool_calls field is not a stable event contract. This release upgrades the contract so hosts can stop reaching into pipeline state.

Tests

1015 passed, 18 skipped. 6 new tests in tests/unit/test_tool_call_events.py covering sequential ordering, parallel pairing by tool_use_id, is_error propagation, on_event=None no-op, and nesting inside tool.execute_* brackets.

PR: #29

v0.22.1

20 Apr 06:01
273a6c1

Choose a tag to compare

CI hygiene patch on top of v0.22.0. No runtime behavior change — same public API, same import surface, identical test outcomes (1003 passed, 5 skipped).

Fixed

  • ruff check now passes on main: dropped two unused imports that slipped through the 0.22.0 PRs (ToolError in tools/mcp/adapter.py, MCPServerConfig in tests/unit/test_adhoc_providers.py). (#27)
  • ruff format --check now passes on main: eleven files that the 0.22.0 PRs touched diverged from the project's default ruff formatter; applied ruff format so CI stays green. (#28)

Upgrade note

Geny pin moves from >=0.22.0,<0.23.0 to >=0.22.1,<0.23.0 in the follow-on Geny bump PR so downstream installs pick up the cleaned-up release.

v0.22.0 — Tool / MCP integration hardening

20 Apr 05:34
694fee0

Choose a tag to compare

Tool / MCP integration hardening release. Bundles four breaking changes into a single atomic bump so downstream hosts can pin geny-executor>=0.22.0,<0.23.0 in one cutover.

Breaking

  • MCP tool names are always mcp__{server}__{tool} (no bare names).
  • MCP lifecycle is fail-fast — broken servers block session start with MCPConnectionError.
  • MCPServerConnection.call_tool return type expanded to str | list[dict].
  • ToolRegistry.register warns on same-name-different-instance.
  • Default router emits structured {error: {code, message, details}} payloads; plain-string error content is gone.

Additive

  • ToolError / ToolFailure / ToolErrorCode structured error model + validate_input jsonschema helper.
  • Pipeline.from_manifest_async — MCP-aware async entry point.
  • MCPManager.add_server / remove_server with registry sync.
  • AdhocToolProvider Protocol + ToolsSnapshot.external whitelist for host tools that can't round-trip through AdhocToolDefinition.
  • Pipeline.from_manifest[_async](adhoc_providers=, tool_registry=) kwargs.

Dependency

  • Adds jsonschema>=4.0.

PRs

  • #22 structured ToolError + jsonschema validation
  • #23 mcp__ namespace prefix
  • #24 MCP fail-fast lifecycle + from_manifest_async
  • #25 AdhocToolProvider + tools.external
  • #26 release chore

See CHANGELOG.md for migration notes.