chore(deps): update all non-major dependencies - #153
Conversation
|
/gcbrun |
1867db6 to
45441f1
Compare
|
/gcbrun |
45441f1 to
bdf2afa
Compare
|
/gcbrun |
bdf2afa to
f4b77ba
Compare
ℹ️ Artifact update noticeFile name: core/go.modIn order to perform the update(s) described in the table above, Renovate ran the
Due to Go's usage of Minimal Version Selection (MVS), these packages have been updated to the minimum version available, so will still abide by Details:
File name: tbadk/go.modIn order to perform the update(s) described in the table above, Renovate ran the
Due to Go's usage of Minimal Version Selection (MVS), these packages have been updated to the minimum version available, so will still abide by Details:
File name: tbgenkit/go.modIn order to perform the update(s) described in the table above, Renovate ran the
Due to Go's usage of Minimal Version Selection (MVS), these packages have been updated to the minimum version available, so will still abide by Details:
|
|
/gcbrun |
f4b77ba to
f117992
Compare
|
/gcbrun |
f117992 to
5113304
Compare
|
/gcbrun |
5113304 to
31068af
Compare
|
/gcbrun |
|
/gcbrun |
27 similar comments
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
|
/gcbrun |
This PR contains the following updates:
v1.16.0→v1.21.0v1.61.3→v1.67.0v1.10.0→v1.13.1v1.11.1→v1.12.1v2.0.0→v2.3.0v0.272.0→v0.297.0v0.279.0→v0.297.0v1.57.0→v1.71.0Release Notes
googleapis/google-cloud-go (cloud.google.com/go/secretmanager)
v1.21.0: datastore: v1.21.0Features
Bug Fixes
v1.20.0: datastore: v1.20.0Features
Bug Fixes
v1.19.0: datastore: v1.19.0Features
v1.18.0: datastore: v1.18.0Features
Bug Fixes
v1.17.0: datastore: v1.17.0Features
firebase/genkit (github.com/firebase/genkit/go)
v1.13.1: Genkit Go v1.13.1v1.13.0 is retracted. It ships the A2UI preview at
github.com/firebase/genkit/go/plugins/a2ui, while its release notes describegithub.com/firebase/genkit/go/plugins/a2ui/exp. This release moves the package to the documented path and records the retraction ingo.mod, sogo get github.com/firebase/genkit/go@latestresolves here and version listings hide v1.13.0. Everything else in the v1.13.0 notes applies unchanged.What's Changed
a2ui/expwhile it is in preview by @apascal07 in genkit-ai#6275Full Changelog: genkit-ai/genkit@go/v1.13.0...go/v1.13.1
v1.13.0: Genkit Go v1.13.0Progress survives failure. A generate call that fails or is stopped returns the conversation up to its last completed tool round, beside the classified error. An agent commits that conversation as a
failedorabortedsnapshot, and both resume. Sub-agents run in the background, get waited on or aborted, and pick up where they left off from any process holding the task ID. Beyond that, the experimental A2UI plugin lets an agent stream interactive UI to a browser.Generate returns what it finished, even on failure
Once the request has resolved,
Generatereturns the partial response beside its error:ai.FinishReasonFailedmeans something broke: a model call or a tool.ai.FinishReasonAbortedmeans the caller stopped it: a cancelled context, an expired deadline, or a limit such asWithMaxTurns.resp.Erroris the classified form ofFinishMessage, so a response read back from a trace or a persisted turn still says why it stopped.History()ends at a turn seam: the completed rounds of model message plus every tool response, and nothing from the turn that failed. No provider accepts a conversation ending in an unanswered tool request, so a failed tool drops its whole round, including the model message that opened it. Send the history back to retry the failed step without repeating the tool calls that succeeded. Text streamed before the failure already reached your callback.GenerateStreamandGenerateDataStreamyield the same partial beside their error,Doneand carryingResponse.Values survive the action boundary
Action.Runzeroed its output on any error, the JSON surface marshaled nothing, and the trace recorded output only on success. All three now carry whatever the function returned: a flow that returns a value beside an error hands it to its caller, an output that failed schema validation comes back with its error, and a failed generate's conversation shows up in the Dev UI trace.A blocked response is an error, not a schema mismatch
GenerateData,GenerateDataStream,DataPrompt.Execute, andDataPrompt.ExecuteStreamparsed a safety-blocked response and reportedExpected: object, given: null. They now returnai.ErrGenerationBlocked, a FAILED_PRECONDITION subtype, with the response alongside:Interrupts, tool requests, and empty responses keep a nil output and a nil error. Streamed chunks parse before any finish reason exists, so the terminal value settles the call.
Generatestill hands a blocked response back as a value.Resume any turn, whether it succeeded, failed, or was aborted
Agents in
ai/expbuild on the partial. A failed turn commits the tool rounds it completed as afailedsnapshot carrying the error, and resume accepts it:Re-attempt with an input that has no payload. The turn runs again on the committed messages, so the tool calls that succeeded are not repeated:
A new message works on that snapshot too, and rewinding past the failure is a resume from the previous snapshot ID. Whether to retry is your call: the runtime records the status and never judges it.
Every failure past the model call commits. A turn rejected before it reached the model rolls back, and the resume point stays the turn before.
AgentOutput.SnapshotIDnames the latest resumable state either way. Custom agents opt in by returning aTurnResultbeside the error; a bare error still discards the turn. Without a store, the failed output'sStatecarries the same resume point inline.The turn-end snapshot now writes on a context that outlives the turn's own, so a turn cancelled from outside still lands its snapshot.
abortedmeans the caller stopped itabortednow covers every way a caller ends a run, andfailedevery way one breaks. A cancelled context, a closed transport, an expired deadline, a limit such asai.WithMaxTurns, orAborton a detached run: each lands anabortedsnapshot holding the turns that finished, and each resumes like afailedone.Runreturns that snapshot's output beside the error instead ofnil:The turn in flight is discarded whole. A tool that ran inside it runs again on resume.
Wind-down has its own status:
abortingA detached run reaches
abortedin two writes: the flip that stops the work, and the finalize that stamps the state on. The row between them wasabortedwith no state, shaped aspending. It is nowaborting, a shared wire status. The worker keeps heartbeating through its wind-down for up to five minutes, so a wedged drain reads asexpiredinstead of hanging forever.WaitForSnapshotwaits through the window, and theabortcompanion answersabortingwhere it answeredaborted.The
basic-agentsCLI shows all of it: a broken or stopped turn is offered like any other, and an empty line re-runs the turn it left unanswered.Sub-agents run in the background and pick up where they left off
Reach any agent by name with
AgentHandleAgentHandleis the caller-side view of an agent for code that knows it only by name (orchestrators, middleware, tools), with custom state asjson.RawMessage. One lookup replaces the action lookup, theBidiActionassertion, and the JSON marshaling:RunDetachedis the one-shot counterpart ofAgentConnection.Detach. ADetachedTaskis a snapshot ID plus the agent that minted it, so any process can rehydrate it:POST /agents/{name}/waitForSnapshotis the blocking counterpart ofgetSnapshot: one request follows a detached run to completion, and a trace carries one span per wait instead of one per tick. Handle calls are shaped like a remote client's: the state transform applies, a stale pending row reads asexpired, and errors match by status name, so an HTTP-backed handle is a second implementation rather than a second surface.GetSnapshot,GetLatestSnapshot, andPolltakeaix.WithMetadataOnly(), which returns status, finish reason, parent, and timestamps without the conversation. Stores that implement the optionalSnapshotMetadataReader(the bundled local stores and Firestore) skip loading the history; Firestore answers with one document read. Other stores keep compiling and are read in full.Delegate without waiting
With
Asyncset on theAgentsmiddleware, every delegation tool takes abackgroundflag that returns a task ID at once, and three shared tools control what was launched:The middleware keeps no task registry. The task ID rides in the tool result, so the orchestrator's history is the registry, and an orchestrator rebuilt from that history can still collect.
wait_for_background_tasksfollows tasks throughwaitForSnapshot, so each is reported the moment it settles;timeoutSecondsturns a slow task into an interim answer, andwaitFor: "first"turns the join into a race. Abort never loses an answer: a finished task reports its result, and a live one reportsabortingwhile it saves its progress. The optionalnameon a delegation is a label echoed beside thetaskId.The
basic-agentssample gained an incident commander built on this: two investigators launched in the background, a status update posted while they run, and results collected with a short timeout first.Continue a delegation instead of restarting it
Every settled server-managed delegation returns a
taskIdnaming its last committed snapshot, andcontinue_taskspends it:A failed or aborted task continues from its last saved progress: empty
instructionsre-attempt the committed turn, non-empty ones steer the retry. A completed task takes follow-up instructions inside the sub-agent's own session. An expired task is abort-fenced, then continued from its parent snapshot. An interrupted task is refused, since continuing it would mean answering the interrupt. The tool registers only when a configured sub-agent can leave a handle behind.Stream interactive UI with A2UI
The new preview
a2uiplugin adds A2UI support: an agent streams interactive surfaces that a client renders incrementally. The integration is one middleware:Surfacesinjects the catalog's capabilities into the system prompt, extractsa2uifenced blocks from streamed chunks and the final message, validates them against the catalog, and rewrites them into data parts with mime typeapplication/a2ui+json. The envelopes are byte-compatible with the JS and Dart plugins and the@a2ui/*renderers. Register your own components withLoadCatalogorLoadCatalogFileand reference them byCatalogID.Validate(warn,strict,off) checks structure and component names, not prop values: treat rendered surfaces as untrusted model output.Register
&a2ui.A2UI{}as a plugin to reference the middleware by name from.promptfiles and the Dev UI.go/samples/basic-middleware/a2uiserves the endpoint the browser frontend injs/testapps/a2ui/webexpects, so the existing web UI works unchanged against Go.Smaller things worth knowing
OPENAI_API_KEY,OPENAI_ORG_ID, andOPENAI_PROJECT_IDfor every client it builds, so requests to DeepSeek or xAI carriedOpenAI-OrganizationandOpenAI-Project, and the Anthropic compat plugin sent the OpenAI key as its bearer token whenANTHROPIC_API_KEYwas unset.Initnow clears all three; theopenaiplugin sets them itself.WithCacheTTLandWithCacheNamecancelled each other. The prefix now leaves the wire once cached, a matching cache is reused, and the markers compose:ai.NewUserTextMessage(doc).WithCacheTTL(3600).WithCacheName(known). Gemini 2.5 and newer cache repeated prefixes implicitly at no storage charge, so the explicit path earns its cost only when the hit must be guaranteed.{name}/checkand{name}/cancel, the form JS, Python, and the Dev UI use, so the Dev UI's background-task panel works against Go background models..promptfiles sharing a middleware leaked into each other, and concurrent dispatch raced. Prototypes now register by value;*Retrystill satisfiesai.Middleware.Statusesfields ofRetryandFallbackoffer the status names as an enum.status.Names()returns them in gRPC code order.description=If true, descend into subdirectories.reached the model asIf true. Descriptions moved tojsonschema_description, and a schema test rejectsdescription=inside ajsonschematag.Sendno longer reportsCANCELLEDfor a teardown that was the action finishing, and a committed result is no longer replaced by the caller's deadline, which is what keeps a detached agent handoff from reading as a failed launch.Newfailure keeps its classification instead of collapsing to INVALID_ARGUMENT.ContentandMetadataincluded.generatespan records the messages that turn sent, built after theWrapGeneratehooks. The duplicate turn-zerogeneratespan is gone, each turn gets its own*ModelRequest, a resume keepsWithStepName, and util actions keept:actionin their trace paths.googlegenaidefaults to a plain HTTP client, like every other plugin and runtime, which removes the extra HTTP spans from the Dev UI. SetHTTPClientwith anotelhttptransport to opt back in.requirescapability gate. Go declaresresumable-failuresandresumable-abortsand runs every case; JS and Python skip those eight until they adopt the behavior.continue_task. The godoc examples forgenkit.Handler,genkit.HandlerFunc,DefineStreamingFlow, and the telemetry plugins compile when pasted.Before you upgrade
No signatures change. Each of these is a value or a status that now arrives where it used to be absent.
GenerateTextreturns the partial's text beside a post-processing error where it returned"".ai.ErrGenerationBlockedfor a blocked response where they returned a schema error, and a stringOutfor a response with nothing to extract leaves the text onresp.Text().ai/exp: resume acceptsfailedandabortedsnapshots;AgentInput{}runs a turn on a session that has messages; a turn ended by a cancelled context, an expired deadline, or a caller-set limit writesabortedwhere it wrotefailed; theabortcompanion answersabortingfor a live detached row; and a custom agent returning a non-nilTurnResultbeside an error now commits that turn./check-operation/{model}keys no longer resolve.Operation.Actionstill carries the start key.googlegenaino longer installs an OpenTelemetry HTTP transport by default.generatespan carries the same messages as the model span inside it, so tool-loop trace payload roughly doubles; dropping the duplicate turn-zero span offsets part of that.v1.12.0: Genkit Go v1.12.0xAI, DeepSeek, DashScope, Kimi, Z.ai, and OpenRouter join the OpenAI-compatible family, all of it rebuilt on typed per-provider configs that the framework validates before a request is billed. Failures now carry a status from the line that raised them through the retry middleware to the HTTP response, and provider SDK errors arrive already classified. Logs attach to the span that produced them. Prompt content functions are typed against the prompt's own input. Options that used to reject a repeat now merge.
Six providers join the OpenAI-compatible core
Genkit Go ships plugins for xAI, DeepSeek, DashScope (Qwen), Kimi, Z.ai (GLM), and OpenRouter. They sit beside
openaiand the OpenAI-compatibleanthropicplugin on a rebuiltcompat_oaicore.Each of the six declares a
ChatConfigcovering exactly the fields its provider documents: Kimi's K-series takes no temperature, Z.ai caps it at 1, DeepSeek carries auser_idthat partitions its context cache. The plugin advertises the JSON schema inferred from that struct and the framework enforces it at the action boundary, so an out-of-range value fails before the request is billed, and the Dev UI renders the same schema as a form.OpenRouter reaches the rest
OpenRouter fronts hundreds of models from dozens of vendors. The plugin curates nothing: you name a model, and the ID keeps its upstream vendor prefix, which puts two slashes in an action name such as
openrouter/openai/gpt-5. The gateway controls are typed at the call site. Choose which providers may serve the request, chain fallback models, set reasoning effort.The family reads a provider's non-standard reasoning field,
reasoning_contentfirst andreasoningsecond, back as a Genkit reasoning part, soresp.Reasoning()covers DeepSeek, Kimi, and OpenRouter alike. A gateway that reports what it charged puts the figure under thecostkey ofUsage.Custom. Test for the key rather than a nonzero value: a free-tier request is priced at an explicit zero.Google and Claude, closer to the metal
Vertex AI Express Mode authenticates with an API key alone: no project, no location, no ADC. Both Google backends take
BaseURL,Headers, andHTTPClient, so a proxy or a custom transport is a struct field, andGoogleAItakesAPIVersionas well.Client()hands back the genai SDK client for Files, Caches, Batches, and Tunings. When a 429 names its own backoff,RetryDelayreads it.On the native Claude plugin,
Optscarries anthropic-sdk-go request options into the client: retries, timeouts, middleware, and the SDK's Bedrock and Vertex routing helpers.ModelRefbinds a*anthropic.MessageNewParamsto a model ID, so thinking, effort, and server-side tools are typed at the call site.Every model plugin, Google and Claude included, takes a
Modelsmap keyed by model ID that overrides the capabilities the plugin resolves. Fields left at zero keep what the plugin already knows, so one entry describes a model released after the plugin without forking it.Classify a failure once, and it stays classified
Genkit has one error type and one status vocabulary:
InvalidArgument,NotFound,PermissionDenied,Unauthenticated,ResourceExhausted,Unavailable,DeadlineExceeded,Internal, and nine more. The names follow the Google API error model and mean the same thing in the JS and Python runtimes. Classify a failure at the point where you know what it is.Subtypederives a sentinel that keeps its parent status.Errorfbuilds a message for your logs,PublicErrorfmarks one safe to hand a caller. Adding context with%wchanges nothing else: the sentinel, the status, and the public message all survive the trip up the stack. No re-wrapping, no matching on message text.Code you did not write reads the classification
Serve the flow with
genkit.Handlerand the response code comes from the classification. The message only leaves the process when you built it withPublicErrorf.Everything else is redacted to the generic label for its status, and the full text goes to the server log. Set
GENKIT_ENV=devand the real message comes back instead; the code is the same either way.The reach of that classification is what changed. Every plugin now classifies what its provider SDK returns, so a 401 from Anthropic or a 429 from Gemini arrives already carrying
UnauthenticatedorResourceExhausted. Retry and Fallback have always read a classification and disagreed on purpose:Retryreissues aResourceExhaustedorUnavailablecall, leaves anInvalidArgumentalone, and retries an unclassified error because a dial timeout deserves another attempt, whileFallbackpropagates an unclassified error rather than spending a second billed model on it. What is different is that provider failures now reach them classified instead of opaque.Logs that land on the trace
Every
core/loggercall takes a context first and carries the active span, so a line written inside a flow attaches to that run instead of scrolling past in stdout. Attributes are structured, and a status classification is just one more attribute.Genkit logs through that same path, so the stream is full before you write a line of your own: span start and finish with state and duration, resolved generate requests, each model turn with its finish reason and token counts, tool batches, and middleware hooks with their duration and whether they short-circuited.
Console verbosity and span correlation are separate knobs. Quiet the terminal and the debug narrative still reaches the trace. Attributes bound to a context flow downstream with no extra plumbing.
Strings, ints, and bools travel natively; other values render to text. Per-span log inspection arrives in the Developer UI shortly, listing these records beside the trace they belong to.
Fill a prompt's slots from one typed input
A prompt's content functions are generic over its input type.
WithSystemFn,WithMessagesFn, andWithPromptFntakefunc(context.Context, In) (...), so the compiler checks each one against the typeWithInputTypedeclares, whether the call arrives from Go, from the Dev UI, or over HTTP. The system and user prompt slots also take[]*ai.Part, static throughWithSystemPartsandWithPromptPartsor computed throughWithSystemPartsFnandWithPromptPartsFn.WithDocsFnresolves context documents from that same input, so retrieval lives in the prompt definition instead of at each call site.Whatever a function returns is sent verbatim. Only
WithSystem,WithPrompt, andWithMessagesTemplatecompile as templates, so a customer question carrying{{#if}}reaches the model as written.Where the conversation lands
The prompt places the messages passed to
Execute, by one of three rules:WithMessagesorWithMessagesFn: the prompt owns them, and reads them withai.HistoryFromContextto trim, summarize, or reorder before returning them. A prompt that carries few-shot examples this way receives the caller's history only when it asks for it.WithMessagesTemplate: they land at{{history}}, or, with no marker, just before the template's final user turn.ai.NewHistoryContextis the writing half of that pair, for code that drivesPrompt.RenderandGenerateWithRequestby hand. Scope it to the render call, never the generate call.Documents follow a related rule: documents passed to
Executereplace the prompt's own and suppressWithDocsFn, so the retriever is never called for a result that would be discarded.Options that compose instead of collide
Passing an option twice used to fail the call with
INVALID_ARGUMENT. Options merge instead, left to right, each by what it means, and applying them cannot fail.Collections accumulate across repeats: tools, middleware, messages, documents, resources. Single-value slots take the last value set: model, config, system, prompt, output schema.
That is what makes a helper worth writing. Hand back a slice of options and let the caller build on it.
The caller extends what should stack and overrides what should not, without knowing which options the helper already set.
Two of those slots are shared by four options each.
WithSystem,WithSystemParts,WithSystemFn, andWithSystemPartsFnall fill the system message, so the last one set replaces the others rather than adding to them.WithPrompt,WithPromptParts,WithPromptFn, andWithPromptPartsFnwork the same way on the user message. ThePartsvariants build those messages from multimodal parts instead of a string.One combination is refused instead of merged.
ai.WithMessagesTemplatelays out the whole conversation as a template, down to where{{history}}puts the caller's, so messages passed beside it have no position relative to it. HandingDefinePromptboth panics at the call site.Rows arrive once in a JSONL stream
The JSONL handler hands over the rows that completed since the previous chunk, including a row that finished before its trailing newline arrived. Append every chunk and each completed row lands once, with no dedupe on the caller's side. A trailing row that is still half written is the exception: it arrives as a partial and fills in over later chunks.
Config arrives typed and already validated
Build a model, embedder, retriever, or evaluator with a constructor that carries a
Configtype parameter. Genkit derives the config's JSON schema from the Go type, validates every request against it, and hands your function a deserialized value. A struct from an application, a pointer to it, and JSON from the Dev UI all land as the same typed value.*ai.ModelActionsatisfiesapi.Action, so a plugin hands it back fromResolveAction,ListActions, orInitwith no assertion. A request carrying a key the schema does not declare fails at the action boundary withconfig: Additional property bogus is not allowed, before the provider is billed. A plugin whose wire contract differs from the reflected one setsModelOptions.ConfigSchemaand keeps the typed parameter.Applications reach the same constructors through
genkit, defined and registered in one call:Two audiences, two shapes. A constructor takes identity positionally, one options struct for every descriptor slot, and the implementation function last, so an optional hook lands as a field instead of a signature break. A caller composes variadic
With*options. The same shape runs one level down:core.NewActionOf,NewStreamingActionOf,NewBidiActionOf, andNewBackgroundActionOftake the action type first and a singlecore.ActionOptionscovering input, output, and stream schemas.DefineSchemasForregisters a batch of Go types under their type names, which prompt frontmatter and generate calls then reference by name:Each name belongs to one type, so run this at startup.
Seventeen samples, one standard
go/samples/basic*is seventeen programs written to one standard. Each opens with a package comment that teaches the concept, names every flow, and gives three ways to run it:go run .,genkit start -- go run .for the Developer UI, and a workingcurlper flow. Inputs are structs whosejsonschematags carry a description and a default, so the Developer UI renders a pre-filled form and any flow runs from a browser.Where to look for what:
basic: the two flow shapes, one returning its answer whole and one forwarding the model's chunks.basic-structuredandbasic-formats: typed output throughGenerateDataandGenerateDataStream, then the formats underneath it.jsonstreams a growing value,jsonlhands over each finished row once,enumconstrains the answer to one label.basic-prompts: every prompt defined twice, inline withDefinePromptand as a.promptfile looked up by name, so the pair shows what moves out of code.basic-prompt-contentfills all four content slots from one typed input.basic-media: describe a picture, edit one, generate one, and animate one through a polling background model.basic-tools: a multipart tool that answers with a*Rolloutand an attached latency chart, which reaches the model and the Developer UI both.basic-tool-interrupts: human in the loop. A tool pauses a transfer for approval, and a second turn restarts it with the answer attached.basic-middleware:Retrywrapped aroundFallbackover a deliberately broken model id;Filesystem, whose four file tools are confined toRootDirbyos.Root; andSkills, where the model loads aSKILL.mdbody on demand.basic-agents: six agents in six styles behind one CLI, snapshotting to disk.basic-agents-serverserves agents over plain HTTP, one holding session state on the server and one handing it back to the client.basic-errors: classify once withstatus.Errorf, add context with%w, branch witherrors.Is, and watch the HTTP boundary redact the one failure nobody classified.basic-durable-streaming-exp: drop the connection mid-run, reconnect with the stream ID, and read the buffered chunks before live ones resume.Tools and interrupts ship twice, once against the stable API and once against the in-preview API in
genkit/exp. Same rollout, same approval, sodiffbetween the pair is the lesson.Smaller things worth knowing
genkit.DefineFormatsis found whenai.WithOutputFormatnames it.tool_resultblocks.resp.History().modelgarden.Mistral.The documentation caught up
Every Go page on genkit.dev was read against this release rather than patched around it. Snippets compile. Deprecated helpers no longer appear as the primary way to do anything. Output formats, multipart tools, typed prompt content, and the status vocabulary are documented where a reader looks for them instead of only in godoc, and every provider in the OpenAI-compatible family has a page, including the four that never had one.
The sample suite is linked from the sections that teach each concept, so the path from reading about a feature to running it is one click.
v1.11.0: Genkit Go v1.11.0What's Changed
New Contributors
Full Changelog: genkit-ai/genkit@go/v1.10.0...go/v1.11.0
stretchr/testify (github.com/stretchr/testify)
v1.12.1Compare Source
This is the first release which has the minimum dependencies practical in testify v1. The last remaining dependencies are github.com/stretchr/objx which itself has no dependencies, and go.yaml.in/yaml/v3. Removing objx would require v2, it cann
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.