Framework Release v1.6.0
- feat: batch accounting: the
batch_jobstable and its lifecycle store API (UpsertBatchJob,GetBatchJob,ListDueBatchJobs,ClaimBatchJob,MarkBatchJobAggregateLogWritten,MarkBatchJobGovernanceReported,CompleteBatchJob,MarkBatchJobUnpriceable,FailBatchJob) with runner fencing onclaimed_atanduser_id,team_id,customer_idandsource_log_idattribution so settlement carries the creating request's identity;batch_debugon logs; batch pricing in the model catalog (computeBatchTextCostwith catalog batch rates and a 0.5 default ratio,CalculateBatchCostDetailsForUsage,BatchResultsRequestrouted through the batch path); andpersistRecalcOutcomesshared by foreground and background recalculation (thanks @SahilChoudhary22!) (#5292, #5293, #6505) - feat: input/output/additional cost split: denormalized
input_cost,output_costandadditional_costcolumns on logs, carried through matviews, ClickHouse, the hybrid store, cost recalculation and the quota API, populated on fallback billing paths, with semantic cache cost folded into additional cost - feat: Bifrost overhead latency:
upstream_latencyandoverhead_latencycolumns on logs with avg, p90, p95 and p99 overhead aggregates inmv_logs_hourly, ClickHouse, Postgrespercentile_contand the Go-side SQLite/MySQL histograms, theoverhead_breakdowncolumn for the per-span self-time decomposition, andCompleteAndFlushTracehanding connectors a copy of the trace without breakdown spans unless the plugin implementsOverheadSpanConsumer(#5533, #5534, #6388, #6389) - feat:
video_edit_inputcolumn on logs for the new video edit request type (#6270) - feat: new pricing columns and cost computation: megapixel-tier image fields (
output_cost_per_image_above_{4,8,16,32,64}_megapixels) with a unified pixel-count tier ladder incomputeImageOutputCost; per-size and joint size+quality image rates for 1024x1536 and 1536x1024 with a priority chain of size+quality, quality-only, size-only, then flat per-image rate, andparseImageDimensionsso portrait and landscape sizes with equal pixel counts price correctly;input_cost_per_queryfor rerank; andultrafastservice tier rates (#6082, #6379, #6396) - feat: notifications store:
TableNotification,NotificationStore,CreateNotificationandListNotificationswith JSON-serialized role IDs (#6207) - feat:
gencachegeneration-stamped memo cache, withGetProvidersForModelandGetModelsForProvidermemoized until any backing store advances its write generation (#5641, #6224) - feat:
DimensionScopeinqueryscopeandapplyDimensionCeilingon rankings, histograms and key-pair queries so grouped analytics only expose organisation ids the caller may see;getAvailableFilterDatano longer passes an empty id list to the redaction lookups, which returned every row (#6262) - feat:
ObservabilityLimits(per-plugin semaphore size and inject timeout) with context-boundedInjectcalls andDeadlineExceededaccounting (#6341) - feat:
GetSharedOauthTokensByConfigIDsbatch lookup on the config store so shared-OAuth MCP clients projectneeds_reauthwhen their token row is invalidated (#6429) - feat:
mcp_library_sync_interval: 0disables MCP library sync (MCPLibrarySyncDisabled),file://catalog URLs resolve throughdatasheet.FilePathFromURLwithout retry backoff, andResolveFrameworkPricingConfigno longer backfills a zero interval (#6195) - feat:
ReloadComplexityAnalyzerConfigonServerCallbacksfor the routing handler (#6146) - feat:
service_tiercopied from the processed stream response intoStreamAccumulatorResultinProcessStreamingChunk(#6236) - fix: resolve runtime provider
together(and variants such astogether_ai, matched withstrings.Contains) to the datasheet identity for catalog reads and price configured aliases throughAliasConfig.ModelName, thenModelID, then the alias key (thanks @dani29!) (#6257, #6320) - fix: escape every RediSearch special character in TAG query values in the Redis vector store, iterating bytes rather than runes (thanks @AdityaPainuli!) (#5351)
- fix: redact sensitive and identity-aware-proxy request headers at
SetTraceRequestHeadersso every connector (Datadog, OTEL, BigQuery, Kafka, Pub/Sub) receives redacted values (#6371) - fix:
supports_none_reasoning_effortdatasheet flag wired throughextractSupportedParamsanddropUnsupportedParamsso models that reason by default getreasoning.effort: "none"instead of losingreasoning(#6293) - fix: reject negative
tool_sync_intervalatUpdateMCPClientConfigand on config file load, treat the value as whole minutes, and carry the stored global interval intoGetMCPConfig(#6409, #6502) - perf:
spanHandlecarries the*Spanpointer soEndSpan,SetAttributeandSpanFromHandleskip the per-call trace and span scan, alongside bulk span attribute writes and reusable delivery timers in the tracing hot path (#5657, #5956, #6387) - chore: remove legacy
gen_ai.*attribute emission from the tracer in favor of the canonicalbifrost.*keys (#6403) - chore: close leaked Postgres pools and a stale hardcoded date in logstore tests (#6351)
- chore: build with Go 1.26.6 (#6269)
- chore: upgraded core to v1.8.0
Five of the six logstore migrations alter logs, the highest-insert table in Bifrost, and the hourly matview is rebuilt against the full table on the first boot after upgrading. Schedule the upgrade for a low-traffic period, or expect elevated log-write latency while the migrations run.
Installation
go get github.com/maximhq/bifrost/framework@v1.6.0This release was automatically created and uses core version: v1.8.3