Skip to content

v0.73.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 01:03
31e5a52

[v0.73.0] - 2026-10-05

Added

  • Service error codes, contributed by the plugin that speaks to the service: a plugin declares each error code its gateway or hosted service emits on its own as a ServiceErrorCode, with its category, its user action, its advice and whether it means an unknown model, and hands them to PluginRegistrar.add_service_error_codes. classify_inference_error consults the booted plugins' codes ahead of the HTTP status ladder and render_inference_error renders the matched entry's advice; a code two plugins contribute fails the boot with DuplicateServiceErrorCodeError, and one the runtime classifies itself with ReservedServiceErrorCodeError.
  • Request extras on the Anthropic worker: AnthropicLLMWorker takes an optional extras_factory, the BackendExtrasFactory the OpenAI-substrate workers already take, whose headers and body additions join every text and structured call, and AnthropicFactory.make_anthropic_client takes an sdk_variant, so a plugin can register an sdk token of its own over the Anthropic protocol.

Changed

  • The completions image worker's fixed output format comes from its registration: OpenAICompletionsImgGenWorker takes fixed_output_format, the one image format a service answers in, rather than inferring it from the backend's name; a request for another format is refused before the call, and a URL answer from a worker built without one is refused as unreadable.
  • The Inference SPI table lists every symbol a provider plugin builds on: docs/under-the-hood/inference-backend-plugins.md now publishes, one module per row, the worker contracts with their jobs and outputs, the OpenAI- and Anthropic-protocol factories and workers, the image-generation and prompt-preparation helpers, the error pipeline and the runtime accessors, and parse_retry_after_seconds and error_code_from_body_code_first become public in pipelex.cogt.inference.error_classification for a plugin that distils a plain-HTTP failure itself.
  • The Anthropic worker no longer adds a backend's headers by backend name (Breaking): a worker built without an extras_factory sends nothing extra, whatever its backend, so a backend that relied on the worker adding its request headers must register its own sdk token with an extras factory and name that token in the sdk of its model specs, local overrides included; a model left on anthropic keeps answering, without those headers.
  • The gateway refusal families leave the core classifier (Breaking): GatewayRequestLimit, GatewayUnresolvedReference and GatewayRoutingRefusal, the matching properties of ProviderErrorMetadata and fields of ClassificationResult, and MANAGED_GATEWAY_BACKEND_NAMES are removed; a gateway's own codes now reach ClassificationResult.service_error_code through the plugin that contributes them, and Portkey's model_not_allowed_error is read by ProviderErrorMetadata.is_model_not_allowed and ClassificationResult.is_model_not_allowed. Errors raised by the hosted-only provider plugin now report the type and title of their generic family, such as extract-job-failure-error, rather than pages and titles of their own.
  • The default extractors run on your own keys (Breaking): @default-extract-document takes the first of Mistral OCR and pypdfium2-extract-pdf that an enabled backend serves, and @default-extract-image and @default-premium take Mistral OCR, where all three named Azure Document Intelligence, which no shipped backend serves any more. A PipeExtract step naming no model therefore runs on Mistral OCR with your own key or, for a PDF, on its text layer read locally, which recovers no text from a scanned page; a project's managed 3_extract_deck.toml takes the new aliases with pipelex update.

Fixed

  • A Manifold failure on the extract and search routes reports the service's own message: extract_manifold_metadata takes the message from the response body's error.message, or else its top-level message, so a refused key now reads Portkey Error: Invalid API Key. Error Code: 03 rather than httpx's Client error '401 Unauthorized' for url …; a body carrying neither, a body that is not JSON and a network failure keep the exception's own text. Because the quota check reads that message, a 429 on those routes whose body names a quota, such as Monthly quota exceeded, now classifies as quota exhaustion, to be fixed in billing, rather than as a transient rate limit to retry.
  • A kernel-only boot over a stale configuration file stays kernel-only (Breaking): the boot-tolerance replay no longer loads interpreter modules into a RuntimeBoot process, because the fix-op applier, the file transaction and their errors moved from pipelex.pipeline to the new kernel-layer pipelex.fix_ops package; import FixWriteConflictError and FixTransactionError from pipelex.fix_ops.exceptions, and the applier and transaction from pipelex.fix_ops.applier and pipelex.fix_ops.file_transaction.

