Repository navigation
v0.73.0
[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 toPluginRegistrar.add_service_error_codes.classify_inference_errorconsults the booted plugins' codes ahead of the HTTP status ladder andrender_inference_errorrenders the matched entry's advice; a code two plugins contribute fails the boot withDuplicateServiceErrorCodeError, and one the runtime classifies itself withReservedServiceErrorCodeError. - Request extras on the Anthropic worker:
AnthropicLLMWorkertakes an optionalextras_factory, theBackendExtrasFactorythe OpenAI-substrate workers already take, whose headers and body additions join every text and structured call, andAnthropicFactory.make_anthropic_clienttakes ansdk_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:
OpenAICompletionsImgGenWorkertakesfixed_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.mdnow 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, andparse_retry_after_secondsanderror_code_from_body_code_firstbecome public inpipelex.cogt.inference.error_classificationfor 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_factorysends 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 thesdkof its model specs, local overrides included; a model left onanthropickeeps answering, without those headers. - The gateway refusal families leave the core classifier (Breaking):
GatewayRequestLimit,GatewayUnresolvedReferenceandGatewayRoutingRefusal, the matching properties ofProviderErrorMetadataand fields ofClassificationResult, andMANAGED_GATEWAY_BACKEND_NAMESare removed; a gateway's own codes now reachClassificationResult.service_error_codethrough the plugin that contributes them, and Portkey'smodel_not_allowed_erroris read byProviderErrorMetadata.is_model_not_allowedandClassificationResult.is_model_not_allowed. Errors raised by the hosted-only provider plugin now report thetypeandtitleof their generic family, such asextract-job-failure-error, rather than pages and titles of their own. - The default extractors run on your own keys (Breaking):
@default-extract-documenttakes the first of Mistral OCR andpypdfium2-extract-pdfthat an enabled backend serves, and@default-extract-imageand@default-premiumtake Mistral OCR, where all three named Azure Document Intelligence, which no shipped backend serves any more. APipeExtractstep 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 managed3_extract_deck.tomltakes the new aliases withpipelex update.
Fixed
- A Manifold failure on the extract and search routes reports the service's own message:
extract_manifold_metadatatakes the message from the response body'serror.message, or else its top-levelmessage, so a refused key now readsPortkey Error: Invalid API Key. Error Code: 03rather than httpx'sClient 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 asMonthly 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
RuntimeBootprocess, because the fix-op applier, the file transaction and their errors moved frompipelex.pipelineto the new kernel-layerpipelex.fix_opspackage; importFixWriteConflictErrorandFixTransactionErrorfrompipelex.fix_ops.exceptions, and the applier and transaction frompipelex.fix_ops.applierandpipelex.fix_ops.file_transaction.
Removed
- The builder:
pipelex-agent concept,pipelex-agent pipe,pipelex build runnerandpipelex.builder(Breaking): the two agent commands that converted a JSON concept or pipe spec into MTHDS TOML, andpipelex build runner bundleandpipelex build runner method, which wrote a Python script running a pipe, are gone with the spec layer behind them,ConceptSpec,PipeSpec,PipelexBundleSpecand theConceptSpecError,PipeSpecErrorandPipelexBundleSpecBlueprintErrorclasses; write a method in MTHDS directly and check it withpipelex validate, and take a runner's typed structures frompipelex build structuresorpipelex codegen types --target python-structures. Thepipelex.builderpackage no longer exists: the modules the runtime still uses moved,pipelex.builder.conventionstopipelex.pipeline.default_file_names,pipelex.builder.operations.models_opstopipelex.cogt.models.model_listingandpipelex.builder.operations.inputs_opstopipelex.pipeline.inputs_template, and the others are deleted with the helpers only they used,force_include_dirsonpipelex.tools.misc.file_utils.find_files_in_diramong them, which only forced the builder package into library loading. Thecircular_dependency_errorvalidation error type, which only the spec layer's pipe sorter raised, leaves theerror_typeregistry and the API server's OpenAPI schema. - The Pipelex Gateway backend is gone from the runtime (Breaking):
pipelex_gatewayleaves the shippedbackends.toml, itsbackends/pipelex_gateway.tomloverride file and the generatedpipelex_gateway_models*.mdreferences leave the kit, theall_pipelex_gatewayrouting profile is gone, and thepipelex-gatewayprovider plugin is deleted along with itsgateway_*SDKs, its error classes and their docs pages. Abackends.tomlthat 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 defaultall_pipelex_gatewayincluded, to another backend. The shipped default routing profile is nowall_enabled_backends, which needs no Pipelex account: it sends each model to the first enabled backend that serves it, in the order itsfallback_orderlists.pipelex initpre-selects OpenAI, whose one key serves every default language-model and image-generation tier of the shipped model deck, and no longer setsall_pipelex_gatewaywhen several backends are chosen;pipelex-agent initgiven no backend list keeps the template's routing profile rather than demanding aprimary_backend. Thepipelex/pipelex-apiimage enablesopenaiin its place and boots onOPENAI_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 ofpipelex_service.toml,pipelex init agreementand thepipelex-agent accept-gateway-termscommand are removed, andpipelex-agent initno longer readsaccept_gateway_termsfrom its config. The check that stopped a live run on a Pipelex-managed backend until inference setup had been recorded is removed as well, withInferenceSetupRequiredError, its CLI handling andIntegrationMode.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_harnessand the maintainer-only[pipelex_gateway]section oftelemetry.toml(with itsis_pipelex_gateway_portkey_*knobs) are removed;TelemetryFactory.make_telemetry_managerandTelemetryManagertake only the user'stelemetry_config. The user's own opt-in telemetry under[custom_posthog],[langfuse]and[[otlp]]is untouched. Migration: runpipelex migrate; ledger entrytelemetry-config@3deletes the[pipelex_gateway]table from everytelemetry.tomlandtelemetry_*.tomlfile 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 loginis gone (Breaking): it wrote aPIPELEX_GATEWAY_API_KEYthat nothing reads any more, and it also leaves_CORE_COMMAND_ORDERand the setup-command set that skips the readiness check — an order list naming a command the CLI does not register makespipelex --helpitself exit non-zero. The credential flow for the hosted service is rebuilt separately.- The
check-gateway-modelsandupdate-gateway-modelsdev commands are gone, with theirmake ugm/make cgmaliases and theticcconfig-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.jsoncache, the cache priming inpipelex initandpipelex-agent init, the remote fetch inpipelex doctorandmake regenerate-test-models, and theRemoteConfigFetchError,RemoteConfigValidationError,RemoteConfigUnavailableError,GatewayUnknownModelErrorandGatewayConfigMergeErrorclasses are gone, with thewarningsarray the agent CLI added to a success envelope for a stale cache. Every backend now reads its model specs from its own file underinference/backends/, somodel_specs_sectionis no longer a backend setting, and the kit no longer ships the hosted-only backend'sbackends.tomltable, its file underinference/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 whosebackends.tomltable still carriesmodel_specs_sectionis refused at boot, naming the key: list its models in itsbackends/<name>.tomland remove the key, or disable it.pipelex_service.tomlis retired with itsPipelexServiceConfigandPipelexServiceErrorclasses:pipelex-agent initno longer writes it or reportsinference_setup_completed,cache_primedorcache_priming_error, and a copy an earlier release left behind is ignored, bypipelex migratetoo. Theneeds_model_specsargument ofPipelex.make, which only chose whether to fetch, is removed.
What's Changed
- changelog/v0.72.0-highlights · L-261004-e1e52c by @lchoquel in #1330
- refactor/Delete-builder · L-261004-89a668 by @lchoquel in #1331
- feature/Drop-gateway-backend · L-260918-08feba by @thomashebrard in #1226
- feature/Manifold-generic-seams · L-261004-becac9 by @lchoquel in #1332
- feature/Stale-replay-breaks-kernel · L-261004-1961f1 by @lchoquel in #1333
- feature/Drop-remote-config · L-261004-75f0ec by @lchoquel in #1334
- feature/Judgment-state-shapes-live · L-261004-601691 by @lchoquel in #1335
- fix/Native-client-gateway-message · L-261004-34f05e by @lchoquel in #1336
- Release v0.73.0 by @lchoquel in #1338
Full Changelog: v0.72.0...v0.73.0