Removed

  • The builder: pipelex-agent concept, pipelex-agent pipe, pipelex build runner and pipelex.builder (Breaking): the two agent commands that converted a JSON concept or pipe spec into MTHDS TOML, and pipelex build runner bundle and pipelex build runner method, which wrote a Python script running a pipe, are gone with the spec layer behind them, ConceptSpec, PipeSpec, PipelexBundleSpec and the ConceptSpecError, PipeSpecError and PipelexBundleSpecBlueprintError classes; write a method in MTHDS directly and check it with pipelex validate, and take a runner's typed structures from pipelex build structures or pipelex codegen types --target python-structures. The pipelex.builder package no longer exists: the modules the runtime still uses moved, pipelex.builder.conventions to pipelex.pipeline.default_file_names, pipelex.builder.operations.models_ops to pipelex.cogt.models.model_listing and pipelex.builder.operations.inputs_ops to pipelex.pipeline.inputs_template, and the others are deleted with the helpers only they used, force_include_dirs on pipelex.tools.misc.file_utils.find_files_in_dir among them, which only forced the builder package into library loading. The circular_dependency_error validation error type, which only the spec layer's pipe sorter raised, leaves the error_type registry and the API server's OpenAPI schema.
  • The Pipelex Gateway backend is gone from the runtime (Breaking): pipelex_gateway leaves the shipped backends.toml, its backends/pipelex_gateway.toml override file and the generated pipelex_gateway_models*.md references leave the kit, the all_pipelex_gateway routing profile is gone, and the pipelex-gateway provider plugin is deleted along with its gateway_* SDKs, its error classes and their docs pages. A backends.toml that still enables a [pipelex_gateway] table, as the previous release's kit did, is refused at boot, because an enabled backend whose file declares no model is now an error rather than a backend every routed model silently goes missing from: disable or remove the table, and move a routing profile naming it, the previous default all_pipelex_gateway included, to another backend. The shipped default routing profile is now all_enabled_backends, which needs no Pipelex account: it sends each model to the first enabled backend that serves it, in the order its fallback_order lists. pipelex init pre-selects OpenAI, whose one key serves every default language-model and image-generation tier of the shipped model deck, and no longer sets all_pipelex_gateway when several backends are chosen; pipelex-agent init given no backend list keeps the template's routing profile rather than demanding a primary_backend. The pipelex/pipelex-api image enables openai in its place and boots on OPENAI_API_KEY, which serves every default language-model and image-generation tier of its deck. Every bring-your-own-keys backend is untouched.
  • The Gateway terms of service and the first-run check are gone (Breaking): GatewayTermsNotAcceptedError, the [agreement] section of pipelex_service.toml, pipelex init agreement and the pipelex-agent accept-gateway-terms command are removed, and pipelex-agent init no longer reads accept_gateway_terms from its config. The check that stopped a live run on a Pipelex-managed backend until inference setup had been recorded is removed as well, with InferenceSetupRequiredError, its CLI handling and IntegrationMode.requires_terms_acceptance, so a server, a container or a test suite boots with no setup recorded at all.
  • The Pipelex-owned telemetry stream is gone (Breaking): the runtime no longer reports to Pipelex's PostHog on the Gateway's behalf, so GatewayApiKeyMissingError, GatewayDoNotTrackConflictError, GatewayTelemetryManagerInjectedError, TelemetryManagerAbstract.is_pipelex_telemetry_enabled, IntegrationMode.is_test_harness and the maintainer-only [pipelex_gateway] section of telemetry.toml (with its is_pipelex_gateway_portkey_* knobs) are removed; TelemetryFactory.make_telemetry_manager and TelemetryManager take only the user's telemetry_config. The user's own opt-in telemetry under [custom_posthog], [langfuse] and [[otlp]] is untouched. Migration: run pipelex migrate; ledger entry telemetry-config@3 deletes the [pipelex_gateway] table from every telemetry.toml and telemetry_*.toml file in ~/.pipelex/ and in each project .pipelex/, keeping one timestamped backup per file. Nothing else needs deciding, since the section only ever configured the stream that no longer exists.
  • pipelex login is gone (Breaking): it wrote a PIPELEX_GATEWAY_API_KEY that nothing reads any more, and it also leaves _CORE_COMMAND_ORDER and the setup-command set that skips the readiness check — an order list naming a command the CLI does not register makes pipelex --help itself exit non-zero. The credential flow for the hosted service is rebuilt separately.
  • The check-gateway-models and update-gateway-models dev commands are gone, with their make ugm / make cgm aliases and the ticc config-coverage target that ran the Gateway's Portkey configs.
  • The runtime no longer downloads a remote config, and the hosted-only inference backend is no longer shipped (Breaking): the boot fetches nothing, so PIPELEX_REMOTE_CONFIG_URL, the ~/.pipelex/cache/remote_config.json cache, the cache priming in pipelex init and pipelex-agent init, the remote fetch in pipelex doctor and make regenerate-test-models, and the RemoteConfigFetchError, RemoteConfigValidationError, RemoteConfigUnavailableError, GatewayUnknownModelError and GatewayConfigMergeError classes are gone, with the warnings array the agent CLI added to a success envelope for a stale cache. Every backend now reads its model specs from its own file under inference/backends/, so model_specs_section is no longer a backend setting, and the kit no longer ships the hosted-only backend's backends.toml table, its file under inference/backends/ or the routing profile that sent every model to it; a project config that still declares them keeps booting while that backend is disabled, since a disabled backend is skipped and only the active routing profile loads. An enabled backend whose backends.toml table still carries model_specs_section is refused at boot, naming the key: list its models in its backends/<name>.toml and remove the key, or disable it. pipelex_service.toml is retired with its PipelexServiceConfig and PipelexServiceError classes: pipelex-agent init no longer writes it or reports inference_setup_completed, cache_primed or cache_priming_error, and a copy an earlier release left behind is ignored, by pipelex migrate too. The needs_model_specs argument of Pipelex.make, which only chose whether to fetch, is removed.

What's Changed

Full Changelog: v0.72.0...v0.73.0